diff --git a/.github/workflows/rust-rheon.yml b/.github/workflows/rust-rheon.yml index 27107137..e691ccbf 100644 --- a/.github/workflows/rust-rheon.yml +++ b/.github/workflows/rust-rheon.yml @@ -72,7 +72,9 @@ jobs: feature-contracts: name: Feature contracts (${{ matrix.mode }}) runs-on: ubuntu-24.04 - timeout-minutes: 30 + # Full ordinary desktop contracts exceeded the prior outer job budget. + # Test commands, per-case bounds and all acceptance gates stay unchanged. + timeout-minutes: 60 env: CARGO_BUILD_JOBS: '1' strategy: diff --git a/Cargo.lock b/Cargo.lock index 2732e265..9cbe7236 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1896,6 +1896,36 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2502,6 +2532,8 @@ dependencies = [ "cap-std", "eframe", "gltf", + "num-rational", + "num-traits", "png", "rayon", "rusqlite", diff --git a/Cargo.toml b/Cargo.toml index 7d6846d8..a7d89eaf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -87,3 +87,8 @@ rusqlite = { version = "=0.37.0", features = ["bundled", "limits"] } name = "rheon-ai-compare" path = "src/bin/rheon-ai-compare.rs" required-features = ["desktop"] + +[dev-dependencies] +# Private Q2 reference: exact represented-source predicates/constructions only. +num-rational = "=0.4.2" +num-traits = "=0.2.19" diff --git a/docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md b/docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md index 417981dc..bdb0b4a1 100644 --- a/docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md +++ b/docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md @@ -1080,6 +1080,177 @@ gate, historical inventory or A1 status changes. Initial 94062 execution receipt retain that historical subject; fresh clean committed qualification, affected checks and current-head hosted gates are required before integration. +## Staged workflow and composition admission, 2026-10-20 + +This explicit reviewed refresh admits a fixed staged source only to attempt fresh +qualification. The source checkpoint is `f995923b84f0e963806654af292bd18073a7dcc9`, +tree `42e565eb670c1a4d4294fb8043dec287da5ba26e`. Its isolated trial composition +retains PR119–131 through PR130 `c2fbbea9f19f818b28b6c6863a40220a2bd0bbe5` and +PR131 `97cdce614c3c4438fa65ac806b48c4de6490583e`; the latter retains tested +workflow repair `34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2`. No public main or +component branch is advanced by this trial composition. + +Independent GPT-6.1 Sol review covered the complete unchanged conservative +selection policy: **135 regular files, 11 added, 16 changed, 108 unchanged, none +removed** versus the 124-path admission at main +`bc2f472787060d9a69cb619ed2c2fea10fd754b6`. All 124 historical identities were +verified against that exact main; all 108 reused identities remain exact. +The [per-path source review](../plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md) +and [receipt](../plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json) +retain every path's disposition. The provisional review subject `6137e46` remains +distinct from the staged checkpoint. The only subsequent selected source delta is +the independently approved [two-file iteration repair](../plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md): +`src/workflow.rs` at SHA256 +`5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9` and +`src/recording/workflow.rs` at SHA256 +`caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34`. +All other 133 selected identities remain as reviewed. The exact final sorted, +compact JSON source-map SHA256 is +`9af9e8fceeb49febc428301ca51f0c428bfc25e38203d6eccd23fdece031e8e8` +(no trailing newline). Later PR127/130/131 evidence-only commits did not change +this selected map. + +The admitted additions observe existing configured Session execution, add bounded +RCP4/RCT2 workflow evidence under the existing SQLite owner and present cached +workflow facts through the existing desktop worker. C1-A borrows existing native +family/pressure owners. C1-B1 validates supplied immutable pressure and velocity +arrays in disposable scratch; it does not invoke a candidate or publish Session +state. Q1 adds the explicit periodic represented-volume policy to its existing +owner, without admitting periodic pressure or whole-Stokes semantics. No second +numerical loop, recorder, runtime process supervisor or archive owner is added. +The iteration repair bounds native counts and requires candidate counts zero, +including later cancelled/failed attempts, while preserving cap-zero candidate +acceptance, rejected IEEE diagnostics and legacy RCP2/RCP3/RCT1 semantics. + +The [mechanism review](../plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md) +confirms that the established explicit v3 refresh suffices. Preserve all preceding +review text and source-bound receipts as history, the v3 schema/base, frozen v1/v2 +bytes and digests, immutable primary tree, ancestry, selector, checker, oracle, +qualifier and packet refusal behavior. The active v3 map and this appended review's +SHA256 are committed together. Old receipts do not qualify the new map. This is an +explicit admission decision following complete review, never a build-time hash +refresh or a projection to an assumed numerical subset. + +PR130 replaces all 15 optimization-sensitive assertions in four evidence +evaluators with always-on guards. Frozen evaluator bytes, campaign manifests, +results, failures and archive identities remain historical. Those tools are outside +the selected native map; independent full-AST reversal verifies unchanged +predicates/formulas, and the owner's separate tooling evidence reports 129 checks. +P1 remains stopped/unselected. Q1's incomplete transport/geometry/control evidence +and Q2's five positive native apertures on exact-zero-measure faces remain +authoritative. **The ongoing Q2 boundary repair is excluded from this fixed +checkpoint.** Its future exact source requires separate review and fresh applicable +qualification; this admission supplies no topology/DOF/B/M/S/W, coupled PDE, +whole-family replacement, learned-model or physical accuracy acceptance. + +Require clean committed-source native/rational execution into a fresh external +directory with the unchanged qualifier, then a newly generated real native packet +and all packet/refusal tests normally and under `-O`. Do not use `--allow-dirty`, +transfer old receipts, suppress failed attempts or skip the stale-inventory gate. +The native qualifier does not execute every new workflow/native-family/composition +unit suite; retain fresh focused composed contracts separately. Hosted +Pages/browser/publication, desktop/native-window, performance and physical gates +remain separately scoped. Put execution results in a separate integration report; +do not append them here or change the inventory after qualification. + + +## Separate closed C1-B2 Session/custody admission, 2026-10-20 + +This explicit independently reviewed refresh authorizes a fresh qualification +attempt on final PR137 `d3e62377acde6641c8133cf9a9356cc046cfd02a`, tree +`f8be6e0ef85a6a965545b2882bff11500c7f1dfd`, retaining fixed PR133/8bf542e. +The [original source/contract review](../plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.md), +[three-pin repair follow-up](../plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.md) +and [original 140-path receipt](../plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.json) +approve five added, eleven changed, 124 exact reused, zero removed regular inputs +under the unchanged complete selector. All 140 working/committed identities +match the final follow-up map; 137 identities are exact PR136 and its three +changed pins are independently reviewed. Canonical sorted compact source-map +SHA256 (without trailing newline) is +`08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6`. +Cargo/toolchain/qualification inputs remain exactly fixed PR133; the separate +Q2 Cargo/reference/CV1 stage is excluded. Historical 9c/9a receipts remain fixed +and do not qualify this new source closure. + +The new closed immutable BuiltinNativeV1 path reuses existing native producer, +B1 pressure/velocity qualifier, Liquid gates and atomic Session commit. Capped +scratch and typed immutable attempts add no accepted-state owner, scheduler, +process or store. RPS1/RPP1/RPT1 reuse SQLite and unchanged native RSC1/RCP2 +payload validation, complete 16KiB caps, exact binding/prior-link checks and +explicit accepted-unrecorded tails. Mixed pressure-witness fallback refuses +publication without stripping observations. Existing capture/desktop/comparison +paths explicitly refuse the new profile. Optional viscosity, arbitrary/stateful +external providers, full C1-B/C/R, whole-family/transfer and physical acceptance +remain excluded. Component core634404e/consumera6e76a9 evidence retains its exact +three-UI-literal source split; final e56bc7b adds only reporting documents. +PR137's tested source70da36d and final report d3e6237 remain separately attributed. + +PR137 repairs the legacy configured-Session advection cancellation label using +three matcher lines. Tests retain actual velocity/tracer cancellation before/after +acceptance, cold RCT2 custody, exact state/receipt, retry, historical Failed labels +and a true numerical failure control. No numerical formula, accepted order, +publication point, codec/version or UI implementation changes. The old defect +remains historical in fixed 9c/9a; no old archive is relabelled. Owner results stay +at tested70da36d, not this later lead execution. Fresh qualification is still +required; admission is not complete behavioral coverage of all 140 modules. + +The existing v3 mechanism is sufficient. Preserve all prior review bytes, +schema/base, exact v1/v2 predecessors, immutable primary tree/ancestry and all +selector/checker/oracle/qualifier/packet refusal behavior. Commit the explicit +reviewed map and this appended review digest together, freeze them, then follow +the [prospective protocol](../plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md): +new clean committed-source native/rational execution, newly generated actual +packet with 26 normal and 26 optimized checks/no skips, plus separately recorded +B2/legacy/persistence/volume/borrow contracts. No stale receipt, allow-dirty, +build-time refresh or skipped gate. Retain failures and outcomes separately; +never edit these bound bytes after qualification. Hosted/default/desktop/GUI, +release/performance, model/Lean/GPU and physical gates remain separate. No merge +authority is supplied by admission; public merge actions remain paused. + + +## Separate closed C1-B3 producer-selection admission, 2026-10-20 + +This explicit refresh permits a fresh qualification attempt after independent +complete-source review of final PR140 +`5dc1741feffa88b857194559b3e7e79be5369a64`, tested core4af3802 and consumer9ddf8d2. +The [independent source review](../plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.md) +and [all-path receipt](../plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.json) +approve the same 140 regular selected inputs: eight changed, 132 exact reused, +zero added/removed versus both PR137 and qualified186dc0a. Two additional changed +public contract targets are reviewed outside the unchanged selector. Canonical +sorted compact map SHA256 (no trailing newline): +`6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d`. +The local composition retains exact owner and qualified186 histories; no old +execution receipt transfers. Cargo/toolchain and all 132 reused inputs stay exact; +Q2 Cargo/CV sources remain excluded. Existing v3 schema/base, v1/v2 identities, +primary ancestry/tree and selector/checker/oracle/qualifier/packet stay unchanged. +Every previous bound-review byte is preserved as an exact prefix. + +ClassicalSelectionV1 selects the other existing native pressure method with +positive producer cap bounded by the constructor cap. Among producer errors, +only actual IterationLimit permits same-immutable-input full-cap native fallback; +other errors and cancellation terminate unpublished. Existing B1 field/momentum +rejection fallback remains; mixed-pressure witness fallback stays unpublished. Existing qualifier/Liquid/Session atomic +publication remains sole owner. Additive RPS2/RPP2/RPT2 binds distinct producer, +fallback and actual selection roles, with strict outer intent and embedded attempt +version refusal before payload parsing. Private method-only header adaptation +occurs only after outer validation; legacy configured/version-1 validators remain +strict. Graph/comparison refuses the new namespace. No stateful/learned/external, +whole-family/transfer or full C1-R admission is implied. Original failures/repairs +and owner227/5 execution claims remain their original subjects; no raw owner +archive audit is asserted. + +Commit this append, its bound digest, complete reviewed inventory and +[prospective protocol](../plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/protocol.md) +together after final independent metadata/protocol review, then freeze them. +Execute new clean committed-source native/rational qualification, actual exporter +and packet with26 normal+26 optimized checks/no skips, plus complete no-default +library, all B2/B3 public, legacy recording/provider, volume and borrow contracts. +Retain actual ELFs/logs/source hashes and failures; report outcomes in separate +files. Admission is an attempt permission, not acceptance from refreshed hashes. +Hosted/default/desktop/window/release/performance/physical/model/Lean/GPU and +combined-Q2 qualification remain separate. Public merges remain paused. + ## Shared authored force fields and accepted recording custody, 2026-10-20 @@ -1434,3 +1605,149 @@ actual complete three-file candidate requires independent review before atomic commit/publication, then fresh clean committed-source existing native/rational and normal Rust/book qualification. No stale receipt refresh, dirty-source bypass, threshold relaxation, workflow expansion, merge or FEMPR147 changes are admitted. + + +## PR142 current-main composition and fixture admission, 2026-10-21 + +This explicit v3 refresh admits a fresh qualification attempt on PR142 +`4f2d55323825c8907cf9209914f29130ec7de511` plus current main +`15026a966265cf9eaedf464e2b5a066bd0fef3d8` and its bounded cfg(test) fixture +repair. The unchanged conservative selector covers **152 regular inputs**. +Against PR142 inventory: 12 added, 19 changed, +121 unchanged, 0 removed; against main inventory: +16 added, 18 changed, 118 unchanged, +0 removed. The canonical sorted compact source-map SHA256 +(no trailing newline) is `4d6fbe1927962b23da4c37e32b476b20a2ae7f48bf0d11805c36065c8a8b464d`. + +The [independent complete-source review](../plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/review.md) +approves these exact identities: 94 match both parents, 24 match main, 27 match +PR142, seven compose both owners or repair the test fixture. Its +[per-path review](../plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/per-path-review.md) +and [machine map](../plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source-map.json) +record every parent/current identity and disposition. Machine-map file SHA256 +is `ae828885a18fbf5c986b73d65353197a85194f7496337080e88e6198e5558421`. + +Simulation retains workflow capture, authored force fields and closed projection +inputs under their existing owner; all constructors initialize the complete +private domain. Lib/recording/desktop merges retain both histories and strict +publication/selection/profile semantics. A shared cfg(test) fixture now uses an +atomic sequence and exclusive directory creation so repeated clock values +cannot alias another fixture; an identical-timestamp concurrent regression is +added. No numerical formula, acceptance threshold, schema interpretation, +source selector, qualifier, oracle or packet consumer changes. + +Both prior review histories above remain intact, including their common +72,250-byte prefix and complete divergent suffixes. Frozen v1/v2 bytes, primary +ancestry and every historical receipt remain. This new map cannot use either +parent's receipt as fresh qualification. The prior stale-review-binding refusal +is retained outside Git. Commit this explicit inventory/review and the +[prospective protocol](../plans/fluid-accuracy-composition/reports/pr142-completion-20261021/protocol.md) +before fresh clean native/rational/real-packet and ordinary supported-feature +contract execution. Do not rerun sealed numerical campaigns or weaken gates. + +Fresh 2026-10-21 user instruction authorizes normal reviewed serial integration +through PR142 lead, superseding only the historical task's no-merge delegation. +Cloud-task reads/resumes and the earlier GPU artifact download remain denied. +No source branch is deleted or rewritten. Source admission is not numerical, +GUI-window, performance, hardware/model, physical or production acceptance. + +## Dependent exact-geometry reference inputs, 2026-10-20 + +This separately reviewed checkpoint extends the fixed stage above only after +PR132/e6525a116a07af486e4a682cc2b157241d6b9150 and +PR134/f84f65104d6a0f6f8f1a9b903412b1e5155f72a2 are composed at +`cd21a9952dc411e01b77f58e3aae67aff1e473fd`, tree +`0447da683eecce1330adb563f1ca6e5dabfc0a62`. Tested component sources remain +`0f4e7e0944a7e0302690a0f71c08c21fe345cc89` and +`06b31902fd229624080bff1562f80beb1be2449c`. Fixed PR133/8bf542e and its actual +9c04278 qualification remain unchanged and do not qualify these additions. + +The complete unchanged selector still contains **135 regular inputs: 0 added, +2 changed, 133 unchanged, 0 removed**. Every prior source identity except Cargo.toml +and Cargo.lock is reused exactly, including all Rust, toolchain, checker, +qualifier, oracle and qualification-test inputs. New Cargo.toml SHA256 is +`fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409`; Cargo.lock +is `e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f`. +The full sorted compact source-map SHA256 is +`c1baa8b487bdacaa746446a0e21540b9605232c39131b32148253909249cb8f1` +(no trailing newline). No unrelated source is removed by comparing an incomplete +component-branch snapshot against the composed stage. + +The [bounded source/dependency review](../plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md) +and [dependency receipt](../plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/dependency-review.json) +pin new dev-only num-rational=0.4.2 and existing num-traits=0.2.19 requirements. +The lock adds num-bigint 0.4.8, num-integer 0.1.47 and num-rational 0.4.2, preserving +all prior registry identities/checksums. Actual official crate archives match +their lock SHA256s and contain MIT OR Apache-2.0 license texts. There is no new +root build.rs or build-dependency and no production Rust/formula/domain edit in +this extension. Private example/test files remain separately reviewed component +source, outside the conservative native selector's explicit qualification inputs. + +PR132's represented-source exact predicate repairs five prior aperture artifacts +within its predeclared fixed corpus; original failed v2 fields and finite-error +budgets remain historical. PR134's eight aligned direct coupled-algebra cases +reuse the existing StaticObstacleGeometry/AlignedStrain and conditional exact-real +StokesWork identity. Neither selects a general cut/free-surface velocity space, +extension or physical traction/boundary lift. No PDE/physical/production-family +acceptance is granted here. Root observes the recorded component scientific +dispositions without rerunning their campaigns or transferring old receipts. + +This explicit v3 map refresh authorizes **attempting fresh qualification only**. +The [frozen dependent protocol](../plans/fluid-accuracy-composition/reports/q2-admission-20261020/protocol.md) +requires independent composed-source/metadata review, clean committed-source +native/rational execution and a new real packet with all normal/optimized refusal +tests, plus separately retained focused composed and private-reference contracts. +Preserve all previous review text, v3 schema/base, immutable primary tree, frozen +v1/v2 bytes/digests, ancestry and complete selector/refusal checks. Commit this +bound review and inventory together. Fresh evidence binds the new exact source, +not 9c04278. Put outcomes in a separate report; do not change these bound bytes +after qualifying. Hosted, desktop/native-window, performance, model and physical +gates remain separate. Further cut/PDE method selection remains with its existing +numerical owner and requires its own reviewed admission before implementation. + +## PR138 preliminary composition with reviewed PR142 source, 2026-10-21 + +The serial lead explicitly authorized isolated preparation against frozen PR142 +`dbd49d3e41c482a753884abc8aaaff7d1b0d0653` in PR138 comment 6328266160, +without waiving final merged-main verification or authorizing a main merge. This +checkpoint retains PR138 `a6bfcc94481b1bafbe61be804a1abc3426927bbd` +and exact PR132/e6525a1 and PR134/f84f651 ancestry and tested reference bytes. +All prior review text above remains unchanged, including both PR142 histories +and the complete dependent Q2 admission suffix from PR138. + +The unchanged conservative selector contains **152 regular files: 0 added, +2 changed, 150 unchanged, 0 removed** against the reviewed PR142 dependency. +Only Cargo.toml and Cargo.lock change; every product, thermal, UI, fixture, +workflow, toolchain, checker, qualifier and oracle selected identity remains +exactly PR142's. The complete sorted compact source-map SHA256 is +`9a10497158827e189fe505f65e1aa203cd8a28fe894c469408977071b055375f` (no trailing newline). +Cargo.toml SHA256 is `997fb098f13c60e4f85ead3f5f7f2527f87ad1cba04fdac82d0bfb24959fca3a`; +Cargo.lock SHA256 is `e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f`. + +The two manifest requirements remain development-only num-rational=0.4.2 and +num-traits=0.2.19. The lock adds only num-bigint 0.4.8, num-integer 0.1.47 and +num-rational 0.4.2; all pre-existing registry identities/checksums remain unchanged. +Actual official crate archives and MIT/Apache license bytes match the retained +dependency review; no new root build.rs or build-dependency is added. The normal +no-default production graph excludes all three new crates. Private reference +implementation/test and scientific source pins remain exact; no sealed campaign +is rerun, relabelled or promoted to combined-source evidence. + +The independently reviewed actual complete source and metadata are recorded in +`docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/`. +This explicit v3 refresh permits attempting fresh qualification only after that +review approves the actual staged content. The old PR142 inventory refused the +changed Cargo.lock before numerical execution; its refusal log is retained. +Preserve schema/base, primary tree, v1/v2 bytes/digests, ancestry, complete selector +and all checker/qualifier/oracle/packet refusal contracts. No automatic pin +refresh, copied receipt, dirty override or omitted source is admitted. + +Follow the PR138 prospective protocol: clean committed-source native/rational +qualification, a new real packet with all 26 normal and 26 optimized tests/no skips, +affected fixed ordinary contracts and hosted checks; retain failure/partial +outputs. Results belong in a separate report, not changes to these bound bytes. +Every receipt names its actual preliminary executed head. Final readiness still +requires verified PR142 merged-main identity, any necessary exact-source +revalidation, independent final review and the sole lead's normal merge. +No general cut/free-surface PDE, physical/production-water, graphical hardware, +learned/GPU or performance acceptance is granted by this reference/build stage. diff --git a/docs/education/aligned-strain-native-sources-integration-20261014.json b/docs/education/aligned-strain-native-sources-integration-20261014.json index 82cb277e..a1192090 100644 --- a/docs/education/aligned-strain-native-sources-integration-20261014.json +++ b/docs/education/aligned-strain-native-sources-integration-20261014.json @@ -1,16 +1,16 @@ { "schema": "rheon-reviewed-aligned-strain-native-sources-v3", "reviewed_base": "21d4122c3d0edb2ca5c3ce089175c70035d737a3", - "scope": "Reviewed cfg(test)-only Scene readiness assertion repair after production enabling21e: exact supported success and unsupported-owner refusal, preserving all historical reviews. Complete136-path inventory:1reviewed test source rebound,135unchanged,none added/removed. Production bytes,App contract,tools,selectors,thresholds and v1/v2 bindings unchanged. Fresh clean committed-source qualification required; actual-App execution remains separately bounded and pending native-owner review.", + "scope": "Explicit PR138 reference/dev-dependency composition with reviewed PR142 dbd49d3: complete152-path closure,0added/2Cargochanged/150same/0removed. Fresh clean preliminary native/rational/real-packet and affected ordinary qualification required; final merged-main verification and lead merge remain gated. Historical scientific/physical/GUI/performance limits preserved.", "preserved_inventory_sha256": { "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d" }, "review_record": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", - "review_sha256": "32e81e49279b1a0f0fb7f0f35d3264f504099a856d8c09375af3215b6d424e9a", + "review_sha256": "b4e7fcaf0c33b9e220fc7626d04969a95b31767897e9779eee850a9cfd71d0f9", "source_sha256": { - "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", - "Cargo.toml": "f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae", + "Cargo.lock": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "Cargo.toml": "997fb098f13c60e4f85ead3f5f7f2527f87ad1cba04fdac82d0bfb24959fca3a", "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", @@ -22,9 +22,9 @@ "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", - "src/bin/desktop/ai_comparison/configured_track.rs": "3959018b52697ef072884864c01de4682d1b4cd351c273426d914d02f0641fa1", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", - "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "e268555e0ebde7080f0ea8b2e8e398721fd1a65ec60f1925a314ace5f73d3488", "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", @@ -43,7 +43,7 @@ "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", "src/bin/desktop/carrier_execution.rs": "c4455879373fc71eaaf398fdaa230c4d0b115dc7ff0a9da6356afeb24cba23b2", "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", - "src/bin/desktop/comparison.rs": "27ad4b88db848430a68f5f9fae796fa10eab1df26af9dbae73386e55c9b5c74f", + "src/bin/desktop/comparison.rs": "cf8be77bcc46e192d0fcf44e8206d1e0a54a88deefcd178083ff39263ad957dc", "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", @@ -59,13 +59,13 @@ "src/bin/desktop/force_runtime_ui_tests.rs": "92475c2b577510a8f8fc11217f7eb1a5361dcaef20ade99f198f60d5b654966c", "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", - "src/bin/desktop/inspector.rs": "7a6582faf9bfff755d7fade624f6b11cca06813c75310fba25ccbfabff1d2aae", + "src/bin/desktop/inspector.rs": "2e6a9f4f44e4a3843bc1c16953e1fc2f182a08b3a25e70f968084b454af8a438", "src/bin/desktop/native_presentation_harness.rs": "8ce8efa63afbe0d09e22996ec00478de331fcbda7a5ac83882f2ed3fff0d8ea1", "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", "src/bin/desktop/run_sets.rs": "b25f07c5d9f4a27572922956043224c35dde35d9a0d987ab8af4f3f3151c91f0", "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", - "src/bin/desktop/run_sets/configured/archive.rs": "eb1d8e77019eb57afd9e5fd5f57af55f8ff320527ec8efc935945bd7ff477806", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", "src/bin/desktop/run_sets/source.rs": "39e8982fffaf4e9adcd0ca0c60f49eabc96b829957bc6d9c05479c80eee99daf", "src/bin/desktop/scene_handles.rs": "4818b85644a2891de562adc00fc203eb59c674bbf46aa88cd440bcab6477eb22", "src/bin/desktop/scene_ui.rs": "e98c8aa0449b8f1adac4eb8a5bdc9a0951bd0b054f4dd2575d31dee30990c922", @@ -75,8 +75,10 @@ "src/bin/desktop/timeline_ui_tests.rs": "545e109f6d6808cc31482b8cffb4e21f8518d705424327728dc6c5d549a73df5", "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", "src/bin/desktop/viewport.rs": "4a365fbb1a0f48bd016b3d673b30e635ad26390205cb22c24d25fa46738b6a08", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922", "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", - "src/bin/rheon-desktop.rs": "d74cff5459f52d1cb01512b6300d9466411352f73b014491e3678d514844d1b3", + "src/bin/rheon-desktop.rs": "6d16349502d2ce6bd3a2e07a5285cd1538703a48ec591215d7cb327d435a902a", "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", @@ -97,14 +99,16 @@ "src/forces.rs": "7b3b48c0813c995a937a44ca1b624411c59dde6419b62041b67456cde2d692d9", "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", - "src/lib.rs": "30f5b78a98f6d0c010955a25fc00cc2de4aadf159d260e95afd3f3143dc6f9c3", - "src/liquid_step.rs": "f99dce6a99f6af8a9aef2436af7f33de58dac3be5998a48e9187fbdf2acc3f93", - "src/liquid_volume.rs": "24623038f62261ce6a17b034e9b6d82c5f0aba02dd0df7aad174c885ed2a8c96", + "src/lib.rs": "6a9f704b00321be1cb9699e4d81d953030a42e3794f5b5d03ce548490f51f7b5", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", @@ -113,24 +117,34 @@ "src/particle_fluid.rs": "538c498122bbc1045ae59d7363ff87e1dd9a40003fb48eeae835228ad4c65893", "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", - "src/provider_step.rs": "79167b70a8d164a2367f43816feab443eefb41f23bc4bd940716dd5fd32d495b", - "src/recording.rs": "47b2b24bbe9af777ceafdefa6f0b82200a60cea590d0b64f326de1d50c6d7d2d", + "src/projection_step.rs": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "4273be1af82f7a1ab9c0f141fc58b663354e5fc96e625835ad1dbcef2588af34", "src/recording/carrier.rs": "5a9b10b929f650423ad9e58bd7047bfe80cc7bf18138d74bd628c2f3f17af711", "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", "src/recording/force_fields.rs": "2cf3ec9ec191c35c814d48ace301feaccd6cc73311a66970c9d112dad432c4a9", "src/recording/material.rs": "e72e256aa3af46fef9002822de5281caf1de66ba070eb2109f77b083e20ae6ce", - "src/recording/provider.rs": "980ea5af7094016b13e7d0f39110aa2ff673b0173416e0fe583e6266b7c27f57", + "src/recording/projection.rs": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588", + "src/recording/projection_tests.rs": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d", + "src/recording/provider.rs": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826", "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", - "src/recording/provider/runtime.rs": "d7b2a1f7cfa866b33887f7c8f804999058d6e70a1c9d71421372d151152ebccb", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", - "src/session.rs": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", - "src/session/configured.rs": "d99ae990e9c7ddc956f95f414a25832411a4dc84ab434df95ff9f8f68cf52a83", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "src/session/projection.rs": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4", + "src/session/projection_tests.rs": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d", "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", - "src/simulation.rs": "c08ede6330c4bf6ed7e858e556806ec80628522ceb42286cf52714bf7430c9a1", - "src/solver_provider.rs": "0ab7db08a9016e73d664c730e4ff513d42599a84c680ea061e6604859432a5a5", - "src/solver_provider/configured.rs": "124ca65dd1dec3a8a89043198fb085453a42ca8aff0dc87c67b04b6a986109be", + "src/simulation.rs": "0abf525a7535e48f04acd3ef408c15c7d93242906195f778fb0e1e8646dff254", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", @@ -138,6 +152,8 @@ "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/README.md b/docs/plans/fluid-accuracy-composition/evaluator-tooling/README.md new file mode 100644 index 00000000..86fccc41 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/README.md @@ -0,0 +1,65 @@ +# Always-on evaluator input guards — tooling v2 + +Parent integration review reproduced optimization-sensitive acceptance of +incomplete input in the P1-adjoint/material evaluators, with related Q1/Q2 +patterns. User authorizes this tooling repair, with frozen source/results retained +and NO numerical campaign rerun. Exact added write set: the four active analyze.py +files, byte-preserved originals in this frozen/ directory, and this tooling owner. +Isolated branch fix/numerical-evaluator-inputs-20261020 based on Q2/7d7306a. +No numerical Rust, dependencies, G1/C1, canonical lifecycle, old result/manifest, +frozen branches or scientific archives are changed. Standards pin0fc92a2 applies. + +All15 original Python Assert predicates are promoted to always-on require calls: +7adjoint,4material,2Q1,2Q2. No scientific threshold, arithmetic, condition or output +schema changed. Invalid input exits nonzero with an intentional input-refused +diagnostic before emitting a report, including under -O/-OO. Original evaluators +are historical bytes only: their optimized bypass is intentionally reproduced +by tests, and they must not be used as active validation under optimization. + +## Results and limits + +- 129 subprocess checks,35 malformed fixtures. All15 original guard IDs exercised + in normal/-O/-OO modes. This includes cardinality, same-total group reassignment, + duplicate summary keys, wrong/reordered epsilons, nonfinite values and required + positive site fields. Intentional refusal and empty stdout required. +- Real retained complete P1-adjoint/P1-material/Q2-v2 CSV reports are byte-identical + to frozen normal-mode outputs in all three repaired modes. +- Real retained incomplete Q1 and empty Q2-v1 matrices remain nonzero refusals. + Q1 has no complete retained matrix; the inner-group contract uses an explicitly + SYNTHETIC cardinality-only fixture. Padded64 summary rows are not native + measurements, scientific outputs, finest-order evidence or an accuracy claim. +- Four original optimized bypasses reproduced separately. Those outputs and all + malformed fixtures are invalid tooling witnesses, never campaign evidence. +- Retained input CSV hashes unchanged. No native executable or campaign invoked. + Independent full-AST reversal and frozen-byte/hash checks confirm unchanged + predicates/formulas, beyond merely comparing the individual guard expressions. + +This repairs the existing input guard contract; it does not add exhaustive CSV +schema, unique per-node identity, arbitrary domain or physical validation. Original +scientific failures and limited claims stand: stopped P1 selection, incomplete Q1 +transport, finite-error Q2 geometry only, five topology artifacts before B/M/S/W. +See evaluator-hashes.json for separately versioned original/repaired identities. +Old scientific manifests identify their frozen source/copies, not these new tools. +No superseded report or archive hash is rewritten. + +## Replay tooling checks + +Use retained CSV roots and a fresh output directory: + +```bash +python3 docs/plans/fluid-accuracy-composition/evaluator-tooling/test_contract.py \ + --adjoint /workspace/rheon-p1-adjoint-evidence/campaign-v1 \ + --material /workspace/rheon-p1-material-evidence/campaign-v1 \ + --q1 /workspace/rheon-q1-evidence/raw \ + --q2-v1 /workspace/rheon-q2-evidence/raw \ + --q2-v2 /workspace/rheon-q2-evidence-v2/raw \ + --output /tmp/fresh-evaluator-contract +python3 docs/plans/fluid-accuracy-composition/evaluator-tooling/check_guard_coverage.py \ + /tmp/fresh-evaluator-contract +``` + +This runs Python evaluators and synthetic input contracts only. It does not run a +native solver. Source/frozen copies, logs/fixtures/byte comparisons, input hashes, +all eight evaluator hashes, coverage and independent review are retained in the +separate tooling evidence archive. Existing numerical archives remain unchanged. +Parent/repository lead owns dependency/CI integration and merges. diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/check_guard_coverage.py b/docs/plans/fluid-accuracy-composition/evaluator-tooling/check_guard_coverage.py new file mode 100644 index 00000000..e9d8ad87 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/check_guard_coverage.py @@ -0,0 +1,26 @@ +"""Check existing refusal logs; this never executes an evaluator or solver.""" +import ast +import json +from pathlib import Path +import sys + +root = Path(sys.argv[1]) +here = Path(__file__).resolve().parent +expected = set() +for frozen in (here / 'frozen').glob('*.py'): + for node in ast.walk(ast.parse(frozen.read_text())): + if isinstance(node, ast.Assert): + expected.add(f'evaluator input refused: {frozen.stem}: input contract at original line {node.lineno}') +covered = {} +for path in (root / 'logs').glob('*.stderr'): + message = path.read_text().strip() + if message not in expected: + continue + mode = '-OO' if path.name.endswith('--OO.stderr') else '-O' if path.name.endswith('--O.stderr') else 'normal' + covered.setdefault(message, set()).add(mode) +if set(covered) != expected or any(modes != {'normal','-O','-OO'} for modes in covered.values()): + raise SystemExit('incomplete always-on guard coverage') +report = dict(original_guards=len(expected), modes_per_guard=3, all_guards_all_modes=True, + guards={k:sorted(v) for k,v in sorted(covered.items())}) +(root / 'guard-coverage.json').write_text(json.dumps(report, indent=2) + '\n') +print(json.dumps({k:v for k,v in report.items() if k!='guards'}, indent=2)) diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/evaluator-hashes.json b/docs/plans/fluid-accuracy-composition/evaluator-tooling/evaluator-hashes.json new file mode 100644 index 00000000..972ba52f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/evaluator-hashes.json @@ -0,0 +1,26 @@ +{ + "p1-adjoint": { + "path": "docs/plans/fluid-accuracy-composition/p1-adjoint/analyze.py", + "original_sha256": "c7ca75747b21d5e85d8f3efdfc116940cf5c95b3f26fd607f86842f3a75f75df", + "repaired_sha256": "aadb95d77aed509b45f01690e9c569b70f65ce45559398115db8bc86aa56193d", + "always_on_guards": 7 + }, + "p1-material": { + "path": "docs/plans/fluid-accuracy-composition/p1-material/analyze.py", + "original_sha256": "b62ae1a482998e4aef35e1343fc2ac006649142920d0f2911e60c66a1e0f9901", + "repaired_sha256": "06eb2ab3fbbe481ec32592a91be8f09c12b34d90813d8af7522c45d7659cb1a1", + "always_on_guards": 4 + }, + "q1": { + "path": "docs/plans/fluid-accuracy-composition/q1/analyze.py", + "original_sha256": "c41f7404e06e7171bd9b4e1623f0b175de56b98b0639e1e013603b826f28f5fb", + "repaired_sha256": "6af6b5b426139863522f311a869361f266f2ed222960486be89d343c64fa4a6b", + "always_on_guards": 2 + }, + "q2": { + "path": "docs/plans/fluid-accuracy-composition/q2/analyze.py", + "original_sha256": "025fb18a265b29b38d2ae0d7d8b0c67b9877562fbef1ad5dc65168814e351634", + "repaired_sha256": "f41da58439fe5da8218c3be917476d101f0894268cf9629ef217d9e4b79367fd", + "always_on_guards": 2 + } +} diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/p1-adjoint.py b/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/p1-adjoint.py new file mode 100644 index 00000000..cb99ff80 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/p1-adjoint.py @@ -0,0 +1,48 @@ +"""Frozen static gate evaluation, stdlib only; ROOT is a completed native run.""" +import csv +import json +import math +import pathlib +import sys + +root = pathlib.Path(sys.argv[1]) + +def rows(name): + with (root / name).open() as handle: + return list(csv.DictReader(handle)) + +summary = rows('summary.csv') +sites = rows('sites.csv') +derivatives = rows('derivatives.csv') +assert len(summary) == 16 and len(sites) == 768 and len(derivatives) == 48 + +def key(row): + return tuple(row[k] for k in ('map', 'n', 'perturbed', 'hydro')) + +assert len({key(row) for row in summary}) == 16 +report = [] +for row in summary: + group = [r for r in derivatives if key(r) == key(row)] + fields = [r for r in sites if key(r) == key(row)] + assert len(group) == 3 and len(fields) == int(row['n']) + assert [float(r['eps']) for r in group] == [1e-5, 1e-6, 1e-7] + for field in fields: + assert all(math.isfinite(float(field[k])) for k in field if k not in ('map', 'perturbed', 'hydro')) + assert all(float(field[k]) > 0 for k in ('y', 'mass', 'rho', 'volume')) + for derivative in group: + assert all(math.isfinite(float(derivative[k])) for k in derivative if k not in ('map', 'perturbed', 'hydro')) + fd_ok = [all(float(r[k]) <= 1e-6 for k in ('energy_error', 'volume_error', 'density_error')) for r in group] + entry = dict(row) + entry['work_pass'] = float(row['work_normalized']) <= 1e-12 + entry['momentum_pass'] = float(row['momentum_normalized']) <= 1e-12 + entry['derivative_pass'] = any(a and b for a, b in zip(fd_ok, fd_ok[1:])) + entry['derivative_eps_pass'] = fd_ok + entry['e0_pass'] = None if row['hydro'] == 'true' else float(row['e0_force_over_pressure']) <= 1e-10 + entry['max_fd_energy_error'] = max(float(r['energy_error']) for r in group) + entry['max_fd_volume_error'] = max(float(r['volume_error']) for r in group) + entry['max_fd_density_error'] = max(float(r['density_error']) for r in group) + if row['hydro'] == 'false': + pressure = float(fields[0]['pressure']) + entry['force_volume_identity_max_absolute'] = max(abs(float(r['force']) / pressure - float(r['volume_gradient'])) for r in fields) + report.append(entry) +print(json.dumps(report, indent=2, allow_nan=False)) diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/p1-material.py b/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/p1-material.py new file mode 100644 index 00000000..2081f4d3 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/p1-material.py @@ -0,0 +1,36 @@ +"""Frozen necessary criteria for the ONE n8 material reference. Stdlib only.""" +import csv +import json +import math +import pathlib +import sys +root = pathlib.Path(sys.argv[1]) +def read(name): + with (root/name).open() as f: + return list(csv.DictReader(f)) +s = read('summary.csv'); p = read('probes.csv') +assert len(s)==8 and len(p)==48 and len(read('nodes.csv'))==72 and len(read('elements.csv'))==64 +keys = ('perturbed','hydro','deformed') +def key(r): return tuple(r[k] for k in keys) +assert len({key(r) for r in s})==8 +report=[] +for r in s: + normalized = ('volume_error','mass_error','moment_error','work_error','momentum_error','affine_error','quadratic_error') + algebra = all(math.isfinite(float(r[k])) and float(r[k])<=1e-12 for k in normalized) + matrix = float(r['cholesky_min'])>0 and math.isfinite(float(r['row_bound'])) and float(r['row_bound'])>0 + alternate = float(r['alternating_max'])==20.0 + equilibrium = None if r['deformed']=='true' else all(float(r[k])<=1e-10 for k in ('equilibrium_error','bottom_load_error','top_load_error')) + groups=[] + for translation in ('false','true'): + g=[x for x in p if key(x)==key(r) and x['translation']==translation] + assert len(g)==3 and [float(x['eps']) for x in g]==[1e-5,1e-6,1e-7] + assert all(math.isfinite(float(x[k])) for x in g for k in ('energy_fd','energy_analytic','energy_error','volume_error','hessian_error')) + ok=[float(x['energy_error'])<=1e-6 and float(x['hessian_error'])<=1e-6 and float(x['volume_error'])<=1e-12 for x in g] + groups.append({'translation':translation,'eps_pass':ok,'pass':any(a and b for a,b in zip(ok,ok[1:]))}) + report.append({'case':key(r),'algebra_pass':algebra,'matrix_pass':matrix,'alternating_pass':alternate,'equilibrium_pass':equilibrium,'probes':groups}) +base_hydro=[r for r in s if r['hydro']=='true' and r['deformed']=='false'] +controls={k:max(float(r[k]) for r in base_hydro) for k in ('wrong_gravity_error','wrong_wall_error')} +controls_pass=all(v>1e-8 for v in controls.values()) +print(json.dumps({'cases':report,'control_maxima':controls,'controls_discriminate':controls_pass, + 'all_native_necessary_reference_gates_pass':controls_pass and all(r['algebra_pass'] and r['matrix_pass'] and r['alternating_pass'] and r['equilibrium_pass'] is not False and all(g['pass'] for g in r['probes']) for r in report), + 'production_admitted':False,'nonlinear_or_production_dt_admitted':False},indent=2)) diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/q1.py b/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/q1.py new file mode 100644 index 00000000..e6ade733 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/q1.py @@ -0,0 +1,36 @@ +"""Frozen native Q1 criteria; geometry/discretization independent review remains separate.""" +import csv,json,math,pathlib,sys +root=pathlib.Path(sys.argv[1]) +def read(name): + with (root/name).open() as f:return list(csv.DictReader(f)) +c=read('channel-summary.csv');t=read('transport-summary.csv');g=read('geometry.csv');controls=read('constant-controls.csv') +assert len(c)==6 and len(t)==18 and len(g)==9 and len(controls)==18 +steady=sorted((r for r in c if r['case']=='steady'),key=lambda r:int(r['n'])) +time=sorted((r for r in c if r['case']=='temporal'),key=lambda r:int(r['steps'])) +orders=lambda e:[math.log(a/b,2) for a,b in zip(e,e[1:])] +spatial=orders([float(r['relative_rms']) for r in steady]);temporal=orders([float(r['rms']) for r in time]) +rho=998.2;nu=.001002/rho;volume=1e-9;speed=.01*.001**2/(8*nu) +channel={'original_coarse_failure_preserved':float(steady[0]['relative_rms'])>.02 and abs(float(steady[0]['relative_rms'])-.02139313)<=5e-9, + 'resolved_velocity_pass':all(float(r['relative_rms'])<=.02 for r in steady[1:]),'spatial_orders':spatial,'spatial_order_pass':all(1.8<=p<=2.2 for p in spatial), + 'temporal_orders':temporal,'temporal_pass':all(p>=.9 for p in temporal) and all(float(b['rms'])/float(a['rms'])<.65 for a,b in zip(time,time[1:])) and all(float(r['max_energy_increase'])<=0 for r in time), + 'native_algebra_pass':all(float(r['max_energy_identity'])/(.5*rho*volume*speed**2)<=1e-10 and float(r['max_momentum_identity'])/(rho*volume*speed)<=1e-10 and float(r['max_force_residual'])/(rho*volume*.01)<=1e-10 for r in steady)} +geometry_native=all(r['exhausted']=='false' and float(r['empirical_uncertainty'])<=1e-4 and abs(float(r['volume_fine'])-4*math.pi*.15**3/3)/(4*math.pi*.15**3/3)<=1e-4 for r in g) +control_pass=all(r['status']=='complete' and float(r['max_change'])<=1e-12 for r in controls) +transport=[] +for case in ['translation','vortex-adapted']: + for courant in [.1,.25,.5]: + rows=sorted((r for r in t if r['case']==case and float(r['requested_courant'])==courant),key=lambda r:int(r['n'])) + assert len(rows)==3 + completed=all(r['status']=='complete' and abs(float(r['time'])-1)<=16*sys.float_info.epsilon for r in rows) + item={'case':case,'courant':courant,'complete':completed,'statuses':[r['status'] for r in rows], + 'conservation_bounds_pass':all(float(r['relative_drift'])<=1e-10 and float(r['min'])>=-1e-12 and float(r['max'])<=1+1e-12 for r in rows), + 'actual_courant_pass':all(r['status']!='complete' or abs(float(r['max_courant'])-courant)<=16*sys.float_info.epsilon*courant for r in rows)} + if completed: + errors=[float(r['relative_l1']) for r in rows];u=2e-4 + lower=[math.log((a-u)/(b+u),2) if a>u and b>0 else None for a,b in zip(errors,errors[1:])] + item.update(errors=errors,orders=orders(errors),order_lower=lower,geometry_uncertainty_budget=u, + finest_shape_pass=errors[-1]+u<=.05,finest_order_pass=lower[-1] is not None and lower[-1]>=.9) + else:item.update(errors=None,orders=None,finest_shape_pass=False,finest_order_pass=False) + item['positive_accuracy_candidate']=completed and item['conservation_bounds_pass'] and item['actual_courant_pass'] and item['finest_shape_pass'] and item['finest_order_pass'] and geometry_native and (case=='translation' or control_pass) + transport.append(item) +print(json.dumps({'channel':channel,'geometry_native_estimate_pass':geometry_native,'independent_geometry_gate':'REQUIRED before positive scientific disposition','constant_controls_pass':control_pass,'transport':transport,'general_water_or_Q2_admitted':False},indent=2,allow_nan=False)) diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/q2.py b/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/q2.py new file mode 100644 index 00000000..237e5fb6 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/q2.py @@ -0,0 +1,28 @@ +"""Frozen Q2 geometry-only gates; no coupled PDE acceptance.""" +import csv,json,math,pathlib,sys +root=pathlib.Path(sys.argv[1]) +rows=list(csv.DictReader((root/'summary.csv').open())) +assert len(rows)==24 +results=[] +for row in rows: + r={k:(v if k=='case' else float(v)) for k,v in row.items()} + a=r['area']; exact=r['exact_area']; mu=r['mu'] + defects={k:r[k] for k in ['normal_closure','linear_closure','cubic_defect','solenoidal_defect','traction_defect','face_mismatch','dual_relative_defect']} + geometry=[abs(a-exact)/exact,abs(r['mx']-r['exact_mx'])/exact,abs(r['my']-r['exact_my'])/exact,abs(r['radial_second']-r['exact_radial_second'])/exact] + geometry.extend(abs(r[k]-r['exact_'+k])/exact for k in ['mxx','mxy','myy']) + control=[abs((r['wrong_force_x']-r['force_x'])-mu*a)/(mu*a),abs((r['wrong_force_y']-r['force_y'])+3*mu*a)/(mu*a)] + item={'case':r['case'],'n':int(r['n']),'mu':mu,'local_geometry_pass':all(math.isfinite(v) and v<=1e-10 for v in defects.values()),'defects':defects,'min_positive_volume':r['min_positive_volume'],'negative_pressure_control_pass':max(control)<=1e-10,'area_error':geometry[0],'radial_error':abs(r['radial_second']/r['exact_radial_second']-1),'first_second_moment_scaled_errors':geometry[1:],'flux_error':abs(r['flux']/r['exact_flux']-1),'force_errors':[abs(r['force_x']/r['exact_force']-1),abs(r['force_y']/r['exact_force']-1)],'global_geometry_pass':max(geometry[1:3]+[geometry[5]])<=1e-10 if r['case']=='disk' else max(geometry)<=1e-10} + results.append(item) +convergence=[] +for mu in [.1,.001002]: + group=sorted([r for r in results if r['case']=='disk' and r['mu']==mu],key=lambda r:r['n']) + assert len(group)==3 + for metric in ['area_error','radial_error','flux_error']: + errors=[r[metric] for r in group] + p=[math.log(a/b,2) for a,b in zip(errors,errors[1:])] + convergence.append(dict(mu=mu,metric=metric,errors=errors,orders=p,pass_gate=errors[-1]<=1e-4 and all(1.8<=v<=2.2 for v in p))) + for d in range(2): + errors=[r['force_errors'][d] for r in group];p=[math.log(a/b,2) for a,b in zip(errors,errors[1:])] + convergence.append(dict(mu=mu,metric=f'force_{d}',errors=errors,orders=p,pass_gate=errors[-1]<=1e-4 and all(1.8<=v<=2.2 for v in p))) +positive=all(r['local_geometry_pass'] and r['negative_pressure_control_pass'] and r['global_geometry_pass'] for r in results) and all(r['pass_gate'] for r in convergence) +print(json.dumps(dict(native_geometry_candidate=positive,independent_cellwise_geometry_gate='REQUIRED',results=results,convergence=convergence,coupled_stokes_mms_or_production_water_admitted=False),indent=2,allow_nan=False)) diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/manifest.json b/docs/plans/fluid-accuracy-composition/evaluator-tooling/manifest.json new file mode 100644 index 00000000..830d9cf2 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/manifest.json @@ -0,0 +1,56 @@ +{ + "tooling_source": "7ec6a749b746af5a3ee5c903807c48cdd016d4da", + "base": "7d7306a", + "subprocess_checks": 129, + "malformed_fixtures": 35, + "all_15_guards_normal_O_OO": true, + "four_original_optimized_bypasses_reproduced": true, + "retained_complete_outputs_byte_identical": true, + "retained_incomplete_inputs_refused": true, + "no_numerical_campaign_executed": true, + "evaluator_hashes": { + "p1-adjoint": { + "path": "docs/plans/fluid-accuracy-composition/p1-adjoint/analyze.py", + "original_sha256": "c7ca75747b21d5e85d8f3efdfc116940cf5c95b3f26fd607f86842f3a75f75df", + "repaired_sha256": "aadb95d77aed509b45f01690e9c569b70f65ce45559398115db8bc86aa56193d", + "always_on_guards": 7 + }, + "p1-material": { + "path": "docs/plans/fluid-accuracy-composition/p1-material/analyze.py", + "original_sha256": "b62ae1a482998e4aef35e1343fc2ac006649142920d0f2911e60c66a1e0f9901", + "repaired_sha256": "06eb2ab3fbbe481ec32592a91be8f09c12b34d90813d8af7522c45d7659cb1a1", + "always_on_guards": 4 + }, + "q1": { + "path": "docs/plans/fluid-accuracy-composition/q1/analyze.py", + "original_sha256": "c41f7404e06e7171bd9b4e1623f0b175de56b98b0639e1e013603b826f28f5fb", + "repaired_sha256": "6af6b5b426139863522f311a869361f266f2ed222960486be89d343c64fa4a6b", + "always_on_guards": 2 + }, + "q2": { + "path": "docs/plans/fluid-accuracy-composition/q2/analyze.py", + "original_sha256": "025fb18a265b29b38d2ae0d7d8b0c67b9877562fbef1ad5dc65168814e351634", + "repaired_sha256": "f41da58439fe5da8218c3be917476d101f0894268cf9629ef217d9e4b79367fd", + "always_on_guards": 2 + } + }, + "archive": { + "path": "/workspace/rheon-evaluator-tooling-7ec6a74.zip", + "bytes": 1358394, + "sha256": "656a970c038e46c4909cdf669c123682dc0194a44dc4696018f96957dbaac5d6" + }, + "library": { + "library_file_id": "libfile_cb30e020d54c8191be14f053a2edee56", + "file_id": "file_0000000064a8823083db9d246cb22a4d", + "version": 0 + }, + "independent_review_sha256": "c028dd658006d24e8b1393c684a28c6eb481fd7aa1702094398ad138f509ea66", + "protected_archives_unchanged": { + "rheon-p1-planar-selection-39098e0.zip": "eb3a3886f80686cc97e9674ef65cb7af91b8d43b898d9d1af4f5bcd4d8f7a1fa", + "rheon-p1-adjoint-selection-e457ac1.zip": "7438979a93edca8830e9b5a92698a93665fdab1544ff42174fc51ed9cd15c658", + "rheon-p1-material-gate-3b609ee.zip": "52d1f4a718f70eba807195561d016eafbadc5c8ad297b06cd1071607988fd174", + "rheon-q1-grid-verification-b9a9d4c.zip": "bb32e9a749130115e44fa3c43aea5320f10d0cf5490ab4e3f74e81a702d43794", + "rheon-q2-grid-geometry-8b9c3b2.zip": "e386b3991b444d86600a68a403965a579b3a84db4f0e7d5b88af41771d45351f" + }, + "scientific_requalification": false +} diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/review.md b/docs/plans/fluid-accuracy-composition/evaluator-tooling/review.md new file mode 100644 index 00000000..1c06922d --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/review.md @@ -0,0 +1,24 @@ +# Independent evaluator tooling review + +Disposition: accepted as a tooling-only repair of the existing optimization-sensitive input guards. No remaining blocker within this repair's declared scope. This does not grant new scientific qualification or production admission. + +Reviewed active source in `/workspace/Rheon-evaluator` at `7ec6a749b746af5a3ee5c903807c48cdd016d4da`, with original evaluator bytes bound to parent base `7d7306a`. Reviewer made no source edits and executed no evaluator, solver, native test, or scientific campaign. Independent scripts parse source, hash files and inspect previously saved subprocess logs only. Review files are confined to this evidence subtree. + +`check_ast.py` independently verifies all eight manifest hashes and that each frozen file is byte-identical to `git show 7d7306a:`. It reverses only each promoted `require(condition, message)` expression to its original `Assert` node and removes only the new helper. The entire resulting program AST equals the original program AST for all four evaluators. There are 15 original guards (7 adjoint, 4 material, 2 Q1, 2 Q2), and no active `Assert` nodes. This establishes preservation of predicates, numerical formulas, thresholds, control structure and output schema beyond checking guard expressions alone. + +`check_results.py` independently inspects the expanded retained run at `/workspace/rheon-evaluator-evidence-expanded`. All 129 saved subprocess records have matching stdout hashes. All 35 malformed fixtures intentionally refuse in normal, `-O` and `-OO` modes with nonzero exit status, the explicit input-refused diagnostic and empty stdout. Together with the two retained incomplete matrices, this comprises 111 independently checked intentional refusals. All 15 distinct original guard IDs are actually reached in each of the three modes; no guard's coverage is inferred merely from another earlier cardinality failure. + +Complete retained P1-adjoint, P1-material and Q2-v2 outputs match their frozen normal-mode JSON byte-for-byte in each repaired mode. All four recorded original `-O` bypasses exit successfully with parseable JSON, preserving the vulnerability witnesses. The retained incomplete Q1 and header-only Q2-v1 matrices refuse under the original normal evaluator and all three repaired modes. All 13 retained input CSV hashes still match. The synthetic Q1 group fixture only supplies cardinality to reach an inner guard; its copied coarse rows are not native finest-resolution measurements or scientific evidence. + +The fixture set covers empty/truncated matrices, duplicate summary keys, same-total reassigned nested groups, wrong and reordered epsilon lists, nonfinite derivative/probe values, and zero/negative required site fields. This is an adequate discriminator for the declared assertion-to-always-on repair. It is not an exhaustive CSV schema, unique node identity or arbitrary physical-domain validator; those unchanged original limitations must not be presented as fixed. + +The new README accurately limits the result. Archived original evaluator bytes intentionally retain their historical assertions and must remain historical witnesses. Scientific campaign archives, negative findings and prior scope limits remain authoritative: P1 promotion stopped, Q1 transport incomplete, and Q2 finite-error geometry integration alone leaves five native aperture topology artifacts unresolved before active topology/DOF and coupled assembly. No new numerical method or acceptance threshold is supported by this tooling review. + +Replay the independent checks without executing an evaluator: + +```bash +python check_ast.py /workspace/Rheon-evaluator /tmp/fresh-independent-ast +python check_results.py /workspace/Rheon-evaluator /workspace/rheon-evaluator-evidence-expanded /tmp/fresh-independent-results +``` + +Scripts, JSON summaries and captured logs are retained alongside this review. `SHA256SUMS` binds the final independent deliverables. diff --git a/docs/plans/fluid-accuracy-composition/evaluator-tooling/test_contract.py b/docs/plans/fluid-accuracy-composition/evaluator-tooling/test_contract.py new file mode 100644 index 00000000..6cf29e60 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/evaluator-tooling/test_contract.py @@ -0,0 +1,187 @@ +"""Tooling-only replay; never executes a native numerical campaign.""" +import argparse +import ast +import csv +import hashlib +import json +from pathlib import Path +import subprocess +import sys + +parser = argparse.ArgumentParser(description=__doc__) +for key in ('adjoint', 'material', 'q1', 'q2_v1', 'q2_v2', 'output'): + parser.add_argument('--' + key.replace('_', '-'), type=Path, required=True) +args = parser.parse_args() +args.output.mkdir(exist_ok=False) +logs = args.output / 'logs' +logs.mkdir() +base = Path(__file__).resolve().parent.parent +hashes = json.loads((base / 'evaluator-tooling/evaluator-hashes.json').read_text()) +files = { + 'p1-adjoint': ['summary.csv', 'sites.csv', 'derivatives.csv'], + 'p1-material': ['summary.csv', 'probes.csv', 'nodes.csv', 'elements.csv'], + 'q1': ['channel-summary.csv', 'transport-summary.csv', 'geometry.csv', 'constant-controls.csv'], + 'q2': ['summary.csv'], +} +roots = {'p1-adjoint': args.adjoint, 'p1-material': args.material, 'q1': args.q1, 'q2': args.q2_v2} +records = [] + +def require(condition, message): + if not condition: + raise RuntimeError(message) + +def digest(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + +def invoke(label, owner, root, mode='', frozen=False): + script = base / ('evaluator-tooling/frozen/' + owner + '.py') if frozen else base / owner / 'analyze.py' + command = [sys.executable] + ([mode] if mode else []) + [str(script), str(root)] + result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (logs / (label + '.stdout')).write_bytes(result.stdout) + (logs / (label + '.stderr')).write_bytes(result.stderr) + records.append(dict(label=label, command=command, exit_code=result.returncode, + stdout_sha256=hashlib.sha256(result.stdout).hexdigest())) + return result + +# The promoted input predicates must be structurally identical to the frozen ones. +for owner, metadata in hashes.items(): + frozen = base / 'evaluator-tooling/frozen' / (owner + '.py') + active = base / owner / 'analyze.py' + require(digest(frozen) == metadata['original_sha256'], owner + ': frozen bytes changed') + require(digest(active) == metadata['repaired_sha256'], owner + ': new evaluator hash mismatch') + old_tree = ast.parse(frozen.read_text()) + tree = ast.parse(active.read_text()) + original = sorted((n for n in ast.walk(old_tree) if isinstance(n, ast.Assert)), key=lambda n:n.lineno) + calls = sorted((n for n in ast.walk(tree) if isinstance(n, ast.Call) and isinstance(n.func, ast.Name) and n.func.id == 'require'), key=lambda n:n.lineno) + require(len(original) == len(calls) == metadata['always_on_guards'], owner + ': guard count') + require(not any(isinstance(n, ast.Assert) for n in ast.walk(tree)), owner + ': active assertion remains') + require(all(ast.dump(a.test) == ast.dump(b.args[0]) for a,b in zip(original,calls)), owner + ': changed scientific/input predicate') + +input_before = {str(root / name): digest(root / name) for owner, root in roots.items() for name in files[owner]} +input_before[str(args.q2_v1 / 'summary.csv')] = digest(args.q2_v1 / 'summary.csv') + +# Real retained complete campaigns: byte-identical JSON, including negative findings. +for owner in ('p1-adjoint', 'p1-material', 'q2'): + baseline = invoke(owner + '-frozen-normal', owner, roots[owner], frozen=True) + require(baseline.returncode == 0, owner + ': retained baseline unexpectedly refused') + json.loads(baseline.stdout) + for mode in ('', '-O', '-OO'): + result = invoke(owner + '-retained-' + (mode or 'normal'), owner, roots[owner], mode) + require(result.returncode == 0 and result.stdout == baseline.stdout, owner + ': retained output changed ' + mode) + +# Incomplete retained native matrices remain refused; no substitute full Q1 run. +for owner, root, label in [('q1', args.q1, 'q1-incomplete'), ('q2', args.q2_v1, 'q2-v1-empty')]: + require(invoke(label + '-frozen-normal', owner, root, frozen=True).returncode != 0, label + ': old refusal lost') + for mode in ('', '-O', '-OO'): + result = invoke(label + '-' + (mode or 'normal'), owner, root, mode) + require(result.returncode != 0 and b'evaluator input refused:' in result.stderr and not result.stdout, label + ': incomplete matrix accepted') + +malformed = [] +def fixture(owner, label, change): + root = args.output / 'fixtures' / label + root.mkdir(parents=True) + tables = {} + headers = {} + for name in files[owner]: + with (roots[owner] / name).open(newline='') as handle: + reader = csv.DictReader(handle) + headers[name] = reader.fieldnames + tables[name] = list(reader) + change(tables) + for name in files[owner]: + with (root / name).open('w', newline='') as handle: + writer = csv.DictWriter(handle, fieldnames=headers[name]) + writer.writeheader() + writer.writerows(tables[name]) + malformed.append((owner, label, root)) + return root + +for owner in files: + fixture(owner, owner + '-empty', lambda t: [v.clear() for v in t.values()]) + fixture(owner, owner + '-truncated', lambda t: t[next(iter(t))].pop()) + +def bad_adjoint_eps(t): + t['derivatives.csv'][0]['eps'] = '9e-6' +fixture('p1-adjoint', 'adjoint-epsilon', bad_adjoint_eps) +def bad_adjoint_field(t): + t['sites.csv'][0]['mass'] = 'nan' +fixture('p1-adjoint', 'adjoint-nonfinite', bad_adjoint_field) +def bad_material_eps(t): + t['probes.csv'][0]['eps'] = '9e-6' +fixture('p1-material', 'material-epsilon', bad_material_eps) +def bad_material_groups(t): + t['summary.csv'][1] = t['summary.csv'][0].copy() +fixture('p1-material', 'material-duplicate', bad_material_groups) +def bad_adjoint_groups(t): + t['summary.csv'][1] = t['summary.csv'][0].copy() +fixture('p1-adjoint', 'adjoint-duplicate', bad_adjoint_groups) +def bad_q2_group(t): + t['summary.csv'][0]['mu'] = '0.2' +fixture('q2', 'q2-refinement-group', bad_q2_group) + +# Independently exercise nested guards with top-level row counts preserved. +def reassign(table, field): + table[0][field] = 'false' if table[0][field] == 'true' else 'true' +fixture('p1-adjoint', 'adjoint-site-group', lambda t: reassign(t['sites.csv'], 'perturbed')) +fixture('p1-adjoint', 'adjoint-derivative-group', lambda t: reassign(t['derivatives.csv'], 'perturbed')) +fixture('p1-material', 'material-probe-group', lambda t: reassign(t['probes.csv'], 'perturbed')) +for value in ('nan', 'inf', '-inf'): + fixture('p1-adjoint', 'adjoint-derivative-' + value, lambda t, v=value: t['derivatives.csv'][0].__setitem__('energy_error',v)) + fixture('p1-material', 'material-probe-' + value, lambda t, v=value: t['probes.csv'][0].__setitem__('energy_fd',v)) +for field in ('y', 'mass', 'rho', 'volume'): + for value in ('0', '-1'): + fixture('p1-adjoint', 'adjoint-positive-' + field + value, lambda t,k=field,v=value:t['sites.csv'][0].__setitem__(k,v)) + +def reorder_eps(t, filename): + key_fields = ('map','n','perturbed','hydro') if filename=='derivatives.csv' else ('perturbed','hydro','deformed','translation') + first = t[filename][0] + ids = [i for i,r in enumerate(t[filename]) if all(r[k] == first[k] for k in key_fields)] + i,j=ids[:2] + t[filename][i],t[filename][j]=t[filename][j],t[filename][i] +fixture('p1-adjoint','adjoint-epsilon-order',lambda t:reorder_eps(t,'derivatives.csv')) +fixture('p1-material','material-epsilon-order',lambda t:reorder_eps(t,'probes.csv')) + +def q1_bad_group(t): + # Synthetic table cardinality ONLY: copied coarse summary rows are explicitly + # not native64 measurements and cannot serve a scientific gate or result. + for row in list(t['transport-summary.csv']): + if row['n']=='32': + copy=row.copy();copy['n']='64';t['transport-summary.csv'].append(copy) + for name in ('translation-final','vortex-initial'): + row=next(r for r in t['geometry.csv'] if r['name']==name and r['n']=='32').copy() + row['n']='64';t['geometry.csv'].append(row) + for row in list(t['constant-controls.csv']): + if row['n']=='32': + copy=row.copy();copy['n']='64';t['constant-controls.csv'].append(copy) + require(len(t['transport-summary.csv'])==18 and len(t['geometry.csv'])==9 and len(t['constant-controls.csv'])==18,'synthetic Q1 cardinality helper') + t['transport-summary.csv'][0]['requested_courant']='0.2' +fixture('q1','q1-synthetic-cardinality-only-bad-group',q1_bad_group) + +# Reproduce optimization bypass of the ORIGINAL evaluators as tooling evidence. +def material_subset(t): + row = next(r for r in t['summary.csv'] if r['hydro']=='true' and r['deformed']=='false') + keys = ('perturbed', 'hydro', 'deformed') + t['summary.csv'] = [row] + t['probes.csv'] = [p for p in t['probes.csv'] if all(p[k] == row[k] for k in keys)] + t['nodes.csv'] = t['nodes.csv'][:1] + t['elements.csv'] = t['elements.csv'][:1] +material_bad = fixture('p1-material', 'material-subset', material_subset) +adjoint_bad = next(root for owner,label,root in malformed if label == 'p1-adjoint-empty') +q2_bad = next(root for owner,label,root in malformed if label == 'q2-truncated') +for owner, root in [('p1-adjoint',adjoint_bad),('p1-material',material_bad),('q1',args.q1),('q2',q2_bad)]: + bypass = invoke(owner + '-original-O-bypass', owner, root, '-O', frozen=True) + require(bypass.returncode == 0, owner + ': expected old optimization bypass not reproduced') + json.loads(bypass.stdout) + +for owner, label, root in malformed: + for mode in ('', '-O', '-OO'): + result = invoke(label + '-refusal-' + (mode or 'normal'), owner, root, mode) + require(result.returncode != 0 and b'evaluator input refused:' in result.stderr and not result.stdout, label + ': malformed input accepted or incidental failure') + +require(all(digest(Path(p)) == value for p,value in input_before.items()), 'retained CSV bytes changed') +report = dict(evaluator_hashes=hashes, subprocess_checks=len(records), malformed_fixtures=len(malformed), + original_optimized_bypasses_reproduced=4, retained_complete_outputs_identical=True, + retained_incomplete_matrices_refused=True, normal_O_OO_malformed_refusals=True, + retained_input_sha256=input_before, no_native_campaign_executed=True, records=records) +(args.output / 'report.json').write_text(json.dumps(report, indent=2) + '\n') +print(json.dumps({k:v for k,v in report.items() if k not in ('records','evaluator_hashes','retained_input_sha256')}, indent=2)) diff --git a/docs/plans/fluid-accuracy-composition/execution-ledger.md b/docs/plans/fluid-accuracy-composition/execution-ledger.md index dced4e1f..91ef8a83 100644 --- a/docs/plans/fluid-accuracy-composition/execution-ledger.md +++ b/docs/plans/fluid-accuracy-composition/execution-ledger.md @@ -17,3 +17,366 @@ Next implementation slice remains G1. Method-selection and experimental-validati - Opened draft PR120 from content commit 788d5e5163d7153b726b71a7168da9311bc60850. Final gate inspection found root source-inventory recursively rejects extra Lean files, so opt-in proofs moved beside the plan; root checker/inventory remain unchanged. Requalified final paths and recorded the correction rather than weakening the gate. - Final plan-local kernel run returned exit 0: both modules, 25-declaration audit and 3 negative probes passed; unchanged root exact-source/dependency gate passed. P0 proposal/proof artifact accepted for delivery in draft PR120; production stays Deferred, next G1 unstarted. + + +## 2026-10-20 — G1 admitted + +Explicit user implementation direction resolves prior G1 deferral. Frozen main remains bc2f472, PR115 included; protected audit119/plan120/pressurewarmstart59 untouched. New branch implement/g1-native-workflow-20261020. Source discovery required the bounded write-set correction recorded in plan.md before edits. Additive workflow controls/terminal profiles preserve current archives. Native interaction and performance remain prospective; no physical/GPU claim. + +Independent architecture review caught incomplete cancellation/fallback observation and incomplete request-control identity before qualification. Bounded re-plan in plan.md admits existing provider dispatcher/workspace observation hooks and an internal source accessor; no numerical-method change. Rejection, fallback initiation and cancellation remain distinct observed facts. + +### G1 core observation checkpoint + +Seven focused core contracts pass: actual candidate/fallback/appliedzero, short actualdt and exact baseline trajectory, before/after/in-stage cancellation and immutable state, canonical actual control/native state identity, illegal prefix/crossfield/limit rejection. Independent architecture review passes after reproducing and correcting missing-node, nativeRHS, cancellation and partial-diagnostic defects. Eight additive persistence contracts and sixty existing persistence integration tests pass independently; separate persistence review has no remaining findings. Native UI and fixed capture+cachedprojection budget remain pending; no G1 acceptance asserted. + +### G1 source implementation checkpoint + +Additive RCP4/RCT2 custody and native canvas/text/details/evidence integration are implemented. Independent architecture and persistence reviews pass; native UI source review has no remaining findings after six focused real-egui interaction/cache tests pass. Existing worker/runtime/producer-exit and old persistence contracts pass. Source moved Active → Implemented, then `verify` → Verifying. Actual native display workflow and fixed release capture+projection budget remain pending and must pass before acceptance. The core observation checkpoint b3db38d is pushed; the branch remains retained for the repository lead, with no merge/cleanup action. + +### G1 measured budget and retained native evaluation + +Source checkpoint bc494c1 is pushed in draft PR122 against plan120. Broad CPU run passed 597 tests in 74 suites with zero failures; current workflow contracts passed 15/15, existing persistence integration 60/60, strict all-target library/desktop Clippy and formatting passed. The first frozen release capture-plus-validated-projection evaluation passed: 30 paired intervals after five warmups, 0.4037% median added time against the unchanged 5% threshold, bitwise identical accepted native state after every pair. Independent reviewer recomputed raw hashes/math and approved the limited CPU workload claim; no optimization or criterion change was needed. + +The first actual normal-App run is retained as failed at `/tmp/rheon-native-display/failure-bc494c1`: live configured fallback was reached, but End/Left selection observation failed. Product versus isolated Xorg keyboard-map cause remains under investigation; stronger key-release/idle-frame event coverage passes. No native acceptance is asserted. G1 stays Verifying and PR122 stays draft. The 00:41 executor disconnect was transient: subsequent read/write/check calls succeeded; no worker or test was duplicated. Details and exact evidence hashes are in reports/g1-qualification.md. + +### G1 native verification finding — bounded repair + +In an explicit evdev XKB display environment, the unchanged bc494c1 binary passed actual pointer/keyboard/focus, exact live fallback interval and retained evidence selection, actual candidate/accepted residuals/limits/units, real cancellation (run 6, attempt 22, accepted generation 21, no publication), provider-absent cold reopening with identical run 4/ordinal 2 controls and archive hash, and owned App/provider cleanup. Independent native reviewer confirmed these observations. The first failed keyboard evaluation remains retained without a confirmed causal claim. + +The same review found the evidence window can exceed the 1000-pixel display because a multiline provider-binding Debug dump has no scroll area, hiding lower retained fields and Close. G1 returns Verifying → Active to repair only this bounded UI within its frozen write set. Add bounded scrolling/compact binding display and an overflow/close regression, then independently review and return Implemented → Verifying with a fresh source-bound native procedure. No numerical, archive, or acceptance-criterion change is admitted; PR122 stays draft. C1 readiness remains dependent on final G1 qualification. + +The repair now uses a viewport-relative bounded evidence body, compact hex provider identities and a footer Close outside the scroll area. A real configured receipt with bounded long binding values at 1000×600 verifies RHS initially offscreen, visible after real wheel scrolling and pointer-close with the workflow still open; key-release/idle-frame End/Left coverage also passes. All nine active workflow UI cases pass, two opt-in helpers remain ignored. Independent native reviewer approved the exact repair source. G1 returns Active → Implemented → Verifying; a fresh source-bound normal-App run and release budget evaluation remain required before acceptance. + +### G1 actual cold pointer/pan finding + +Checkpoint 3a86991 was pushed and built as the ordinary source-declared native binary. Fresh native interaction confirmed the bounded evidence repair, numerical details, live pointer/keyboard, real early cancellation (attempt 2 after accepted generation 1, no publication) and clean App exit. Partial screenshots and condition-wait diagnostics are retained separately; none constitutes full acceptance. The 00:56:43 disconnect callback did not lose source or processes: access checks found clean 3a86991 and the original App/driver active; work resumed without duplicate workers/runs. + +Actual cold interaction again showed canvas pan reaching Publication while details stayed Geometry. Independent pixel analysis identified the pan vector as exactly the pointer relocation from the previous control to the clicked node. A focused regression reproduced it: prior pointer at archive trigger (87,990), then pointer-move plus node press in one frame changed pan by (190.1,−635.5) before child hit testing. This is a product background/node gesture conflict, not resolved by keyboard-map changes or merely waiting for screenshots. G1 returns Verifying → Active for a bounded repair: retain actual press origin and initial pan, admit only background-origin gestures, and derive movement from the held pointer. Preserve node click/held movement without panning and actual background drag. Same source write set and unchanged acceptance criteria; no numerical or persisted-profile edits. Fresh independent review and source-bound native/performance evaluation follow. + +The gesture repair is implemented and independently approved: background-origin ownership, held displacement from actual press, exclusion of node origins, and disposal on release/reset/open/close or source invalidation. All eleven active workflow UI cases pass, zero fail; the two opt-in helpers remain ignored. Regressions include the exact 1600×1000 archive-trigger relocation, coalesced click/release/End with idle frames, node-held movement without pan, actual background displacement and invalidation during a held gesture. G1 returns Active → Implemented → Verifying. Final normal-App and fixed budget evaluations use the next source checkpoint, with native procedure starting only after both builds finish. + +### G1 accepted; bounded C1 preparation complete + +Implementation checkpoint `f6b7c8cd4628f6939c41567cecdf4a5231f60386` is pushed. Final fixed release evaluation passed 30 pairs after five warmups: 1.880860% median capture plus validated cache adoption against unchanged 5%, identical accepted native state after every pair. Independent architecture reviewer verified raw/binary/source hashes, workload, variability and order; PASS. + +After all builds completed, the same-source ordinary native binary passed the full normal-App live/evidence/numerical-details/cancel/close/provider-absent-cold/close-reopen workflow. Independent native reviewer verified 73 original artifact hashes, 22 accepted captures, exact unchanged run 4/ordinal 2 archive and controls, actual cancelled run 6/attempt 12 after accepted 11 with publication None, source/binary binding and complete owned App/provider/display absence. Drivers and live/cold App/display supervisors exited zero. No individual provider PID was sampled; only observed cleanup facts are claimed. Transient callbacks caused no observed work/process loss or duplicate runs. Failed prior evaluations remain retained alongside final evidence under `/workspace/rheon-g1-evidence`; actual archives and recorded executables are preserved there too. + +G1 transitions Verifying → Accepted, limited to G1-C/G1-U and the recorded performance scope. Claim register and visibility-gap disposition are synchronized; numerical F1–F8/physical/GPU/learned claims are unchanged. Source evidence and failure dispositions are in reports/g1-qualification.md, reports/g1-review.md and reports/g1-manifest.json. + +Only after G1 qualification, prepared reports/c1-readiness.md: C1-A Planned/dependency-ready with frozen two-module/declaration-only write set, existing pressure-v1/native-owner adapters, distinct family states, separately gated projection/whole-MAC candidates and explicit unavailable transfers. Independent architecture/contracts preparation review PASS; requested canonical G1-Accepted/C1-A-Planned status synchronization completed. C1 source implementation/acceptance is not claimed. P1/Q1 native method/reference work remains independent; repository lead coordinates shared declarations/status and all stacked-PR integration. No merge, protected-branch modification or branch cleanup performed. + + +## 2026-10-20 — C1-A admitted on separate branch + +User explicitly directs continuing C1-A implementation after G1 local qualification. Preserved PR122 branch/head67ef1e9, tested sourcef6b7c8c and pending hosted CI/stacked dependency. New branch implement/c1a-typed-native-boundary-20261020; fetched main remainsbc2f472. No merge/cleanup. C1-A Planned → Active. Frozen reports/c1a-protocol.md precedes source/evaluation and names exact write set, native identity+generation guards, typed family snapshots, unavailable subgraph/whole/transfer requests, deciding classical fixtures and independent review. Shared declaration-only changes and unchanged public interfaces reported before edits; numerical Q1/Q2 owners/formulas/fixtures remain independent. Root serially owns shared files; native worker owns only new native-family module/tests. Repository lead owns cross-proposal integration. + +### C1-A implemented, verified and locally qualified + +Source checkpoint 5c9fb96 implements only the two new bounded modules/tests and existing module declarations. C1-A Active → Implemented → Verifying. PressureStageV1 delegates the unchanged pressure-v1 dispatcher; qualified pressure is borrowed, with the original report. NativeSession borrows MAC or particle-preview owners, guards family then declared run/source identity then generation, and delegates baseline steps without a second state/history/clock. Subgraph/whole-family replacement and both transfer directions remain typed unavailable. No numerical, geometry, existing particle formula/physical fixture, persistence, process or UI edit; new adapter tests reuse fixed native fixtures. + +Deciding fixed tests passed: 12 no-default in49.05s and 12 default in53.49s, including 100 bitwise MAC intervals, native particle shortening/diagnostics and classical adversarial providers on both native pressure methods. Existing eight contract targets passed33, failed0, ignored3 artifact-dependent real-model cases. Two borrowed-result/snapshot compile-fail Rustdoc cases passed. Initial strict lint findings were a large by-value report enum and a complex test tuple; no numerical failure. Final checkpoint ac6ed17 adds a narrow allocation-avoiding enum allowance, named observation fixture and stronger exact early-cancellation assertion. All11 affected tests pass in each configuration; separate unchanged100-interval runs passed on exact final source in both feature configurations (46.94s no-default,48.26s default), completing all12 final-source cases in each. The initial no-default run preceded only declaration-order formatting and is retained with that attribution. Final strict all-target Clippy passes for no-default and desktop, formatting passes. Independent architecture and contracts review PASS at ac6ed17, no material findings or blockers; reviewers ran no duplicate builds. + +C1-A Verifying → locally Accepted, integration pending, limited to the frozen adapter/facade contracts. Reports/c1a-qualification.md, c1a-review.md and c1a-manifest.json retain precise source/command/results and claim exclusions. Draft PR125 is stacked on retained unmerged PR122; no merged/release G1 or C1 acceptance is implied. C1-R, C1-B/C, transfers, learned, numerical/physical accuracy, GPU, GUI and new performance remain unaccepted by this slice. No native display work or physical test is invented. Separate Q1/Q2 numerical ownership remains unchanged; repository lead owns hosted CI and stacked integration/merges. No merge, rebase, protected branch edit or cleanup. + + +## 2026-10-20 — repository integration and numerical-route reconciliation + +The lead fetched actual remote heads without pruning and inspected the current open PRs. Main remains bc2f472787060d9a69cb619ed2c2fea10fd754b6; audit119/3d2bc4e and plan120/8422f77 have independent artifact-scope approval and green exact-head checks. G1 remains PR122/67ef1e9 on plan120; C1-A remains PR125/91b2038 on G1, with final Rust source ac6ed17. Neither is merged. Their local native/contract claims retain their original scope and raw-evidence ownership. + +Separate numerical admissions and unchanged source-bound campaigns are reconciled from PR121/a64d4d3, PR123/bc2573f and PR124/9d84f66. The two wall adaptations and later static alternatives did not pass their respective gates. The coherent material reference closes a bounded 1D algebra question without supplying a particle production formulation. The prior P1 production-selection direction is Superseded by the existing-grid Q1→Q2 route; the numerical owner is actively implementing Q1, with Q2 direction Planned pending Q1 and its own frozen assembly contract. P2 remains Deferred, not silently converted into a material seeder. No criteria, failed data, method, executable or frozen campaign manifest was rewritten. + +Integration checks found two independent blockers: PR122's Pages source-admission step refuses the stale complete inventory before numerical evaluation, and the PR123/124 Python evaluators can accept incomplete synthetic input under optimization. The former needs a reviewed current closure plus fresh committed native/rational qualification; the latter needs a separately qualified fail-closed input-guard correction, preserving original frozen results. Details and exact heads are in reports/integration-20261020.md. + +Automatic approval review rejected attempted PR119 and PR120 merges, applying the earlier trusted no-merge delegation rather than accepting the later delegated instruction. No merge occurred and no alternate execution path was used. Direct approval has been requested. PR119 was restored to its original draft status; PR120 is review-ready with all observed checks passing. Shared status documentation and read-only review continued independently. + +Reconciliation write set: plan.md, issues.md, execution-ledger.md, reports/verification.md (status cells only), and reports/integration-20261020.md. Task-owned branch integration/fluid-route-status-20261020 at admitted C1-A head91b2038 provides isolation from all three original owner worktrees and both implementation owners. Production source, numerical examples, analyzers, old manifests, proofs, dependencies, workflow gates and PR59 remain unchanged. The review branch is retained for serial integration; no unrelated local or remote ref is deleted. + +Before publication, a fresh remote read found newly delivered Q1 PR126 at dfcc693bf8b66678a924e4a92d299127f6746526, stacked on PR124. Scientific freeze b9a9d4ca3ff02c9eae38eb20dced49e87a923380 adds periodic represented-volume support in the existing owner. Its single campaign retains only12/18 trajectories, n64 source-quadrature exhaustion and three one-ulp Full-control refusals; no retry/clamp or finest accuracy claim. Canonical Q1 is therefore Implemented with incomplete evaluated qualification, superseding this session's earlier Active observation. Q2 is Planned only for a separately frozen common-geometry prerequisite; coupled Stokes/transport acceptance is not implied. The Q1 evaluator shares the assertion-dependent pattern; no separate optimized-Python counterexample is claimed for it here. + +Independent G1 source review produced a medium, unexecuted iteration-count consistency counterexample in new workflow validation. The recorded local tests and native evidence remain historical facts, but current G1-C is reopened pending owner disposition and integration; G1-U retains its recorded environment scope. No production correction is made by this documentation slice. + +Object-only merge preview of C1-A91b2038 and Q1dfcc693 completed without conflicts at tree dbccbf5c0002c33a059e9a355bd25793a9411134. No ref/worktree changed; this is text-integration evidence only, not a replacement for qualification of the eventual combined committed source. + +Final live dependency inspection before handoff found two newer draft proposals: Q2 PR127/ea6a5f12e942692860f85c93b0b48fd2d08c551c on126, and C1-B1 PR128/f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a on125. The first implements a private versioned planar common-geometry reference with post-run review pending; the second implements supplied-array projection qualification with supporting/final review pending. Canonical status is updated to these owner-reported Implemented/Verifying boundaries, preserving Q2 version-1 refusal and all full-Stokes/provider-invocation/Session/physical exclusions. Root's own draft PR129 remains five-file documentation only, stacked on125; no implementation is duplicated and no acceptance is inferred from unfinished checks. + +A subsequent explicit interface relay and live read confirmed C1-B1 final documentation43a084a66bdfb3731b24bd480909c81e317b1e53 on unchanged tested sourcef161d1a. Both feature configurations, supporting contracts/doctests/strict checks and final architecture/contracts dispositions now pass within supplied-array qualification. Three final evidence documents are the only delta from the tested source. Canonical C1-B1 status is locally qualified, hosted integration pending; independent fixed-input requests are not integrated trajectories. The unchanged operator/workspace/validation/SessionIdentity interfaces do not overlap Q1's LiquidVolumeState extension; no shared-interface conflict was identified in the inspected write sets. Full C1-B/R still requires native invocation/Session/custody/lifecycle and integrated trajectory evidence. + + +## 2026-10-20 — fixed complete-source admission and fresh qualification + +Complete independent admission review covers135 regular selected inputs (11 added / 16 changed / 108 unchanged / 0 removed), including the exact PR131 iteration repair `34e2e73` and PR130 evaluator guards `c2fbbea`. Final handoff `97cdce6` is retained. A fixed stage excludes the active Q2 boundary repair; P1 remains stopped, Q1 accuracy incomplete, and Q2's five native aperture topology artifacts continue to block assembly. The established explicit v3 refresh preserves all prior review text, frozen predecessor bytes, primary tree, selector and refusal checks. Final independent review approves inventory/review bytes committed together at `9c04278`. + +Fresh unchanged native/rational qualification on clean `9c04278`/treeb2008a22a65246c5a38c632437c1acc30a8cb27a passes 18 commands,35 Rust tests and five native specimens with independent rational/adversarial checks. A fresh real packet passes 26 tests normally and 26 under `-O` with no skips. Separate focused composed no-default tests pass 72 (23 workflow, 9 native-family, 14 composition, 23 volume, 3 borrow-doctests), zero failures/ignores. Actual raw receipts/logs/ELF/packet/archive and exact hashes are bound in reports/native-admission-20261020/qualification.json; its report states source/environment and limits. No new desktop/native-window/performance/Lean/learned/physical claim follows. Canonical G1-C records the repaired locally verified stage while hosted integration remains pending. Bound admission/review bytes stay fixed; outcomes are written separately. + +After direct merge confirmation, the same previously blocked ready plan action succeeded: PR120 merged 193d86ce1a06f4585208226069b41c619e530a00. Ready independently reviewed audit119 then merged 718469beedb9a949f4bb6f3299c7b880b4c47e47 after all eight observed checks and a conflict-free merge preview. GitHub/remote main confirm both. PR122 retargeted main before any branch cleanup; no source branch was deleted. Retaining actual main ancestry in private `afa6191` produced the identical qualified tree. Executed evidence remains bound to `9c04278`; subsequent result/status documentation is a descendant, not relabelled source execution. All original protected worktrees/local heads/config and PR59 remain unchanged. + + +### Roadmap priority amendment + +The user's 2026-10-20 direction sets voxel/grid qualification first, a future particle solver plus particle-to-surface mesh reconstruction second, and a Lagrangian finite-element-style solver family later. The particle generator produces a 3D surface from the point cloud; that output mesh is distinct from a later material volume/connectivity mesh and does not imply solver-state transfer. The canonical roadmap records both future phases as unimplemented/unqualified, retains all failed particle campaigns, and continues current grid correctness/admission repairs without starting a third family. + + +## 2026-10-20 — separate exact-reference Cargo closure and fresh qualification + +Fixed PR133 remains at `8bf542e` with actual execution `9c04278` unchanged. A separate dependent worktree/branch integration/q2-reference-admission-20261020 retains exact PR132/e6525a1 and PR134/f84f651. Complete independent source/dependency review approves 135 selected inputs: 0 added, 2 Cargo changes, 133 unchanged, 0 removed. All previous registry identities/checksums remain; three new locked dev identities and actual official archive/license bytes were reviewed. Existing v3 schema/base/predecessors/primary/selector/refusals and prior bound review prefix remain exact. Metadata commit ba16197 and independently reviewed protocol-spacing-only follow-up `9a9904f` precede qualification; no history rewrite or later bound-metadata edit. + +Clean `9a9904f`/tree `488ab45` passes all 18 unchanged native qualifier commands (35 Rust tests, five fresh native/rational/adversarial specimens, gate 5+5 and oracle 10+10), a new actual packet with 26 normal+26 optimized tests/no skips, and 83 focused no-default checks (23 workflow, 9 native-family, 14 composition, 23 volume, 3 doctests, 2 coupled-reference, 9 exact-geometry). Actual executable/receipt, 1472 committed source identities, 60 raw evidence files, environment and exact commands are retained. The known fixed five-artifact regression completed normally in the 186.08s geometry suite; no scientific campaign was rerun. Independent execution audit verifies all selected/full source and archive/ELF hashes with no findings. Raw 913699-byte ZIP SHA256 fa0db9c9e6f98a8c2d98b89967053537c8a2e74237c34276c84614b76bbff16c is saved privately in Library as libfile_3ee285ef166c8191b648475efb676b1c/version0. Detailed protocol, compact manifest, source and final reviews are in reports/q2-admission-20261020/. + +PR132's fixed-corpus exact topology result and PR134's eight aligned coupled-algebra cases remain attributed to their own tested sources `0f4e7e0` and `06b3190`. General cut/free-surface velocity spaces, extension, physical traction/boundary lift and coupled PDE/production-water gates remain with the numerical owner. PR136/e56bc7b C1-B2 runtime/custody is delivered separately; its 140-input admission and assigned legacy G1 cancellation-label repair are pending and excluded here. The grid→particle/output-surface→later Lagrangian priority remains unchanged. + +After independent readiness and nine green checks, automatic approval rejected PR121 and the single requested retry, applying the original trusted no-merge delegation over tool-relayed confirmation. PR121 remains unmerged; no alternate path or further retry was used. Earlier verified PR120/119 merges remain facts. Public merges are paused; review, evidence publication and independent admissions continue without changing another owner's implementation. + +A later exact remote read confirms draft PR135 at 4f8bd22669efed62e84c0062ee1baec27393e830, frozen numerical source 6d99e7794a6aa69f5886bb15cc662e40ea43cd40, stacked on 134. The owner reports four native CV1 fixtures plus independent exact reconstruction, ten contracts in each debug/release configuration, strict Clippy/format and 45 evaluator checks passing. This qualifies only bounded cut-cell operators/physical traces. Square mass condition 6.53e11 leaves coupled conditioning, mixed-pair stability and PDE accuracy open, with the next bounded gate assigned to the numerical owner. PR135 is excluded from the 135-input 9a9904f execution and no physical criterion is changed. + +Final independent documentation review clarifies that the later reproduced legacy G1 advection-cancellation label defect also exists in unchanged fixed `9c04278`/`9a9904f` paths: no publication occurs, but the attempt is labelled Failed despite cancellation. Passing 23 workflow tests do not resolve that uncovered path. Full G1-C outcome-label acceptance remains open; only the assigned repair and new B2 source are excluded from these fixed qualification subjects. + + +## 2026-10-20 — stable closed projection and cancellation admission + +Q2 publication is retained in draft PR138/a6bfcc9 at its actual executed source +`9a9904f`; fixed PR133/8bf542e remains unchanged. Before any C1 execution, the +parent delivered final PR137/d3e6237 (tested `70da36d`) and instructed use of that +stable repair over PR136-only pins. The uncommitted PR136-only metadata/protocol +draft was retained outside Git as superseded preparation, with no transferred +qualification receipt. The task branch fast-forwarded to the retained owner head. + +Independent full-source and three-pin follow-up reviews approve 140 inputs: +5 added / 11 changed / 124 unchanged / 0 removed versus fixed PR133; 137 identities +remain exact PR136. The production repair is only three typed cancellation matcher +lines; true numerical failures and historical Failed labels remain. Map SHA256: +`08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6`. +Inventory SHA256: +`a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df`. +Bound review SHA256: +`caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941`. +The original 9e583 review remains an exact prefix; predecessor inventories and +all mechanism/Cargo/primary bytes remain. Eight independently reviewed paths +commit at clean `186dc0a`/tree `3c19a1c` before fresh qualification; those bound +bytes freeze. Driver review replaced optimization-sensitive guards and required +exclusive new evidence outputs plus exact 26/no-skip packet cardinality before +execution. Resource-only disposition retired the lead's old reconstructible 9c +and later Q2 build caches after verifying retained actual ELFs and raw archives; +source, real evidence, criteria and other owners' resources remain unchanged. + +Actual results, executable/command/archive identities and independent reviews are +retained separately in reports/c1b2-admission-20261020/qualification.md and its +compact manifest. They qualify closed native invocation/Session/custody and the +current cancellation classification only; owner 213/226 executions keep their +original sources and overlap. Hosted/default/desktop/release/GUI/performance, +physical/model/Lean/GPU acceptance and full C1-R remain separate. C1-B3 is a next +readiness recommendation requiring its own admission, not started implementation. +Public merges remain paused by PR121's automatic review rejection; no alternate +path or further retry is used. + + +### Later live owner deliveries after PR141 publication + +Draft PR141 publishes the separately qualified 186dc0a stage. A subsequent live +read is pinned to PR139/d857523 and PR140/9ddf8d2. PR139's source-pinned report +qualifies the static CV2 reference at numerical source b0a9d52: all 24 fixed cases, +independent exported-target/exact-integral 80/120-digit comparisons, 15 contracts +in each debug/release mode and 45 evaluator checks pass. The six unscaled square +velocity-accuracy failures remain retained despite passing residuals. Original +mass conditioning remains about 6.53e11; generic stability/PDE/evolving geometry +and production gates stay open. This is attributed owner evidence; root did not +rerun the campaign or rehash its raw archive here. + +PR140 implements/verifies separate closed C1-B3 producer selection on PR137. +Its current head adds one desktop test API correction after core `4af3802`. The +owner retains an initial 94-pass/1-failure old-profile foreign-version refusal- +category result, a bounded repair and 14 passing focused persistence checks; +its full qualification is rerunning and final local acceptance is pending. +Its complete 140-input closure changes eight pins versus PR137. Earlier readiness +language is historical to the 186dc0a cut; delivery is now Implemented / Verifying, +not lead-accepted. Neither new source is admitted or included by this fixed +qualification. No duplicate implementation, run or source-map refresh is started. + + +### Final owner deliveries and next numerical admission + +Final live reads confirm PR139 `902f6092de6044419d028f92dabd8e59ae7a87ba` +and PR140 `5dc1741feffa88b857194559b3e7e79be5369a64`. PR139 retains numerical +source b0a9d52, all 24 fixed static cases,15 debug + 15 release contracts and 45 evaluator +checks passing, maximum independent velocity error 1.8612165e-12 against 1e-10, +six unscaled square accuracy failures and original mass condition 6.53e11. This +is owner evidence; no lead raw campaign rerun or archive rehash is claimed. + +PR140 reports 227 passing / 0 failing / 5 existing ignored at core4af3802 and consumer9ddf8d2 +(one UI-test public API correction). Its 200 actually selected intervals use the +same-producer bitwise baseline; genuine low-cap fallback/failures/cancel/cold +custody pass. Initial compile and old-profile refusal-category failures remain +retained. Full 140-input closure/eight changed pins, independent source admission, +fresh lead qualification and exact-head hosted gates remain separate. No new +composition implementation, stateful/learned/external or whole-family scope is +admitted. Earlier snapshot records above remain historical. + +The next numerical milestone is prospectively admitted [CV3-A](reports/cv3a-admission.md): +static polynomial polygon MMS on nine frozen cases, n16 helper and degree4-exact +load prerequisite reviews, independent norm/reference uncertainty and hard +resource freeze before one campaign. Resume the existing numerical owner for +preparation only until those gates pass. No pilot evaluation exists; canonical +disk, generic stability/PDE, moving geometry and production remain unqualified. + + +### Separate final C1-B3 admission and fresh execution + +Normal local composition retains exact PR140/5dc1741 and fixed PR141/38c40ca, +including qualified186dc0a ancestry. Independent review approves all 140 inputs: +eight changed, 132 unchanged, zero added/removed. All ten changed source/public +test paths are reviewed. Explicit v3 admission preserves the exact prior review +prefix. The corrected protocol distinguishes recoverable producer errors from +existing B1 field/momentum fallback and unpublished mixed-pressure witness failure. +Commit `3b3b667a8b81942a3ca95c7531b29525ac4494b2` freezes inventory 8cc04634, +review a4e27e36, protocol 1a0191d9 and driver 797cf449 before execution. + +Fresh unchanged native/rational qualification passes all 18 commands: 35 Rust +contracts, five specimens, gate 5+5 and oracle 10+10. A new real packet passes 26 +normal and 26 optimized tests without skips. The focused run passes 228 tests: +97 library, six public B2/B3, 122 legacy/volume and three compile-fail doctests; +zero fail and three existing artifact tests remain ignored. All 1,489 committed +file hashes, 140 selected inputs, 17 actual ELFs and the 76-member archive are +retained. The 28,934,812-byte ZIP has SHA256 +`5e40f320799865ba6c3e945499c5da1e6d7a6068deea0ab19b59b511f9d284a1`. +Library identity is `libfile_61d39f8d955c81918f2c22927e011fa4`, version 0; all +returned xattrs are persisted. Summary 68393fd1 was final before the independent +execution audit. See [qualification](reports/c1b3-admission-20261020/qualification.md). + +Bounded scratch handling deduplicated only a completed hash-identical current +root ELF copy. After all commands passed and all 17 ELFs were retained/verified, +only that reconstructible target was retired; all retained hashes were verified +again. Resource receipts are sealed. No source, protocol, driver, threshold, +prior evidence or other-owner cache changed. No scientific campaign or silent +rerun occurred. Owner 227/5 and prior failures stay separately attributed. +Hosted/default/desktop/window/release/performance/full replacement/physical/ +Lean/model/GPU gates remain separate. Fixed PR133/138/141, protected original +work and the merge pause remain unchanged. + +## 2026-10-21 — fresh serial completion task, PR142 composition + +Fresh user instruction authorizes completion and normal reviewed merge of retained +PR142/138/143/59/150. PR142 is sole integration lead and uses the five PR comments +as coordination records. Operation is `continue` on this plan. Historical task +read/resume denial and final GPU artifact-download denial remain binding; neither +is retried or routed around. No original branch is removed or rewritten. + +Fetched current main `15026a966265cf9eaedf464e2b5a066bd0fef3d8` and retained +PR142 `4f2d55323825c8907cf9209914f29130ec7de511` into an isolated completion +branch. Inspected current Coding Standards `0fc92a2`; no AGENTS.md found. +Composing the two parents conflicts in Simulation and both admission records. +Simulation keeps workflow and force-field inputs together with projection; the +first preparatory core compile correctly failed E0063 because the force-field +constructor lacked projection initialization. Adding explicit `projection: None` +restores the original force-only contract; subsequent no-default cargo check +passes. This is a preparatory build, not clean committed-source qualification. + +Shared cfg(test) CPU fixture relied on wall-clock nanoseconds for directory +uniqueness. Bounded repair adds atomic sequence and exclusive create/retry only +for AlreadyExists. A 32-thread identical-timestamp regression owns this defect; +existing metadata/scratch-cap refusal tests retain all assertions. Old combined +native-admission check refuses as expected (review binding) and its raw message +is retained outside Git. The current conservative selector has 152 paths; +independent complete-source review and explicit v3 refresh precede qualification. + +A harmless branch-protection configuration read returned HTTP403, Resource not +accessible by integration. That read is stopped without alternate route. Normal +server-enforced merge and visible exact-head checks remain the supported route; +no protection bypass is requested or inferred. Full hosted/local qualification +and normal merge are pending. See the [prospective protocol](reports/pr142-completion-20261021/protocol.md). + +Preparatory desktop build completed under Rust1.92/jobs2/debug0. The first short +`--exact` filter executed zero tests (224 filtered), retained as a no-op rather +than a pass claim. Correct fully qualified runs then execute and pass one new +same-timestamp/concurrent directory regression and one original +`invalid_pin_metadata_and_scratch_cap_never_start_a_child` contract. Both full +logs and actual preparatory desktop ELF remain outside Git. Clean committed +qualification below will execute the full ordinary feature suites separately. + + +## 2026-10-20 — separate exact-reference Cargo closure and fresh qualification + +Fixed PR133 remains at `8bf542e` with actual execution `9c04278` unchanged. A separate dependent worktree/branch integration/q2-reference-admission-20261020 retains exact PR132/e6525a1 and PR134/f84f651. Complete independent source/dependency review approves 135 selected inputs: 0 added, 2 Cargo changes, 133 unchanged, 0 removed. All previous registry identities/checksums remain; three new locked dev identities and actual official archive/license bytes were reviewed. Existing v3 schema/base/predecessors/primary/selector/refusals and prior bound review prefix remain exact. Metadata commit ba16197 and independently reviewed protocol-spacing-only follow-up `9a9904f` precede qualification; no history rewrite or later bound-metadata edit. + +Clean `9a9904f`/tree `488ab45` passes all 18 unchanged native qualifier commands (35 Rust tests, five fresh native/rational/adversarial specimens, gate 5+5 and oracle 10+10), a new actual packet with 26 normal+26 optimized tests/no skips, and 83 focused no-default checks (23 workflow, 9 native-family, 14 composition, 23 volume, 3 doctests, 2 coupled-reference, 9 exact-geometry). Actual executable/receipt, 1472 committed source identities, 60 raw evidence files, environment and exact commands are retained. The known fixed five-artifact regression completed normally in the 186.08s geometry suite; no scientific campaign was rerun. Independent execution audit verifies all selected/full source and archive/ELF hashes with no findings. Raw 913699-byte ZIP SHA256 fa0db9c9e6f98a8c2d98b89967053537c8a2e74237c34276c84614b76bbff16c is saved privately in Library as libfile_3ee285ef166c8191b648475efb676b1c/version0. Detailed protocol, compact manifest, source and final reviews are in reports/q2-admission-20261020/. + +PR132's fixed-corpus exact topology result and PR134's eight aligned coupled-algebra cases remain attributed to their own tested sources `0f4e7e0` and `06b3190`. General cut/free-surface velocity spaces, extension, physical traction/boundary lift and coupled PDE/production-water gates remain with the numerical owner. PR136/e56bc7b C1-B2 runtime/custody is delivered separately; its 140-input admission and assigned legacy G1 cancellation-label repair are pending and excluded here. The grid→particle/output-surface→later Lagrangian priority remains unchanged. + +After independent readiness and nine green checks, automatic approval rejected PR121 and the single requested retry, applying the original trusted no-merge delegation over tool-relayed confirmation. PR121 remains unmerged; no alternate path or further retry was used. Earlier verified PR120/119 merges remain facts. Public merges are paused; review, evidence publication and independent admissions continue without changing another owner's implementation. + +A later exact remote read confirms draft PR135 at 4f8bd22669efed62e84c0062ee1baec27393e830, frozen numerical source 6d99e7794a6aa69f5886bb15cc662e40ea43cd40, stacked on 134. The owner reports four native CV1 fixtures plus independent exact reconstruction, ten contracts in each debug/release configuration, strict Clippy/format and 45 evaluator checks passing. This qualifies only bounded cut-cell operators/physical traces. Square mass condition 6.53e11 leaves coupled conditioning, mixed-pair stability and PDE accuracy open, with the next bounded gate assigned to the numerical owner. PR135 is excluded from the 135-input 9a9904f execution and no physical criterion is changed. + +Final independent documentation review clarifies that the later reproduced legacy G1 advection-cancellation label defect also exists in unchanged fixed `9c04278`/`9a9904f` paths: no publication occurs, but the attempt is labelled Failed despite cancellation. Passing 23 workflow tests do not resolve that uncovered path. Full G1-C outcome-label acceptance remains open; only the assigned repair and new B2 source are excluded from these fixed qualification subjects. + + +## 2026-10-21 — PR138 preliminary serial composition + +Fresh user authorization and lead comments6328139025/6328266160 admit a bounded +PR138 composition against frozen PR142/dbd49d3 while its ordinary gates run. +The original PR138/a6bfcc9 and exact PR132/134 ancestry remain; product, thermal, +UI and fixture source comes unchanged from PR142. All seven shared-document +conflicts preserve later lead dispositions and original Q2 evidence/history. +The old PR142 inventory refused changed Cargo.lock before numerical execution; +its failure log remains external. Complete selector review identifies152 paths, +0 added, 2 Cargo changes, 150 unchanged, 0 removed. Independent admission review +and fresh committed-source qualification are next; final merged-main verification +and normal merge remain with the lead. No scientific campaign is rerun. + + +## 2026-10-21 — PR142 exact source qualification and evidence reconciliation + +Committed source `dbd49d3e41c482a753884abc8aaaff7d1b0d0653`, tree +`2f37db7c119b846003f5a01a82d46c4cf965b474`, retains parents4f2d553 and15026a9. +Independent review checked all152 committed inputs and explicit existing-v3 +refresh before execution. Fresh native18 commands,35Rust tests,5specimens, +gate5+5/oracle10+10 and actual packet26+26/no skips pass; local complete +core-only722/0failed/10ignored and85top-level harnesses pass. Every1903 committed +file hash and actual exporter/ELF custody remains bound to that source. + +All three ordinary hosted feature jobs in run39688034222 attempt1 and its +executable/aggregate passed. Raw checkoutd5ef6e2 has exactly dbd49d3's tree; +independent audit verifies core722/10ignored, default730/10ignored and desktop +1114/17ignored (four nested child summaries excluded). Those counts are per-mode +top-level results, not distinct tests or ignored acceptance. + +The [explicit evidence replan](reports/pr142-completion-20261021/evidence-reconciliation.md) +accepts those completed source-identical hosted gates with completed local +native/packet/core. Continued local default/desktop duplication adds no deciding +claim. The lead intentionally sent SIGINT to its exact owned duplicate default +material test at23:07:41UTC; Cargo101/signal2 and original `failed` progressive +journal/traceback/partial logs remain, never relabelled all-local success. Driver, +Cargo and test process absence was confirmed before report/workflow edits. +No local desktop execution is claimed. No assertion or gate was weakened. + +Sealed191-member raw ZIP is153125915bytes at SHA256 +4d55283ec9894b5c4c742e743913b6bc63fc8fbf413a21b6c6e6098d8e1fa04e; +CRC and every member SHA256 verified. Independent archive/execution review passes. New-archive Library saving failed +before preparation (hosted tool-list network failure), returned no identity and +was not retried or rerouted. Raw archive remains locally intact; compact frozen +native/packet/custody manifests are retained in Git. Final result-document review +is separate. Historical receipts and branches remain. + +The independently reviewed outer feature-job budget change30→60 in +rust-rheon.yml addresses actual historical PR143 desktop30-minute cancellation. +Commands, matrix, all assertions/per-case/scientific bounds, executable and +aggregate are unchanged; PR142's original exact-head hosted feature jobs already +passed below30 minutes. Runtime/build/qualifier152-map and frozen admission +bytes remain unchanged by this workflow/document-only follow-up. Final new-head +hosted checks, review and normal merge/post-merge verification remain pending. + + +## 2026-10-21 — coordinate exact workflow budget contract after failed hosted gate + +Reporting head5eb8bf5 executable job119541101644/run39692282682 failed two +source-only CiBudgetContract cases: actual approved feature prefix60minutes +was still expected as30minutes by tools/test_column_interface_verifier.py. +Fulltools result219tests/2errors/27skips and rawlogSHA +aec251631819cb28b421ef2e517ec4e13dd697949ba6c1328d40e2ef5e4cd404 +remain retained; no numerical verifier test failed. This is a workflow-contract +coordination omission, not grounds to waive the gate. + +Minimal repair updates the exact expected feature prefix including both reviewed +comments, preserves the frozen baseline/all workloads/other job budgets, and +adds explicit30/59/61/missing-budget refusal. Four source-only cases pass normal +and-O (8executions,0skips), no numerical fixture/campaign. Selected152runtime/ +build/qualifier/admission identities remain unchanged. Independent exact repair +review and new exact-head full CI remain required before merge. See +[repair record](reports/pr142-completion-20261021/ci-budget-guard-repair.md). diff --git a/docs/plans/fluid-accuracy-composition/issues.md b/docs/plans/fluid-accuracy-composition/issues.md index 918876bd..415ba6df 100644 --- a/docs/plans/fluid-accuracy-composition/issues.md +++ b/docs/plans/fluid-accuracy-composition/issues.md @@ -4,16 +4,26 @@ The frozen audit remains authoritative for baseline observations; this table is | Finding | Severity | Bounded disposition / status | |---|---|---| -| F1 missing hydrodynamic mesh walls | High | P1 coherent support/visibility/force/work selection; P2 geometry; Q2 grid alternate. Open, preview not reclassified. | -| F2 water rest transient | High | P1 compressed-EOS equilibrium, native equilibrium defect, sound/Mach/dt admission. Open. Uniform fill was not initialized hydrostatic equilibrium. | +| F1 missing hydrodynamic mesh walls | High | P1 production selection stopped after retained failed gates; Q1→Q2 is the selected existing-grid route. Particle preview remains unqualified; F1 stays open until the shared geometry/wall suite passes. | +| F2 water rest transient | High | P1 wall/EOS candidates failed and are not production-admitted. Existing particle preview is unchanged; a future particle admission must meet equilibrium/work/sound/Mach/dt gates. F2 remains open. | | F3 no composed general grid path | High | Q2 unified Stokes + common geometry + conservative transport; explicit staged 2D→3D envelope. Open. | | F4 center-sampled mass bias | Medium | P2 clipping/integrated mass with uncertainty and variable-volume quadrature. Open. | -| F5 fixed-neighbor viscosity bias | Medium | P1 kernel/support/perturbed-cloud study; no global normalization shortcut. Open. | -| F6 coarse channel/interface diffusion | Medium | Q1 measured accuracy envelope retains old failure; Q2 transport selection. Open. | +| F5 fixed-neighbor viscosity bias | Medium | The bounded perturbed-cloud/viscosity studies are retained without admitting a method. Particle production selection is stopped; F5 remains open, with no global normalization shortcut. | +| F6 coarse channel/interface diffusion | Medium | Q1 source/evidence delivered in PR126, but transport accuracy qualification is incomplete: n64 source exhaustion and Full-control refusals remain. Original coarse failure preserved. Q2 common geometry is the next prerequisite; F6 remains open. | | F7 area-lumped obstacle pressure/load | Medium | Q2 common B/M/S and independent flux/traction/refinement; new weight alone insufficient. Open. | | F8 uncalibrated cohesion/contact work | Medium | Q3 capillary stress/drop/wave + impulse/work ledger; moving/coupled capability separate. Open. | -| Workflow visibility gap | New architecture requirement | G1 descriptor + actual receipts and native inspection; HTML only a provisional design aid. Open production requirement. | +| Workflow visibility gap | New architecture requirement | Recorded local native workflow gates passed for configured sealed MAC in [G1 qualification](reports/g1-qualification.md). G1-C iteration consistency is repaired at PR131/34e2e73 and locally verified on fixed stage `9c04278`; PR137/70da36d repairs the legacy cancellation label and separate 140-input stage `186dc0a` freshly passes 26 workflow contracts. Fixed 9c/9a retain the old defect; hosted integration remains pending. G1-U retains its recorded environment scope. Other families/editing remain outside acceptance; HTML remains a design aid. | | Hidden provider state/side effects | Contract risk | C1 explicit prepare/commit/abort or stateless/disposable candidate; old pressure seam cannot roll back external side effects. Open implementation gate. | +| Hosted source admission | Hosted integration pending | The fixed 135-path stage `9c04278` has independently approved admission and fresh native/rational/real-packet qualification; see [staged result](reports/native-admission-20261020/qualification.md). The separate PR132/134 Cargo closure passes fresh qualification at `9a9904f` with 83 focused tests; fixed PR133 remains unchanged. Old PR122 and PR132 Pages admission refusals remain historical; the separate 140-input C1/repair stage `186dc0a` also passes fresh local qualification. Hosted Pages/browser/publication must pass on their actual new heads. | +| G1 archived iteration-count consistency | Repaired and locally verified | PR131 reproduced six standalone/cold-terminal validation failures and fixed native caps/zero candidate counts at `34e2e73`. Matching RCP4 forgeries already failed the legacy inner gate. Fresh23 workflow tests pass on `9c04278`; old-profile semantics remain. | +| Optimized Python evaluator guards | Corrected tooling contract | PR130/c2fbbea retains all four original evaluator bytes and promotes all 15 predicates to always-on guards. Owner qualification reports 129 checks in normal/-O/-OO; independent full-AST reversal preserves formulas. Frozen scientific campaigns/failures are unchanged; this adds no exhaustive schema or physics validation. | +| Q2 geometry topology and coupled method | Fixed-corpus repair; general method gate open | PR132/e6525a1 repairs the five PR127 version-2 artifacts using exact represented-source predicates; the declared corpus has 0 mismatches across 76,384 faces / 152,780 regions. PR134/f84f651 retains eight aligned coupled-algebra cases. Separate clean `9a9904f` passes build-input/native/focused qualification. Separate PR135/4f8bd22 qualifies only the bounded CV1 operator/physical-trace reference at source `6d99e77`; later PR139/902f609 reports the fixed 24-case CV2 static conditioning/coupled-solve gate locally satisfied at source `b0a9d52`. Generic stability/PDE/evolving geometry and production remain open; no full PDE/production promotion. | +| Merge authority | Fresh serial completion authorized; gates pending | The 2026-10-21 user instruction authorizes normal reviewed merge of PR142/138/143/59/150 through PR142 sole integration lead. Historical PR121 denial and retry remain retained; cloud-task reads/resumes and the prior GPU artifact-download denial remain prohibited. Required exact-source review and hosted gates are unchanged. No force push, protection bypass or branch deletion. | +| C1-B2 native Session/custody | Separate source locally qualified; hosted pending | PR136/e56bc7b and final PR137/d3e6237 have independently reviewed 140-input admission and fresh native/rational/packet plus focused qualification at `186dc0a` ([result](reports/c1b2-admission-20261020/qualification.md)). Actual native substitutions, atomic publication and additive RPS1/RPP1/RPT1 custody remain closed BuiltinNativeV1 only. Final PR140/5dc1741 reports 227 passing/5 existing ignored executions for separate closed C1-B3 selection, retaining the earlier failure/repair; it is excluded from 186dc0a and has a separate result below. Full replacement remains pending. | +| C1-B3 producer selection | Separate source locally qualified; hosted pending | Exact PR140/5dc1741 is retained in separately reviewed clean `3b3b667`:same 140 inputs,8 changed / 132 unchanged, fresh native/rational/real-packet and 228 focused contracts pass ([result](reports/c1b3-admission-20261020/qualification.md)). Owner 227/5 remains separately attributed. Exact-head hosted/full replacement/stateful/learned/whole-family gates remain open. | +| PR138 combined reference admission | Preliminary local qualification passed; final verification pending | Lead-authorized isolated composition at `91c4f4b` preserves all 150 non-Cargo identities in the complete 152-path closure. Independent source/execution audit, 18 native commands, 26+26 real-packet tests and 143 focused ordinary checks pass. Reporting head `3cd735f` changes no selected input. Final readiness still requires verified #142 merged-main identity, final exact-source revalidation, hosted gates and the lead's merge. Historical `9a9904f` receipts retain their original scope. | +| Future particle and Lagrangian roadmap | Deferred user priority | Qualify voxel/grid first, then a particle solver and particle-to-surface mesh generator, with a Lagrangian finite-element-style family later. Surface reconstruction is separate from material volume/connectivity meshing. Both future phases are unimplemented/unqualified; failed P1 evidence remains. | | MARIN numeric observations | Specific missing input | V1 physical validation only blocked; no block to reference/graph/contract work. | +| Desktop fixture directory collision | Repaired and scoped qualified; final reporting-head CI pending | Actual dbd49d3 retains additive Simulation/desktop composition, complete independently reviewed 152-path admission and fresh native/packet/fullcore plus exact-tree hosted desktop gates. New concurrent timestamp regression and original refusal test pass. Original compile/zero-filter outcomes and deliberately cancelled duplicate local recipe remain retained; no whole-application acceptance. | Independent review findings and their dispositions are recorded in reports/reviews.md; no claim is accepted merely because this table proposes a fix. diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/admission.md b/docs/plans/fluid-accuracy-composition/p1-adjoint/admission.md new file mode 100644 index 00000000..35991663 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/admission.md @@ -0,0 +1,36 @@ +# Bounded continuation admission + +User authorized continuation from PR121's failures into the next mathematical +selection gate, with separate branch, independent review and precommitted +experiment. This supplies the implementation direction: P1 remains Active in +method selection, with no production method or acoustic timestep admitted. +Parent/repository lead retains shared canonical plan and merge authority. + +Base a64d4d3 (PR121), fresh origin/main bc2f472787060d9a69cb619ed2c2fea10fd754b6. +Branch implementation/p1-adjoint-selection-20261020, worktree +/workspace/Rheon-p1-adjoint. No rebase, merge or cleanup is performed. Original +checkout and PR119/120/59 are preserved. Exact exclusive writes are in protocol. +No production source, dependency, UI, Session, recording, shared declarations or +original experiment source changes are authorized by this slice. + +Standards continuation pin 0fc92a24279f3a4574c80af0a2f31ea347a21597; no AGENTS.md +found. Same routed core, discovery/planning, implementation, numerical oracles, +verification, commit, documentation, Rust and architecture/contracts standards +as PR121. This is a bounded numerical discovery slice, not runtime composition: +D1/G1 remain authoritative. No permission gate is inferred from a deferred +production method. Scope is deliberately smaller than the failed campaign. + +Selected claims: A1 exact derivative/work/reaction implementation under stated +positive smooth-map assumptions; A2 static causal distinction between adjointness +and partition consistency; A3 independent pre/post numerical review. Evidence +will be native CPU f64 source, deterministic CSV fields, independent differences +and external read-only review. No scientific physical validation, trajectory +water accuracy, viscosity, acoustic bound, GPU, UI, moving wall or mesh claim. + +Design -> independent equation/source review -> frozen protocol/source commit -> +static experiment -> independent field review -> retained result and focused PR. +No thresholds change after freeze. A failed necessary gate returns to selection; +a successful algebra probe alone cannot admit a production method. No new Lean +obligation is asserted: the finite-dimensional chain rule is derived explicitly, +while the actual maps' missing consistency/stability premises remain observable +and unresolved. Existing proofs and their receipts stay unchanged. diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/analyze.py b/docs/plans/fluid-accuracy-composition/p1-adjoint/analyze.py new file mode 100644 index 00000000..d151bec1 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/analyze.py @@ -0,0 +1,54 @@ +"""Frozen static gate evaluation, stdlib only; ROOT is a completed native run.""" +import csv +import json +import math +import pathlib +import sys + +# Evaluator tooling v2. Frozen scientific criteria and original bytes are +# retained under ../evaluator-tooling/. Guards remain active under -O / -OO. +def require(condition, message): + if not condition: + raise SystemExit("evaluator input refused: " + message) + +root = pathlib.Path(sys.argv[1]) + +def rows(name): + with (root / name).open() as handle: + return list(csv.DictReader(handle)) + +summary = rows('summary.csv') +sites = rows('sites.csv') +derivatives = rows('derivatives.csv') +require(len(summary) == 16 and len(sites) == 768 and len(derivatives) == 48, 'p1-adjoint: input contract at original line 17') + +def key(row): + return tuple(row[k] for k in ('map', 'n', 'perturbed', 'hydro')) + +require(len({key(row) for row in summary}) == 16, 'p1-adjoint: input contract at original line 22') +report = [] +for row in summary: + group = [r for r in derivatives if key(r) == key(row)] + fields = [r for r in sites if key(r) == key(row)] + require(len(group) == 3 and len(fields) == int(row['n']), 'p1-adjoint: input contract at original line 27') + require([float(r['eps']) for r in group] == [1e-5, 1e-6, 1e-7], 'p1-adjoint: input contract at original line 28') + for field in fields: + require(all(math.isfinite(float(field[k])) for k in field if k not in ('map', 'perturbed', 'hydro')), 'p1-adjoint: input contract at original line 30') + require(all(float(field[k]) > 0 for k in ('y', 'mass', 'rho', 'volume')), 'p1-adjoint: input contract at original line 31') + for derivative in group: + require(all(math.isfinite(float(derivative[k])) for k in derivative if k not in ('map', 'perturbed', 'hydro')), 'p1-adjoint: input contract at original line 33') + fd_ok = [all(float(r[k]) <= 1e-6 for k in ('energy_error', 'volume_error', 'density_error')) for r in group] + entry = dict(row) + entry['work_pass'] = float(row['work_normalized']) <= 1e-12 + entry['momentum_pass'] = float(row['momentum_normalized']) <= 1e-12 + entry['derivative_pass'] = any(a and b for a, b in zip(fd_ok, fd_ok[1:])) + entry['derivative_eps_pass'] = fd_ok + entry['e0_pass'] = None if row['hydro'] == 'true' else float(row['e0_force_over_pressure']) <= 1e-10 + entry['max_fd_energy_error'] = max(float(r['energy_error']) for r in group) + entry['max_fd_volume_error'] = max(float(r['volume_error']) for r in group) + entry['max_fd_density_error'] = max(float(r['density_error']) for r in group) + if row['hydro'] == 'false': + pressure = float(fields[0]['pressure']) + entry['force_volume_identity_max_absolute'] = max(abs(float(r['force']) / pressure - float(r['volume_gradient'])) for r in fields) + report.append(entry) +print(json.dumps(report, indent=2, allow_nan=False)) diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/issues.md b/docs/plans/fluid-accuracy-composition/p1-adjoint/issues.md new file mode 100644 index 00000000..b486a1c8 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/issues.md @@ -0,0 +1,18 @@ +# Unresolved selection blockers + +1. Gamma adjoint map: genuine perturbed sampling E0 and wall-volume/traction + inconsistency, despite exact work. Reject for production; no new trajectories. +2. Exact-partition reference: cell-mean versus site hydro inconsistency, endpoint + wall response and an interior alternating-pressure operator defect. Reject. +3. Both: no qualified pressure/geometry acoustic Hessian or timestep bound. An + h/c heuristic and semidiscrete work identity do not supply one. +4. Both: native 3D wall/viscosity, mesh geometry and full fixed P-W campaign remain + pending method selection. Planar static results do not discharge those gates. + +Next candidate to derive: shared positive volume partition with explicit boundary +representation, complete derivatives and source-integrated volume/first-moment/ +gravity quadrature. Choose site/centroid meaning explicitly and differentiate +the same total potential. It must +first survive E0, linear/cell-mean hydro, physical wall-load, translation and +acoustic spectrum gates. No implementation admission for that candidate is made. +Parent owns canonical plan changes, stacking/integration and eventual merges. diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/ledger.md b/docs/plans/fluid-accuracy-composition/p1-adjoint/ledger.md new file mode 100644 index 00000000..992dee62 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/ledger.md @@ -0,0 +1,22 @@ +# Slice lifecycle + +2026-10-20: explicit user continuation authorizes bounded P1 mathematical selection. +PR121 negative campaign remains frozen and production stays on its existing version. + +Discovery: independent derivation isolates work adjointness from discrete volume +partition. Design/protocol: two static maps, fixed scales, finite differences, +source-integrated hydro masses, wall loads and retained null defect. Read-only +review corrected diagnostics before commit e457ac1; no measurements preceded it. + +Implementation: exclusive write set only. Check/Clippy before freeze; source and +protocol committed/pushed as durable checkpoint. Native debug/release tests6/6; +frozen native campaign and evaluator exit0, all16 cases measured. + +Selection: gamma fails E0 even with work repair; exact-partition reference fails +hydro/boundary/null requirements. Return to method selection. No production, +viscosity, trajectory, acoustic timestep or P2 variable-volume initialization +admission. No original thresholds, rest screenshots or method versions altered. + +Qualification: pre-freeze independent source review complete; post-run review and +retained archive receipt recorded in review/manifest. Focused PR is stacked on +PR121 for repository lead disposition. No merge, rebase or branch cleanup. diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/manifest.json b/docs/plans/fluid-accuracy-composition/p1-adjoint/manifest.json new file mode 100644 index 00000000..fbf937be --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/manifest.json @@ -0,0 +1,62 @@ +{ + "schema_version": 1, + "scope": "P1 static method-selection negative result; no production/timestep admission", + "frozen_commit": "e457ac12e874029229c381d30db8481caaee5cf6", + "base_pr": 121, + "base_commit": "a64d4d3c610d2ea30f2c734e61e86c4bf2bd25c4", + "canonical_plan_pr": 120, + "canonical_plan_commit": "8422f77bb45e60b95c5694ed0b39e01377b62976", + "branch": "implementation/p1-adjoint-selection-20261020", + "artifact": { + "filename": "rheon-p1-adjoint-selection-e457ac1.zip", + "library_path": "/rheon-p1-adjoint-selection-e457ac1.zip", + "library_file_id": "libfile_b991f0d5b0ac819187f86e2c0a8a1c0a", + "file_id": "file_00000000ead8823083543664969a45d5", + "version": 0, + "bytes": 6903265, + "sha256": "7438979a93edca8830e9b5a92698a93665fdab1544ff42174fc51ed9cd15c658", + "indexed_files": 1367, + "zip_entries": 1368, + "contents": "full frozen source, reference plan, executable, raw fields, frozen evaluator, independent reconstruction, tests and supporting report; custody receipt remains external to avoid a self-hash cycle" + }, + "executable_sha256": "6251bff2cfd82a2768ab2cc049cf33e3b6e2cc2d03c7b989aa6a321487a257db", + "counts": { + "cases": 16, + "sites": 768, + "directional_probes": 48 + }, + "gates": { + "work_pass": 16, + "momentum_pass": 16, + "derivative_pass": 16, + "gamma_uniform_e0_pass": 0, + "gamma_uniform_e0_cases": 4, + "reference_uniform_e0_pass": 4, + "reference_uniform_e0_cases": 4, + "production_admitted": false, + "acoustic_timestep_admitted": false + }, + "verification": { + "focused_debug_passed": 6, + "focused_release_passed": 6, + "strict_affected_clippy": "pass", + "full_regression": "not repeated; unchanged production, PR121 retains 582-test release result", + "independent_review": "pre-freeze and post-run pass as negative selection evidence", + "lean": "no new kernel qualification", + "hosted_ci": "separate pending external evidence" + }, + "preservation": { + "original_pr121": "source and results unchanged", + "production": "unchanged", + "G1": "unchanged", + "proofs": "unchanged", + "canonical_plan": "lead-owned unchanged" + }, + "access_recovery": { + "at_utc": "2026-10-20T00:58:27.915970+00:00", + "shell": "working, actual git/fs/ps checks exit0", + "campaign_processes": "none running", + "duplicate_campaign": false, + "archive_sha256": "verified unchanged" + } +} diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/mathematics.md b/docs/plans/fluid-accuracy-composition/p1-adjoint/mathematics.md new file mode 100644 index 00000000..b8f0e642 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/mathematics.md @@ -0,0 +1,61 @@ +# Two independent necessary properties + +Let fixed m_i>0, fixed h, sorted sites y, smooth fixed symmetric support and +closed walls b0; no positivity claim beyond measured +probe configurations is made. This is a new diagnostic map, not a reproduction +of Mayrhofer's k=0 continuity or a claim of offset-free consistency. + +With gamma'_i=K(y_i-b)-K(y_i-t), exact directional continuity is + rho_dot_i=[sum_j m_j(v_i-v_j)K'_ij-rho_i v_i gamma'_i]/gamma_i. +Differentiating U=sum_i m_i e(rho_i) gives + F_i=-m_i sum_j m_j(q_i/gamma_i+q_j/gamma_j)K'_ij + +m_i p_i gamma'_i/(rho_i gamma_i). +The pair force is antisymmetric. Wall reactions are + R_b=sum_i m_i p_i/(rho_i gamma_i)*[-K(y_i-b)], + R_t=sum_i m_i p_i/(rho_i gamma_i)*K(y_i-t). +Thus sumF+R_b+R_t=0 and sum_i[v_i F_i+m_i q_i rho_dot_i]=0. +For moving walls their shape derivatives enter density rate and their velocities +enter work. This probe uses stationary walls only. No pressure work from a +fictitious wall ghost velocity is used. Compared with the former k=0 scheme, +matching this map changes BOTH volume coefficients and gamma surface terms; +merely halving a surface term while retaining the old continuity is incoherent. + +For ANY positive differentiable volume map rho_i=m_i/V_i, + dU=-sum_i p_i dV_i, F_k=sum_i p_i partial_k V_i. +At uniform positive p*, F_k=p* partial_k(sum_i V_i). +Exact work therefore does not imply zero E0 force: the latter requires an exact +position-independent volume partition (or an equivalent identity). Calibrated +offsets enforce density values, not derivatives or hydrostatic stationarity. + +Clipped 1D Voronoi reference: faces f_0=b,f_n=t, + f_j=(y_{j-1}+y_j)/2, V_i=f_{i+1}-f_i. Strict ordering/interior sites makes V>0; +sumV=t-b identically. F_k=sum_i p_i partial_k V_i, R_b=-p_0,R_t=p_{n-1}. +Interior F_k=(p_{k-1}-p_{k+1})/2; endpoints F_0=(p_0-p_1)/2, + F_last=(p_penultimate-p_last)/2. Continuity rho_dot=-rho Vdot/V. +Constant pressure cancels exactly. Linear point-pressure has exact interior +force -p' V_i, including irregular spacing, but this does NOT establish wall +consistency or the consistency of cell-mean hydro pressures with site forces. +Alternating pressure is an interior null mode: no undisclosed cure is allowed. + +The linear EOS and e'=p/rho² are inherited unchanged from PR121. Exact exponential +hydrostatics, the c=32 compressibility/Mach restrictions and unqualified production +acoustic dt remain unchanged. No new formal theorem is claimed. Existing Lean +conditional pair/work lemmas remain valid under their original hypotheses; they +do not establish these maps' consistency, positivity or acoustic spectrum. + +## Primary basis and scope + +[Mayrhofer et al. 2013](https://arxiv.org/abs/1304.3692), equations 8–11 and +37–38, motivate the gamma adjoint issue; the map here is independently derived. +[Hess and Springel 2010](https://arxiv.org/abs/0912.0629), sections 2.1–2.3, +derive Lagrangian pressure from volume derivatives. Their section 5.3 discusses +the Nyquist pressure mode. Their ideal-gas applications do not validate water. +[Dehnen and Aly 2012](https://arxiv.org/abs/1204.2471) distinguish kernel sampling +consistency from conservation. We do not transplant astrophysical acceptance. +[Frontiere et al. 2017](https://arxiv.org/abs/1605.00725), Appendix B, shows that +conservative reproducing-kernel momentum need not reproduce linear pressure. +An RK gradient cannot simply replace this force while keeping its work proof. diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/protocol.md b/docs/plans/fluid-accuracy-composition/p1-adjoint/protocol.md new file mode 100644 index 00000000..2165e466 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/protocol.md @@ -0,0 +1,93 @@ +# P1 follow-on: work versus partition selection gate + +Status: pre-experiment protocol v1. Base PR121/a64d4d3; original campaign source +39098e0 and all results remain immutable. Parent plan PR120/8422f77 retains all +production criteria. This is a disjoint static rejection gate, not a replacement +qualification campaign, a production method, or P2 initialization admission. + +Exclusive writes: this directory, examples/particle_adjoint_selection.rs, +examples/particle_adjoint_selection/*, tests/particle_adjoint_selection_contract.rs. +No production, G1, shared module, root plan, proof, workflow or dependency writes. + +## Question and candidates + +Does correcting the pressure/density adjoint also eliminate the initial +pressure/E0 defect? Static results cannot decide the full PR121 trajectory failure. Compare `gamma-offset-adjoint-planar-v1` against an exact-partition +`clipped-voronoi-1d-reference-v1`. The latter is a causal reference, not a selected +water discretization. Reuse PR121's unchanged exact 3D Wendland planar marginal +and linear EOS. No viscosity or dynamics are added to this static probe. + +Read mathematics.md for the complete map, derivatives, wall reaction and source +scope. Offsets are initialized once and frozen through every directional probe; +no density reset, renormalization, pressure-gradient substitution or damping. + +## Frozen inputs + +SI water rho0=998.2, c=32, g=9.80665. Closed domain [0,1] m, n=32,64, +h/dx=1.5 (R=3dx). Ordered y=(i+.5)dx and perturbed + y=(i+.5+.1 sin((i+1)*2.399963229728653))dx. +The perturbation is deterministic and bounded by .1dx; it is a new static +probe, not a rerun or tuning of PR121's random campaign. + +Uniform case: rho*=1.005rho0, g=0. Gamma-map mass=rho*dx, offset initialized +to rho*. Reference mass=rho*clipped Voronoi volume; this is an explicit distinct +reference quadrature, not a production variable-volume change. +Hydro case: top pressure=1000 Pa to keep all finite-difference states on the wet +EOS branch, rho(y)=rho0 A exp(g(1-y)/c²), A=1+1000/(rho0c²). +Gamma masses integrate that source profile over original equal-width parcels; +offsets initialize exact site density. Reference masses integrate the same +profile over the clipped cells; resulting density is the cell mean, without +site-value resets. Record both conventions and their effects. + +At every case record every site's y,m,rho,p,V,F, equilibrium acceleration, +continuity rate, boundary derivative; signed offset and gamma minima for gamma. +Probe direction v_i=.01 sin((i+1)*1.4142135623730951) m/s. +Directional centered differences use displacement eps*v with eps=1e-5,1e-6,1e-7 s; +recompute density from the frozen map, never from a separate integration step. +Record U and total-volume gradients independently against analytic force/work. + +## Fixed static criteria and stop rule + +Fixed U_ref=.01 m/s. P_ref=1024*998.2*.005 Pa for uniform and +P_ref=1000+998.2*9.80665 Pa for hydro, independent of observed values. +Instantaneous work / (P_ref U_ref) and momentum+wall-reaction / P_ref <=1e-12. +Record their absolute SI residuals too. +Directional U-gradient and total-volume directional derivative agreement <=1e-6 at +at least two consecutive eps values, normalized respectively by P_ref U_ref and +U_ref. Density derivative error is normalized by rho0 U_ref/dx with the same <=1e-6 +two-consecutive-eps criterion. Unavailable hydro/support diagnostics are NaN. +Uniform-pressure E0: max|F|/p* <=1e-10 (force per area has units Pa). +Report acceleration separately; no equivalence with a dx-based bound is assumed. +This algebra gate does not replace original trajectory energy or rest criteria. +All evaluated density states (including displaced probes) must stay on the wet +branch rho>rho0, asserted by the executable. Applicable maps must have positive +gamma, positive numerator/density/volume and ordered +interior sites throughout probes; fail closed otherwise. + +Manufactured linear-pressure operator test p_i=1000+1000 y_i Pa uses the declared +geometry map, independent of EOS, and compares F_i with -1000 V_i. Record interior +and boundary relative error separately; do not discard boundary failures. +The common boundary band has distance=R. The separate alternating-pressure statistic excludes only the two +end sites, since that exact reference stencil property concerns nonend sites. +Record each wall load against continuum -p(0),+p(1), including absolute and +relative defects; global action/reaction cannot establish traction accuracy. +Report hydro initial max|F_i/m_i-g|/g and RMS, split boundary/interior, with no trajectory admission claim. +No hydro tolerance is invented from an initial-acceleration screen: any nonzero +residual is evidence for further selection, not an excuse to relax PR120 gates. +Reference alternating pressure p_i=1000+100(-1)^i must retain its interior zero +force. This is a pressure-to-force operator defect, not a completed EOS/Hessian +nullspace analysis; the unresolved acoustic gate blocks reference admission. + +If the gamma repair fails E0, do not run another trajectory sweep. If the exact +partition reference passes E0 but fails boundary/hydro/nullspace gates, retain +those negatives and return to representation and boundary selection. No c/h/dt +sweep, smoothing, offset reset, mass adjustment or regularizer after seeing data. +Freeze source/protocol in a commit before numerical evaluation. Independent +review checks equations before freeze and recomputes results afterward. + +## Qualification limits + +No timestep is admitted. Work adjointness does not ensure a positive acoustic +Hessian: D²U=sum m[e'' Dρ Dρᵀ+e' D²ρ]. No native 3D viscosity, mesh geometry, +free-surface dynamics, GPU, desktop or physical-impact acceptance is inferred. diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/qualification.md b/docs/plans/fluid-accuracy-composition/p1-adjoint/qualification.md new file mode 100644 index 00000000..fefb9153 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/qualification.md @@ -0,0 +1,56 @@ +# Evidence qualification + +This qualifies a bounded negative selection result. No production method, +physical water accuracy, native viscosity, mesh, free-surface trajectory, +acoustic timestep, GPU or desktop claim is made. + +Frozen scientific source: e457ac12e874029229c381d30db8481caaee5cf6. Source was +independently reviewed and committed before numerical evaluation. The unchanged +PR121 kernel and EOS are reused by path, without production imports or mutation. +Native release executable SHA256: +6251bff2cfd82a2768ab2cc049cf33e3b6e2cc2d03c7b989aa6a321487a257db. +Linux x86_64, Rust/cargo1.92.0; actual rustc verbose identity retained. SI inputs, +perturbation and mass conventions are frozen in protocol. The closed hydro +probe's 1000Pa top pressure yields about1.06105% exact bottom compression, outside +the production1% envelope at c32. This deliberate derivative probe is not the +plan's original free-surface hydro acceptance fixture. Full committed source +snapshot, binary, raw CSVs, exact evaluator, logs and context are retained. + +| Selected claim/check | Outcome | Limit | +|---|---|---| +| A1 equation/adjoint implementation contracts | 6/6 debug and 6/6 release tests pass | Includes unchanged EOS/kernel checks; native f64 only | +| Affected strict Clippy | example and adapter pass, -D warnings | no-default-features CPU targets | +| A2 static causal campaign | exit0; 16 cases, 768 sites, 48 differences | negative selection, no dynamics | +| Directional derivative criteria | all48 pass at frozen scales | finite-difference evidence, not a formal global proof | +| Work/action-reaction criteria | all16 pass | does not establish consistency or physical wall load | +| E0 criterion | gamma0/4, reference4/4 uniform cases | both still unqualified for other distinct failures | +| A3 independent review | pre-freeze and post-run reconstruction passed | read-only separate agent, no physical experiment | +| Scope and hygiene | formatting, diff, frozen original sources preserved | no production/API/dependency/workflow changes | + +Commands: + +``` +cargo test --locked --no-default-features --test particle_adjoint_selection_contract +cargo test --locked --release --no-default-features --test particle_adjoint_selection_contract +cargo clippy --locked --no-default-features --example particle_adjoint_selection -- -D warnings +cargo clippy --locked --no-default-features --test particle_adjoint_selection_contract -- -D warnings +cargo run --locked --release --no-default-features --example particle_adjoint_selection -- FRESH_OUTPUT +python3 docs/plans/fluid-accuracy-composition/p1-adjoint/analyze.py FRESH_OUTPUT +``` + +The fresh output path must not exist; outputs are explicitly flushed. Assertions +fail closed on unordered/outside sites, nonpositive map numerator/gamma/volume or +a density state crossing the declared wet branch. Later documentation edits do +not change scientific source/protocol/evaluator. No new Lean module or historical +qualification inventory is modified. No existing large CPU regression is rerun: +this slice adds an isolated executable/adapter and has no production write; PR121 +retains its complete 582-test release regression. Hosted CI is separate evidence. + +Evidence archive `rheon-p1-adjoint-selection-e457ac1.zip` is retained in Library; +[manifest](manifest.json) binds the successful receipt, archive/executable hashes +and file counts. The archive includes full frozen source and the independent +review script and summary. Its external custody receipt is excluded from its own +bytes to avoid a self-hash cycle. Archive CRC/inventory were verified. Actual +shell/process/filesystem access was rechecked after the reported environment +disconnect at00:58 UTC: working, archive unchanged, no campaign process running, +and no duplicate campaign started. Source checkpoint e457ac1 was already pushed. diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/results.md b/docs/plans/fluid-accuracy-composition/p1-adjoint/results.md new file mode 100644 index 00000000..de8bdf40 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/results.md @@ -0,0 +1,107 @@ +# Static result: exact work is insufficient + +Neither diagnostic is admitted as production water or given an acoustic timestep. +The pre-reviewed source/protocol was frozen at +`e457ac12e874029229c381d30db8481caaee5cf6` before tests or measurements. All 16 +cases, 768 site records and 48 directional probes completed; no trajectory sweep +was run. Original PR121 source, campaign and failed rest criteria are unchanged. +The predeclared 1000Pa top pressure keeps centered differences wet but gives +about1.06105% exact bottom compression at c32, exceeding the production1% +free-surface envelope. This closed pressurized column is solely a derivative/ +consistency diagnostic; it cannot replace or pass the original hydro campaign. + +| Necessary property | Gamma offset adjoint | Clipped Voronoi reference | +|---|---:|---:| +| Maximum normalized instantaneous work defect | 7.25e-16 | 8.35e-16 | +| Maximum normalized momentum plus wall-reaction defect | 5.08e-15 | 0 | +| All three finite-difference scales pass fixed derivative criteria | 8/8 cases | 8/8 cases | +| Uniform-pressure max force / pressure, ordered | .459820 | 0 | +| Uniform-pressure max force / pressure, perturbed | .517953 | <=2.28e-14 | +| Uniform bottom load relative error | .349076 ordered, .373035 perturbed | <=2.59e-14 | +| Uniform top load relative error | .291232–.349076 | <=2.59e-14 | +| Perturbed hydro max residual / g, n32 / n64 | 18.4199 / 36.5907 | .494501 / .494464 | +| Perturbed hydro outside R boundary band, n32 / n64 | 4.88246 / 11.2308 | .0628724 / .0628722 | +| Manufactured linear-pressure boundary-band relative error | 18.5302–59.1217 | .5 ordered, .576797 perturbed | +| Alternating pressure has zero force at every nonend site | No such claim | Yes; unresolved pressure-operator defect | + +The directional internal-energy, total-volume and density derivative normalized +errors are at most 5.88e-8, 1.96e-7 and 1.58e-7, respectively, over all 48 +probes. These meet the frozen 1e-6 numerical derivative criterion. Every evaluated +state retained sorted interior sites, positive volumes and wet EOS density. +Base-state gamma minima: gamma>=.6927116, numerator>=692.2244 kg/m³; fixed offsets range +-49.2960 to +30.6611 kg/m³. These are measured finite-neighborhood bounds, not a +proof of global positivity. No offset was reset during a displacement. + +## Causal interpretation + +The two independent force constructions agree with the density Jacobian's +adjoint and centered internal-energy differences. Gamma's pressure/EOS work +mismatch is repaired for this declared map. The uniform-pressure force still +fails the fixed 1e-10 gate by billions of times. In those cases the independently +assembled force/p equals the analytic total-volume gradient to <=2.28e-14; +the independent volume directional difference also passes. Matching the initial +volume sum to 1 m is insufficient: its position derivative is nonzero. + +Exact work and exact global action/reaction can also conceal wrong individual +wall loads. Gamma's uniform-load errors are about 29–37%. In the continuum +sampling limit its offset-calibrated volume coefficient gives an integral +involving gamma'/gamma, rather than an exact physical wall area. This is a +structural boundary/partition issue, not a timestep issue. + +The frozen 'interior' classification means distance>=R, not completely wall-free: +neighbor gamma coefficients can transmit wall influence to distance2R. A clearly +labelled **post-run secondary causal analysis**, without changing any gate, +therefore examines only sites with distance>=2R. Gamma ordered uniform force/p +is <=6.67e-17 there, while the perturbed value is .188278 at both resolutions. +The corresponding acceleration doubles from 30.694 to 61.388 m/s² as dx halves. +Thus the perturbed E0 defect persists without wall coupling. + +On ordered sites, the unchanged R=3dx kernel has exact discrete first-gradient +moment + + M=-sum_j dx*s_j*K'(s_j) + =(42/27)[(2/3)^4*(7/3)+4*(1/3)^4*(11/3)]=728/729. + +Its fixed deficit1/729=.0013717421 accounts for the measured >2R ordered hydro +residual .0013717109g / .0013717343g. Refining n at fixed support ratio leaves +this quadrature bias. This exact rational arithmetic identity is not a new Lean +kernel qualification. Multiplying a force kernel by729/728 in isolation would +break the matched density/work derivation and would not repair perturbed E0. + +The Voronoi reference removes E0 through an actual volume partition. It also +reproduces manufactured linear *site pressure* in nonend interiors to <=1.61e-14 +relative error. Nevertheless, its site positions differ from its cell centroids +on irregular samples. Source-integrated masses yield cell-mean EOS densities; +linear site-pressure consistency does not make those cell-mean hydro pressures +well balanced. Its perturbed interior residual stays about6.287% of gravity as +n doubles, and end residual stays about49.45%. The hydro wall reactions use +nearest-cell mean pressure, giving top-load errors15.20%/7.38% on perturbed +n32/n64. The retained alternating-pressure operator null is another separate +reason to withhold acoustic admission; it is not a full EOS/Hessian spectrum. + +## Next defensible gate + +Return to representation, shared volume quadrature and physical boundary degrees +of freedom. A next *candidate to derive and review*, not an admitted winner, is a +positive partition psi_i(x)=W_i(x)/sum_j W_j(x), with volumes integrated on ONE +shared quadrature V_i=sum_q w_q psi_i(x_q). With covered positive quadrature and +fixed total weights, sumV=sumw exactly, so its fully differentiated volume force +can satisfy the E0 identity. All denominator and wall-shape derivatives must be +retained. Derive shared first volume/mass moments, choose the representative +site/centroid and gravity/source quadrature, and differentiate that same total +potential; exact total volume alone does not resolve cell-mean hydrostatics. +The required discriminator is then linear-pressure/cell-mean hydro +consistency, per-wall load, translation/momentum aliasing, and the composed +acoustic spectrum before any trajectory. Boundary points outside the particle +convex hull require explicit boundary DOFs or a changed representation for +positive linear reproduction. Do not silently add an RK gradient or regularizer. + +This route is motivated by the partition construction in +[Hopkins 2015, section2](https://arxiv.org/abs/1409.7395), but the proposed shared +quadrature Hamiltonian is a new diagnostic, not that paper's MFM solver. Its +practical volume approximation and astrophysical tests do not establish these +water or wall gates. [CRKSPH AppendixB](https://arxiv.org/abs/1605.00725) warns that +conservation alone can leave linear momentum inconsistency; the +[Voronoi paper section5.3](https://arxiv.org/abs/0912.0629) documents its Nyquist +mode. Every alternative must meet the unchanged plan rather than inherit a +source paper's claims. No positive-partition experiment is included in this PR. diff --git a/docs/plans/fluid-accuracy-composition/p1-adjoint/review.md b/docs/plans/fluid-accuracy-composition/p1-adjoint/review.md new file mode 100644 index 00000000..ac2353fc --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-adjoint/review.md @@ -0,0 +1,37 @@ +# Independent review record + +Pre-freeze review: separate read-only agent /root/p1_numerical_review inspected +the derivation, primary references, protocol, complete model/driver and evaluator. +No numerical experiment or tests had run. It verified the full gamma Jacobian, +independent pair-force expression, wall signs, frozen offsets, explicit source +mass conventions and clipped-face derivatives. Findings corrected before freeze: +scalar gamma extraction; fixed dimensional normalization; uniform hydro fields +unavailable; individual wall loads; support-boundary bands; wet-branch assertions; +reference pressure-null distinction and static scope. Final disposition: no +remaining blocker to source/protocol freeze and the declared static experiment. + +The reviewer did not edit files. This is independent reasoning/code review, not +an independent physical experiment or external solver validation. Post-run field +review is recorded below. + +Post-run review: independently reconstructed all16 cases/768 sites using fresh +Python formulas and Decimal45 source-profile integrals. Retained script +`independent-review/reconstruct.py` SHA256 +8b6f5f338ba062247f4252fda4b2bbff46c3e931e5b52716684ce0b65913f646; +summary SHA25681035ca5d968c346818fc6439d4aaca5325740d45b96c14dfd225aa8aec1cfc6. +Maximum differences: masses8.53e-14 kg/m²; Jacobian-assembled versus native +pair/face force6.37e-12 Pa; density rates5.12e-13 kg/(m³s); volume gradients5e-16; +wall loads2.73e-12 Pa. Linear-pressure diagnostics agree to6.81e-14 relative; +alternating-pressure force to6.4e-13 Pa. All48 recorded differences meet frozen +scales. Root replay of the retained independent script reproduces its summary +byte for byte. This is a separate implementation/review, not physical validation. + +The reviewer separately explained the fixed first-gradient moment728/729 and +checked >2R post-run masks, keeping them distinct from the frozen R-band gate. +The closed column's1.06105487% compression was verified and explicitly excluded +from production-envelope acceptance. It reviewed the final causal conclusion: +work repair succeeds algebraically but does not solve E0/traction; the exact +partition reference still fails hydro/boundary/null requirements. No further +native evaluation is warranted in this slice. Positive shared partition is only +a next candidate to derive, including first moments, gravity, boundary degrees, +translation and acoustic spectrum; it is not a demonstrated repair. diff --git a/docs/plans/fluid-accuracy-composition/p1-material/admission.md b/docs/plans/fluid-accuracy-composition/p1-material/admission.md new file mode 100644 index 00000000..b0356933 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/admission.md @@ -0,0 +1,34 @@ +# Authorized bounded continuation + +User explicitly requested continuing PR123 through shared volume, first-moment, +gravity and boundary selection, with independent derivation review and one bounded +discriminator. Substantial representation changes require a concrete comparison +with the grid route, not indefinite experimentation. This admission exercises that +authority without asking for another direction or treating a reference as production. + +Base PR123/bc2573f2ba8d51f9f473fb11285b0c26840e4f18, separate worktree +/workspace/Rheon-p1-material, branch implementation/p1-material-gate-20261020. +Fresh origin/main fetch remains bc2f472787060d9a69cb619ed2c2fea10fd754b6. +Canonical plan PR120/8422f77 remains lead-owned. Exact exclusive writes are in +protocol. No source/custody of either negative campaign changes; no G1, shared +production, dependencies, proofs, root plan, merges or cleanup. Separate focused +stacked PR remains under lead integration authority. + +Standards pin0fc92a24279f3a4574c80af0a2f31ea347a21597; same routed core/router, +discovery/planning, numerical oracles/verification, implementation, proportionality, +Rust, architecture/contracts, documentation and commits as PR121/123. No AGENTS.md +found. This source is a private reference example, no runtime/state composition +or new public API. D1/G1 ownership remains unchanged. Production stays unselected. + +A1 source contracts/refusals; A2 precommitted coupled static gate with independent +source-integral oracle; A3 separate pre/post numerical review. No viscosity, +nonlinear trajectory, 3D, physical, GPU, GUI or production acoustic-step claim. +Existing finite work/stiffness proofs retain their original conditions; no new +Lean theorem or qualification receipt is asserted. A1/A2/A3 cannot discharge the +plan's native3D P-W acceptance or the grid Q1/Q2 gates. + +Design reviewed before any tests/computation; compile/check/Clippy only before +freeze. Commit source/protocol/evaluator, execute exactly the n8 gate, retain +negative controls and failures, independent review, then publish decision. Even +if all necessary reference gates pass, stop P1 production promotion and recommend +the existing grid Q1→Q2 route. Any later direction belongs to the repository lead. diff --git a/docs/plans/fluid-accuracy-composition/p1-material/analyze.py b/docs/plans/fluid-accuracy-composition/p1-material/analyze.py new file mode 100644 index 00000000..b6356ff6 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/analyze.py @@ -0,0 +1,42 @@ +"""Frozen necessary criteria for the ONE n8 material reference. Stdlib only.""" +import csv +import json +import math +import pathlib +import sys +# Evaluator tooling v2. Frozen scientific criteria and original bytes are +# retained under ../evaluator-tooling/. Guards remain active under -O / -OO. +def require(condition, message): + if not condition: + raise SystemExit("evaluator input refused: " + message) + +root = pathlib.Path(sys.argv[1]) +def read(name): + with (root/name).open() as f: + return list(csv.DictReader(f)) +s = read('summary.csv'); p = read('probes.csv') +require(len(s)==8 and len(p)==48 and len(read('nodes.csv'))==72 and len(read('elements.csv'))==64, 'p1-material: input contract at original line 12') +keys = ('perturbed','hydro','deformed') +def key(r): return tuple(r[k] for k in keys) +require(len({key(r) for r in s})==8, 'p1-material: input contract at original line 15') +report=[] +for r in s: + normalized = ('volume_error','mass_error','moment_error','work_error','momentum_error','affine_error','quadratic_error') + algebra = all(math.isfinite(float(r[k])) and float(r[k])<=1e-12 for k in normalized) + matrix = float(r['cholesky_min'])>0 and math.isfinite(float(r['row_bound'])) and float(r['row_bound'])>0 + alternate = float(r['alternating_max'])==20.0 + equilibrium = None if r['deformed']=='true' else all(float(r[k])<=1e-10 for k in ('equilibrium_error','bottom_load_error','top_load_error')) + groups=[] + for translation in ('false','true'): + g=[x for x in p if key(x)==key(r) and x['translation']==translation] + require(len(g)==3 and [float(x['eps']) for x in g]==[1e-5,1e-6,1e-7], 'p1-material: input contract at original line 26') + require(all(math.isfinite(float(x[k])) for x in g for k in ('energy_fd','energy_analytic','energy_error','volume_error','hessian_error')), 'p1-material: input contract at original line 27') + ok=[float(x['energy_error'])<=1e-6 and float(x['hessian_error'])<=1e-6 and float(x['volume_error'])<=1e-12 for x in g] + groups.append({'translation':translation,'eps_pass':ok,'pass':any(a and b for a,b in zip(ok,ok[1:]))}) + report.append({'case':key(r),'algebra_pass':algebra,'matrix_pass':matrix,'alternating_pass':alternate,'equilibrium_pass':equilibrium,'probes':groups}) +base_hydro=[r for r in s if r['hydro']=='true' and r['deformed']=='false'] +controls={k:max(float(r[k]) for r in base_hydro) for k in ('wrong_gravity_error','wrong_wall_error')} +controls_pass=all(v>1e-8 for v in controls.values()) +print(json.dumps({'cases':report,'control_maxima':controls,'controls_discriminate':controls_pass, + 'all_native_necessary_reference_gates_pass':controls_pass and all(r['algebra_pass'] and r['matrix_pass'] and r['alternating_pass'] and r['equilibrium_pass'] is not False and all(g['pass'] for g in r['probes']) for r in report), + 'production_admitted':False,'nonlinear_or_production_dt_admitted':False},indent=2)) diff --git a/docs/plans/fluid-accuracy-composition/p1-material/ledger.md b/docs/plans/fluid-accuracy-composition/p1-material/ledger.md new file mode 100644 index 00000000..46ddc75f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/ledger.md @@ -0,0 +1,32 @@ +# Bounded slice lifecycle + +2026-10-20: user authorizes PR123's coupled volume/first-moment/gravity/boundary +continuation, independent derivation and bounded discrimination, with explicit +cost comparison versus the plan's grid route if particle representation changes. + +Discovery/design: one material-interface formulation derived with shared source +moments, gravity and pressure potential; lumped inertia selected explicitly. +Independent reviewer finds the n8 test adequate only with endpoint lift, wet +extrema, translation, wrong controls and frozen native/oracle tolerances. These +are incorporated BEFORE tests or measurement. + +Freeze:3b609ee committed and pushed. Native tests5/5 debug and release, affected +strict Clippy, formatting and hygiene pass. One n8 native static run and frozen +evaluator complete. No sweeps, trajectories or retuning. Native gate passes its +two-consecutive-eps rule with8 smallest-step point failures retained. + +Verification: independent post-run source-integral/field review recorded in +review.md and archive. Reference acceptance is limited to stated finite static +claims. Particle production remains unselected and nonlinear dt unadmitted. + +Decision: stop this P1 production-promotion attempt, recommend existing-grid Q1 +verification then Q2 shared geometry/coupled Stokes through the lead. No third +material-mesh production family or new open-ended kernel campaign is started. +Both negative campaigns, production preview, G1 and canonical plan preserved. +Focused stacked PR, no merge/rebase/cleanup. Evidence custody binds exact source, +actual binary, raw fields, failures and independent review in manifest.json. + +A1/A2/A3 complete: accepted ONLY for the stated bounded reference result after +independent source-integral and field review. Scientific source/protocol remain +byte-identical to3b609ee. Archive retained in Library with exact receipt/hash. +P1 production is unselected; no Q1/Q2 or G1 action, merge or cleanup is taken. diff --git a/docs/plans/fluid-accuracy-composition/p1-material/manifest.json b/docs/plans/fluid-accuracy-composition/p1-material/manifest.json new file mode 100644 index 00000000..3550f60c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/manifest.json @@ -0,0 +1,73 @@ +{ + "schema_version": 1, + "scope": "P1 bounded material-map closure; reference only, not SPH/production", + "method_version": "material-interface-lumped-linear-eos-planar-reference-v1", + "frozen_commit": "3b609ee443a1a704f6aeeb4b836fcf30f7f4d248", + "base_pr": 123, + "base_commit": "bc2573f2ba8d51f9f473fb11285b0c26840e4f18", + "canonical_plan_pr": 120, + "canonical_plan_commit": "8422f77bb45e60b95c5694ed0b39e01377b62976", + "branch": "implementation/p1-material-gate-20261020", + "artifact": { + "filename": "rheon-p1-material-gate-3b609ee.zip", + "path": "/rheon-p1-material-gate-3b609ee.zip", + "library_file_id": "libfile_84afba543f3881918874e646634962e6", + "file_id": "file_0000000058e08230b4021f52c574e1ac", + "version": 0, + "bytes": 6976553, + "sha256": "52d1f4a718f70eba807195561d016eafbadc5c8ad297b06cd1071607988fd174", + "indexed_files": 1381, + "zip_entries": 1382, + "contents": "full frozen source, reference plan, actual binary, all raw fields and pointwise failures, execution logs, frozen evaluator, independent Decimal reconstruction, source-integral oracle, replay, reports; external receipt excluded to avoid self-hash cycle" + }, + "executable_sha256": "5abf51717b6d6fc3b893201272079d08c845d908441233b2b6a252026de86418", + "independent_review": { + "script_sha256": "b71ea21c20ab2276f3f5be27d1e54271d5f8c1798f1889d19221c172388502eb", + "summary_sha256": "5dcf05bb72eabf6ff2d8d145d238972dd29a1890af9877ae1ce7032dafce19a0", + "source_mass_normalized_max": 2.51615e-16, + "source_first_moment_normalized_max": 1.57131e-16, + "source_gate_limit": 1e-12, + "disposition": "pass reference only" + }, + "counts": { + "states": 8, + "nodes": 72, + "elements": 64, + "directional_probes": 24, + "translation_probes": 24, + "individual_probe_pass": 40, + "individual_smallest_step_hessian_fail": 8, + "group_pass": 16, + "group_count": 16 + }, + "verification": { + "focused_debug_passed": 5, + "focused_release_passed": 5, + "strict_clippy": "example and adapter pass", + "native_gate": "all frozen necessary native criteria pass", + "independent_source_gate": "pass", + "pre_post_review": "pass reference only", + "new_native_runs": 1, + "parameter_sweep": false, + "new_trajectory_run": false, + "production_admitted": false, + "nonlinear_or_production_dt_admitted": false, + "hosted_ci": "separate external evidence" + }, + "decision": { + "recommendation": "Stop this P1 production-selection attempt; prioritize existing grid Q1 verification then Q2 shared geometry/coupled Stokes via repository lead", + "basis": "coherent 1D closure requires substantial new material-mesh representation; 3D promotion adds new geometry/remap/boundary/viscosity/stability/state ownership beyond grid plan", + "new_Q_or_G1_writes": false, + "canonical_plan_edit": false, + "merge": false, + "branch_cleanup": false + }, + "preservation": { + "PR121_source_and_results": "unchanged", + "PR123_source_and_results": "unchanged", + "old_archive_hashes": "verified unchanged", + "production_preview": "unchanged", + "G1": "unchanged", + "proofs": "unchanged" + } +} diff --git a/docs/plans/fluid-accuracy-composition/p1-material/mathematics.md b/docs/plans/fluid-accuracy-composition/p1-material/mathematics.md new file mode 100644 index 00000000..1869e8db --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/mathematics.md @@ -0,0 +1,91 @@ +# Shared material map reference: one coupled formulation + +Version `material-interface-lumped-linear-eos-planar-reference-v1`. This is an +inviscid, 1D, fixed-connectivity material finite-element reference per unit area, +NOT a selected particle kernel or a production solver. It closes the causal +question left by PR121/123. No positive-kernel-partition solver is implemented. + +Let 0=X_0<...0, + rho(X)=rho_ref(X)/J_e, m_e=integral_e rho_ref dX, + Q_e=integral_e rho_ref(X)(X-X_e)dX. +The same map gives physical volume V_e=J_e L_e and mass first moment + B_e=m_e x_e+(x_{e+1}-x_e)Q_e/L_e. Total mass is sum m_e, total material mass +moment is sum B_e. There is no cellmean-to-site EOS reset or global mass scaling. +The nonnegative partition includes wall DOFs, reproduces x exactly on the whole +mapped interval, and avoids extrapolation beyond the interior-site convex hull. +It REPLACES particle DOFs by interface DOFs: this is a substantial method change. + +Declare ONE inertia: row-lumped M_a=integral rho_ref N_a dX>0, assembled from +[m_e-Q_e/L_e,Q_e/L_e]. Kinetic energy T=.5 sum_a M_a v_a² is a declared lumped +approximation, not generally the exact integral .5 integral rho_ref u_h². +Nevertheless integral rho_ref u_h = sum M_a v_a, sum M_a=sum m_e, and +sum M_a x_a=sum B_e exactly in real arithmetic. Gravity potential is the SAME +mass moment U_g=g sum B_e=g sum M_a x_a; gravity force is -g M_a. + +On the fully wet linear EOS p=c²(rho-rho0), e'=p/rho², define U_e by material +integration integral rho_ref e(rho_ref/J_e)dX. Its reference-shifted value is + U_e(J)-U_e(1)=c²[-m_e logJ+rho0 L_e(J-1)]. +Pressure force assembled from that potential is + F^p_e,left=-P_e, F^p_e,right=P_e, + P_e=c²[m_e/(J_e L_e)-rho0]. +Total unconstrained force is F=F^p-gM. Density is evaluated at material points; +P_e is a cell pressure mean for the force integral, not a new cellwise density +reset. Differentiating the SAME potential gives sum v_a F_a+d(U+U_g)/dt=0. +Stationary endpoint constraints have zero work. Fluid reaction on the holding +wall is F_0 and F_n, respectively, at equilibrium; it includes total pressure+gravity endpoint force. +Using pressure-only endpoint force as wall load discards part of the source work. +Moving walls, contact and moving solid geometry are not admitted here. + +At x=X choose rho_ref=rho0 A exp(g(1-X)/c²), A=1+p_top/(rho0 c²). +Since p'=-rho_ref g, exact integration gives + F_a=integral p N'_a-g integral rho_ref N_a=[pN_a]_0^1. +Every interior residual is zero for ANY strictly ordered reference partition; +endpoint fluid reactions are -p(0),+p(1). First moments are essential: replacing +Q_e/L_e by m_e/2 changes gravity and breaks this weak equilibrium identity. + +For manufactured affine PHYSICAL pressure p(x)=p0+s x, pressure assembly uses +its exact element average. With V_a=integral_physical N_a dV (half adjacent +physical lengths), F^p_a-[pN_a]_boundary=-s V_a including endpoints. This boundary +lift must be retained; raw endpoint force alone is not a body pressure gradient. + +The exact wet-branch Hessian is + H=sum_e c² m_e/(L_e² J_e²) d_e d_e^T, +where d_e has entries[-1,+1] on the interfaces. For fixed endpoints H_II is SPD: +a zero quadratic form requires every adjacent displacement equal, and zero ends +then force all displacements zero. M_II is positive diagonal. No extra even/odd +DISPLACEMENT null exists in this 1D system. This is stronger than PR123's pressure +operator check, but does not establish a 3D acoustic spectrum. An alternating +CELL pressure produces adjacent-pressure differences, not a zero central stencil. +A row bound for M^-1/2 H M^-1/2 is an upper linear frequency-squared bound; +no nonlinear step, positive-J update, viscosity, or production dt is admitted. + +## Integration and independent oracles + +For rho_ref=R exp(-a s), s in[0,L], store m and Q from + I_k=R L^(k+1) sum_{r=0}^{12} (-aL)^r/[r!(r+k+1)], k=0,1. +For |aL|<=.01 the omitted exact tail is bounded by + R L^(k+1) exp(|aL|)|aL|^13/[13!(k+14)]. This is a truncation-only real bound; +it does NOT bound IEEE rounding. Native shifted energy is evaluated stably with eta=J-1 from displacement +differences: c²[(rho0 L-m)eta+m(eta-log1p(eta))]. For |eta|<.01 the final +remainder uses its alternating series through power18; this is not an EOS change. +Constant source uses a=0 exactly. Independent +Decimal/high-precision or positive quadrature compares source integrals, forces, +mass moments, energy derivatives and wall reactions. Native positivity/wetness +checks use each source element's endpoint extrema, not just sampling points. + +## Primary basis and limits + +[Dobrev, Kolev and Rieben](https://doi.org/10.1137/120864672) and their +[LLNL framework presentation](https://computing.llnl.gov/sites/default/files/Multimat-11-PartI.pdf) +provide primary background for compatible material finite elements and shared +force/energy assembly. The low-order, linear-EOS, lumped-inertia and gravity +construction here is explicitly derived; it is not reproduction or validation +of their high-order gas-dynamics solver. Existing Rheon `Discrete.adjoint_identity`, `pressure_energy` and +`pressure_nonnegative` supply the finite adjoint/weighted-square algebra when B +is the node-edge incidence and weights are nonnegative. They do not prove the +strict fixed-end nullspace result or instantiate source integration. These +proofs apply only with their stated hypotheses; they do not verify +this Rust assembly, moving-mesh geometry or a new water capability. No new Lean +source, axiom or kernel qualification is claimed. diff --git a/docs/plans/fluid-accuracy-composition/p1-material/protocol.md b/docs/plans/fluid-accuracy-composition/p1-material/protocol.md new file mode 100644 index 00000000..9cb7be5e --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/protocol.md @@ -0,0 +1,68 @@ +# Frozen proposed minimal gate v1 + +Operation: one bounded static closure of volume/first moment/gravity/boundary +selection after PR123. Production promotion stops after this gate, pass or fail; +see route-decision.md. No parameter sweep or rest trajectory. Source/protocol and +criteria must be independently reviewed and committed before tests/computation. + +Exclusive writes: examples/material_partition_gate.rs, +examples/material_partition_gate/*, tests/material_partition_gate_contract.rs, +and this p1-material directory. PR121/123 sources/reports/archives and all src, +proofs, workflows, Cargo/dependencies, canonical plan and G1 remain untouched. + +One fixed n=8 material partition on[0,1]m: ordered X_i=i/8; perturbed interior +X_i=(i+.1 sin(i*2.399963229728653))/8; endpoints0,1. Two sources: +uniform rho_ref=1.005*998.2 kg/m³,g=0; hydro rho_ref=998.2 A exp(g(1-X)/1024), +g=9.80665,A=1+100/(998.2*1024),p_top=100Pa. Thus this derivative fixture can stay +inside the original1% compression envelope at c32, unlike PR123's deliberately +pressurized1000Pa probe. Assert source endpoint extrema/J satisfy rho00 on EVERY state/displaced probe. Do not retune if refused. + +For each partition/source evaluate x=X and x=X+.001sin(pi X): 8 total states, +not trajectories. Only x=X claims hydrostatic equilibrium or exact wall loads; +deformed states check the same nonlinear energy derivative and geometry identities. +Fixed endpoints in directional differences: v_i=.01sin(i*sqrt2),v_0=v_8=0; +eps=1e-5,1e-6,1e-7s. Source moments freeze once. Separate translate ALL interfaces +by±eps*.01m to test volume invariance and gravity/mass translation; translated +source labels stay fixed. Recompute from one declared potential without resets. + +Fixed scales: L_ref=1m, U_ref=.01m/s, rho_ref_scale=998.2kg/m³; +P_ref=998.2*1024*.005Pa uniform,100+998.2*9.80665Pa hydro; +M_ref=rho_ref_scale*L_ref, E_ref=P_ref*L_ref, power_ref=P_ref*U_ref. +Report SI residuals alongside normalized values. + +Fixed necessary criteria: +- total volume telescope error/L_ref<=1e-12, mass assembly defect/M_ref<=1e-12, + first-moment alias error/(M_ref L_ref)<=1e-12, volume translation defect<=1e-12. +- work defect/power_ref<=1e-12; global sumF+g sumM residual/P_ref<=1e-12. +- fixed-end directional potential derivative versus -F dot v, and uniform + translation derivative versus g sumM*.01, normalized by power_ref<=1e-6 at TWO + consecutive eps values; retain every raw value, including failures. + Force directional difference versus -H v uses fixed scale rho0*c²*U_ref/L_ref; + normalized error<=1e-6 at two consecutive eps, in both probe directions. +- BASE uniform interior E0/P_ref<=1e-10 and individual endpoint load defect/P_ref + <=1e-10. BASE hydro interior residual/(g M_a)<=1e-10, and each physical endpoint + reaction defect/P_ref<=1e-10. No criterion is applied to deformed equilibrium. +- manufactured affine pressure p=100+1000x with exact endpoint traction lift: + max residual/(1000 L_ref)<=1e-12 at all states, including endpoints. +- two declared diagnostic WRONG controls at BASE hydro: equal-half source mass + replacing first moments, and pressure-only wall load. Each must exceed1e-8 on + at least one partition under the corresponding equilibrium/wall normalization; + otherwise the test has failed to discriminate the missing first moment/load. +- assembled H_II has positive Cholesky pivots and matches independent edge-energy + quadratic form to1e-12 relative (scale max(E_ref,|quadratic|)); scaled row bound + finite positive. Alternating cell pressure100+10(-1)^e yields nonzero interior + force, with exact target20Pa max (operator diagnostic, not a new acoustic claim). + +Store 8 summaries,72 node rows,64 element rows,24 directional+24 translation +probes. Source masses and first moments compare against a separate retained +high-precision integral oracle before a positive mathematical disposition: +|m_native-m_oracle|/(rho0 L_e)<=1e-12 and +|Q_native-Q_oracle|/(rho0 L_e²)<=1e-12 on every element, frozen now. These compare +actual native rounding plus series truncation; the real-tail bound alone does +not supply that verification. The native evaluator outcome stays conditional on +this independent source-integral gate and review; it does not self-accept A3. +A1 new source tests check identities and refusal semantics. A2 actual gate checks +frozen criteria. A3 independent pre/post numerical review checks both the +candidate and whether controls discriminate. Fixed thresholds are necessary +reference-only criteria; original production P-W gates remain wholly unchanged. diff --git a/docs/plans/fluid-accuracy-composition/p1-material/qualification.md b/docs/plans/fluid-accuracy-composition/p1-material/qualification.md new file mode 100644 index 00000000..e734d756 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/qualification.md @@ -0,0 +1,57 @@ +# Reference qualification and limits + +Frozen numerical source/protocol:3b609ee443a1a704f6aeeb4b836fcf30f7f4d248. +Independent derivation/source review preceded tests and computation. Native CPU +Linux x86_64 Rust/cargo1.92.0 binary64 release, no-default-features. Actual binary +SHA2565abf51717b6d6fc3b893201272079d08c845d908441233b2b6a252026de86418. +Toolchain, full frozen source, execution/status logs and raw CSVs are retained. + +| Claim / check | Result | Scope | +|---|---|---| +| A1 source/refusal contracts | 5/5 debug and5/5 release pass | Includes unchanged EOS checks | +| Strict affected Clippy | example and adapter pass, -D warnings | Private CPU research targets | +| Formatting/diff | Pass | Source hygiene | +| A2 one frozen native n8 gate | exit0;8 states,72nodes,64elements,48probes | Static material-FE reference only | +| Native necessary criteria | All8 states/16 probe groups pass | 8 smallest-step pointwise Hessian failures retained | +| Wrong controls | Both discriminate missing moment/load | Not admitted candidate methods | +| A3 independent m/Q integral and field review | Pass; source integrals, stored force/geometry fields and diagnostics checked | Must pass frozen percell thresholds before positive reference disposition | +| Earlier campaigns/production/G1 preservation | Source diff empty; both earlier archive hashes unchanged | No merges, API/dependency/proof/workflow changes | + +The lumped kinetic energy is a declared approximation, distinct from the +consistent FE kinetic integral. A truncation-tail bound is not a native rounding +bound. Source integral comparisons use the precommitted percell tolerances; +finite differences use two consecutive scales, with every failure retained. +The n8 result establishes neither mesh refinement nor nonlinear stability. +No full CPU regression is repeated for isolated private example/test additions; +PR121's original582-test release result remains historical supporting evidence, +not a new full-suite claim. Hosted CI is separate evidence. + +Existing `Discrete` weighted-incidence proofs are reused conceptually with their +stated assumptions. No Lean source, axiom, historical receipt, fresh kernel or +Rust-equivalence qualification is claimed. Native3D viscosity, obstacle geometry, +free-surface/transport, nonlinear dt and all physical/GPU/UI claims remain absent. +No original P-W production gate is discharged by this reference. + +Reproduce with the committed protocol and fresh output path: + +``` +cargo test --locked --no-default-features --test material_partition_gate_contract +cargo test --locked --release --no-default-features --test material_partition_gate_contract +cargo clippy --locked --no-default-features --example material_partition_gate -- -D warnings +cargo clippy --locked --no-default-features --test material_partition_gate_contract -- -D warnings +cargo run --locked --release --no-default-features --example material_partition_gate -- FRESH_OUTPUT +python3 docs/plans/fluid-accuracy-composition/p1-material/analyze.py FRESH_OUTPUT +``` + +This operation intentionally ends with a concrete grid Q1→Q2 recommendation, +not further material/particle production promotion. Canonical plan and later +admission belong to the repository lead. + +Evidence archive `rheon-p1-material-gate-3b609ee.zip` is retained in Library. +[Manifest](manifest.json) binds its successful receipt,6,976,553-byte size, +SHA25652d1f4a718f70eba807195561d016eafbadc5c8ad297b06cd1071607988fd174, +actual executable, full frozen source, raw failures and independent review/replay. +The archive CRC/inventory passed. Its custody receipt remains external to avoid +a self-hash cycle. Earlier archives were rehashed unchanged; original, PR121 and +PR123 worktrees stayed clean. No source/protocol/evaluator/route derivation changed +after numerical freeze; only reports and custody metadata were added. diff --git a/docs/plans/fluid-accuracy-composition/p1-material/results.md b/docs/plans/fluid-accuracy-composition/p1-material/results.md new file mode 100644 index 00000000..ee695eb5 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/results.md @@ -0,0 +1,94 @@ +# Coupled gate closes in1D; use the grid route for production work + +**The one n8 material-map reference meets its frozen native necessary gates.** +Independent source-integral and field review also passes; the disposition is +recorded in review.md. +This is a successful bounded reference construction, not an SPH repair, production +water acceptance or a reason to start a third moving-mesh solver family. + +The source/protocol/evaluator froze at3b609ee443a1a704f6aeeb4b836fcf30f7f4d248 +before any tests or measurements. Exactly8 states,72 node records,64 element +records,24 fixed-end and24 translation probes completed in one native CPU run. +No resolution/support/timestep sweep or trajectory run occurred. Both previous +negative campaigns, their criteria and archives remain byte unchanged. + +| Fixed native check | Actual result | Disposition | +|---|---:|---| +| Volume telescope error | 0 | Pass | +| Mass assembly defect / M_ref | <=2.28e-16 | Pass1e-12 | +| Mass first-moment alias / (M_ref L_ref) | <=1.14e-16 | Pass1e-12 | +| Instantaneous work / fixed power scale | <=2.70e-16 | Pass1e-12 | +| Global pressure/body-force balance / P_ref | <=1.84e-16 | Pass1e-12 | +| Base uniform interior force / P_ref | <=2.28e-14 | Pass1e-10 | +| Base hydro interior force / nodal weight | <=2.68e-13 | Pass1e-10 | +| Base endpoint load defect / P_ref | <=2.28e-14 | Pass1e-10 | +| Affine pressure plus physical endpoint lift / (1000Pa) | <=1.57e-16 | Pass1e-12 | +| Edge versus assembled-H quadratic / fixed energy scale | <=2.79e-18 | Pass1e-12 | +| Fixed-end Cholesky pivot minimum | >=8.706e6 Pa/m | Positive on all8 states | +| Scaled-H absolute-row frequency² bound | 262144–292638.962 s^-2 | Finite positive; no nonlinear dt admission | +| Alternating CELL pressure interior force | exactly20Pa | Retains a response, unlike the prior central stencil | +| Wrong equal-half-mass gravity control | up to6.89394e-5 of nodal weight | Detects discarded first moments | +| Wrong pressure-only wall control | up to.0673944 of P_ref | Detects missing total endpoint reaction | + +Hydro equilibrium reactions are -9936.983974Pa below and +100Pa above for both +ordered and perturbed reference partitions. These come from the total pressure +and source-gravity derivative, rather than postprocessed load assignment. The +ordered wrong-gravity control is already1.19421e-7 of weight; the perturbed +control increases it to6.89394e-5, both visible against the1e-10 equilibrium gate. +The controls exceed their predeclared1e-8 discriminator threshold. + +All states and displaced evaluations passed J>0 and source-extrema wet/1%-envelope +checks. The maximum reported density compression among the8 state records is +.97215848%; extrema for displaced probes are asserted, not individually recorded. +This closed100Pa-top fixture still does NOT replace the plan's free-surface +hydrostatic/rest trajectory or3D wall acceptance matrix. + +## Retained finite-difference limitation + +Every one of the16 case/direction groups passes at the TWO consecutive predeclared +steps1e-5s and1e-6s. The8 fixed-end1e-7s Hessian differences FAIL their individual +1e-6 normalized criterion; all8 translation differences at that step pass. Thus +40/48 individual probe points pass, while all16 groups meet the frozen rule. +No point was dropped, threshold changed, source adjusted or campaign repeated. + +| eps(s) | Max normalized potential-derivative error | Max normalized Hessian/force difference | +|---|---:|---:| +| 1e-5 | 4.22e-10 | 6.48e-9 | +| 1e-6 | 4.31e-9 | 5.52e-8 | +| 1e-7 | 5.42e-8 | 1.39735e-6 | + +Error grows as displacement shrinks, so the smallest native difference is not +accepted as a more precise derivative. Independent80-digit reconstruction gives ideal-increment Hessian difference +error<=1.99e-15 at1e-7s, while f64-rounded coordinate increments alone yield +1.25892e-6–1.36499e-6 across all8 cases, versus native1.21609e-6–1.39735e-6. +Coordinate rounding amplified by stiffness thus reproduces the failure scale; +this explanation does not turn the failed native points into passes. The source +series truncation and native integration rounding are separately checked: maximal +normalized mass/first-moment discrepancies are2.52e-16/1.58e-16 against the frozen +1e-12 thresholds. See review.md for independent source/field evidence. This source +and positive assembly identity do not justify pretending every finite difference +passed, or claiming a formal IEEE error theorem. + +## What changed the result + +PR123 established that exact work without an invariant volume partition leaves +E0, while an exact Voronoi partition without consistent first moments/gravity +leaves irregular-site hydro and boundary errors. Here one material map supplies +volume, density, mass moment, gravity and endpoint derivatives. Source integration +preserves hydrostatic weak balance on either reference partition; no site/cellmean +EOS reset, density offset or corrective pressure multiplier is used. A cell +interface incidence supplies the stiffness, avoiding the1D even/odd displacement +null of a central-site stencil. + +The cost is a different representation: fixed connected material interfaces, +reference source moments, a deliberately lumped kinetic metric and held boundary +DOFs. This is not a selected SPH method. No viscosity,3D determinant/mesh validity, +remapping, general solid geometry, free-surface stress or nonlinear trajectory +was tested. Stationary endpoint reactions do not qualify moving walls. + +**Recommendation: close this bounded P1 production-selection attempt and +prioritize existing-grid Q1 verification → Q2 shared geometry/coupled Stokes.** +The [route decision](route-decision.md) compares concrete owners and unresolved +obligations. This recommendation stands even though the reference gate succeeds. +No further kernel/material-family campaign, Q implementation, canonical-plan +migration, merge or G1 edit is included. Repository lead owns the next admission. diff --git a/docs/plans/fluid-accuracy-composition/p1-material/review.md b/docs/plans/fluid-accuracy-composition/p1-material/review.md new file mode 100644 index 00000000..9a66994a --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/review.md @@ -0,0 +1,47 @@ +# Independent review + +Pre-freeze: read-only numerical reviewer /root/p1_numerical_review independently +derived the material potential, first-moment gravity, endpoint reaction, affine +traction lift, lumped inertia and positive incidence stiffness. It reviewed the +complete source, frozen scales, wrong controls and evaluator before ANY tests or +numerical experiment. It required dimensional independent m/Q oracle thresholds, +clear lumped-versus-consistent inertia, endpoint lifts, source-extrema branch +checks and separate translation probes; these are present before freeze. + +Final disposition: no remaining mathematical/source/protocol blocker to the ONE +n8 static discriminator. Post-run independent source-integral and field review +remain required. It agrees that this is a substantial new material-mesh family, +not an SPH repair; recommendation is a bounded reference then grid Q1→Q2 through +the lead, with no automatic Q writes. No files edited or experiments run by the +reviewer at this phase. Production, nonlinear timestep, viscosity,3D,physical +and G1 claims are explicitly excluded. + +Post-run A3: source-integral gate and frozen static necessary criteria PASS. +Independent80-digit Decimal closed-form source integration differs from native +mass by<=2.51615e-16 of rho0 L and first moment by<=1.57131e-16 of rho0 L², both +under the frozen1e-12 thresholds. Against physical source integrals, stored total +forces agree within3.28671e-10Pa and nodal masses within3.06287e-14kg/m². +The reviewer reconstructs stored force/geometry/moment fields and work, wall, +affine, stiffness and wrong-control diagnostics without importing/executing the +candidate. The full per-case/source/probe summary and input hashes are retained. + +The8 smallest-step fixed-end Hessian differences remain failed native points. +Ideal Decimal increments give <=1.9821e-15 normalized error at1e-7s, while the +same analytic force with independently f64-rounded coordinate increments gives +1.25892e-6–1.36499e-6, reproducing the native1.21609e-6–1.39735e-6 failure scale. +No native rerun, smoothing, source or threshold change occurred. Raw displaced +force vectors were not recorded: no bitwise per-node reconstruction of the last +native subtraction is claimed. The two-consecutive-step rule passes unchanged. +Independent displaced extrema stay within1% (max compression.9722383%). + +Retained independent reconstruction script SHA256: +b71ea21c20ab2276f3f5be27d1e54271d5f8c1798f1889d19221c172388502eb. +Summary SHA2565dcf05bb72eabf6ff2d8d145d238972dd29a1890af9877ae1ce7032dafce19a0; +full review SHA256c0e0950ae6ce88d39e4e7b0f2d7171dd79096d573ff20fa6769f11d694dea97d. +Root replay with explicit input/output directories reproduces the summary byte +for byte. This is independent code/reasoning/source verification, not an external +physical experiment, a Lean kernel result or3D water validation. + +Final review endorses this reference-only closure and the concrete cost-based +Q1→Q2 recommendation. No remaining blocker to reporting the bounded result. +No P1 production method, nonlinear timestep or new Q/G1 ownership is admitted. diff --git a/docs/plans/fluid-accuracy-composition/p1-material/route-decision.md b/docs/plans/fluid-accuracy-composition/p1-material/route-decision.md new file mode 100644 index 00000000..03b1c693 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1-material/route-decision.md @@ -0,0 +1,45 @@ +# Concrete route recommendation + +**Stop promotion of P1 particle production after this single material-map gate. +Prioritize the plan's existing Q1→Q2 grid reference route for accurate water.** +This is a recommendation to the repository lead, not a canonical plan edit or +authorization to change Q/G1 owners in this slice. Existing particle preview and +both frozen negative campaigns stay explicit. A future particle proposal must +supply a credible bounded method and pass unchanged gates; no indefinite kernel +correction campaign follows this reference. + +The material-map formulation has a coherent shared volume, first-moment, gravity, +wall and acoustic-displacement construction in1D. That distinguishes an actual +coupled representation from independent pressure/visibility/density corrections. +But it replaces free particle sites with ordered connected cell interfaces and +material reference mass; it cannot honestly be integrated as an SPH wall patch. +One n8 reference computation is justified only to close that causal question. + +| Obligation | Material-FE production route | Existing grid Q1→Q2 route | +|---|---|---| +| State/geometry | New material connectivity, reference density/moments, nodal state and3D Jacobian validity | Existing MAC/grid/obstacle/pressure/transport owners; common cut geometry still needs qualification | +| Large deformation | New distortion control, topology/remap and positive-volume policies | Fixed-grid transport/interface flux accuracy; original coarse failure retained | +| Stress/boundaries | New3D compatible pressure/viscosity, physical no-slip/free-surface traction and geometry | Already selected unified Stokes B/M/S/W reference, still to implement/verify on shared geometry | +| Stability/model | Weakly compressible acoustic stiffness plus nonlinear positive-J/wet-state dt | Incompressible pressure gauges/components, Stokes solve and cut-cell conditioning; transport CFL | +| Integration/custody | New native solver family/state schema, recording/replay, graph semantics | Reuse existing family/state owners and D1/G1 seams; add qualified capability/version | +| Scope evidenced here | Static planar algebra only; no viscosity,3D,geometry or dynamics | Existing native baseline and plan-specific references; no new accuracy acceptance claimed | + +Both routes require substantial numerical work. Grid is recommended because that +work advances the family already selected in PR120 without inventing a third +moving-mesh production owner. This is an ownership/dependency comparison, not a +measured effort estimate or a claim that grid cut cells are solved. + +Sequence: Q1 first measures native channel/transport resolution and Courant gates +before selecting transport changes; Q2 then implements common embedded geometry +and unified pressure–viscosity Stokes, with geometric interface transport only as +justified by Q1 and its own selection. Start with the plan's2D/extruded MMS, +physical wall loads and shared B/M/S/W work checks. Preserve stationary planar +versus arbitrary-mesh limits. G1/C1 integration stays with its owner. Do not +silently reinterpret P2 variable-volume particle initialization as a material +mesh seeder, or claim this reference discharges P1/P2/Q2. + +The selected grid family and limitations come from PR120 at8422f77 and +[Larionov–Batty–Bridson2017](https://elrnv.com/projects/variational-stokes-a-unified-pressure-viscosity-solver-for-accurate-viscous-liquids/), +including its [coupled-stress MMS supplement](https://cs.uwaterloo.ca/~c2batty/papers/Larionov2017/supplemental.pdf). +The reference is not independent proof of Rheon accuracy; native assembly, +geometry/refinement/traction/transport gates still have to be measured. diff --git a/docs/plans/fluid-accuracy-composition/p1/admission.md b/docs/plans/fluid-accuracy-composition/p1/admission.md new file mode 100644 index 00000000..6f441c59 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1/admission.md @@ -0,0 +1,71 @@ +# P1 bounded numerical selection admission + +Canonical plan: `docs/plans/fluid-accuracy-composition/plan.md`, PR120 at +`8422f77bb45e60b95c5694ed0b39e01377b62976`. Operation: **start P1 bounded +method-selection experiments**, not acceptance of a production wall method. +The user explicitly requested implementation on 2026-10-20 and assigned this +instance P1/F1/F2/F5. That supplies the revisit authority for the plan's Deferred +P1: Planned direction -> Active bounded selection. The repository lead owns +serial updates to the shared canonical plan and ledger; this disjoint admission +records the P1 facts for that integration without overwriting G1 admission. + +Base: fresh `origin/main` `bc2f472787060d9a69cb619ed2c2fea10fd754b6`. +Owner: delegated P1 numerical implementation instance. Integration owner: +parent/repository lead. Separate branch `implementation/p1-planar-selection-20261020` +in `/workspace/Rheon-p1`, target main, retained for focused PR review until lead +disposition. No merge, rebase or cleanup authority is taken. Audit119, plan120, +pressure-warm-start59 and original checkout are untouched. + +Exact exclusive write set: `examples/particle_planar_selection.rs`, +`examples/particle_planar_selection/*.rs`, +`tests/particle_planar_selection_contract.rs`, and this `p1/` report directory. +The adjacent integration adapter runs the same focused checks under ordinary +Cargo test/CI discovery without exposing a library API or changing workflows. +There are **no shared module declarations**, Session, recording, desktop, +lockfile, public API, existing particle preview or canonical plan edits. +Experimental numerical source stays outside the library until selection and +independent review pass. Its native f64 execution is design-selection evidence, +not a test of the production preview path. + +Current phase: **P1 active method selection, no production winner**. The bounded +campaign in the precommitted [protocol](protocol.md) is complete; +[results](results.md) reject both tested adaptations. Next slice: derive and +independently review one matched pressure/continuity/wall-reaction construction, +then freeze its version and consistency/work gates before evaluation. Full P-W +production acceptance remains pending. Failed screens return to method +selection; neither the target criteria nor frozen rest results may be relaxed. + +The initial reduction integrates the 3D kernel exactly over periodic tangential +planes and discretizes wall-normal parcels per unit area. It is a lower-cost +necessary screen, not the plan's full 3D native cloud/wall suite. Separately +sample actual 3D ordered/10%-perturbed clouds for kernel consistency. A candidate +that passes reduction still needs 3D wall shear, hydrostatics, geometry/oracle, +trajectory work, timestep and independent review gates before production. + +Standards pin: `0fc92a24279f3a4574c80af0a2f31ea347a21597`. No AGENTS.md +found in workspace/repository. Core/router, planning/discovery, implementation, +verification/oracles, development proportionality, commit, documentation, +Rust/library, architecture/code-design and contracts/evolution apply. Persistence, +GUI, foreign bindings, runtime dependencies and release are excluded: none changes. +Concurrent shared authority remains exclusively with the lead. Composed design +review: not applicable to this isolated numerical experiment; it creates no new +runtime composition, publication, public API or custody owner. The main plan's +D1/G1 architecture remains authoritative. + +Claims: (S1) equation/dimension/refusal and work-defect tests, focused native CPU, +automated; (S2) matched planar candidate comparison against analytic continuum +water and 3D cloud moments, numerical selection, native CPU, automated; (S3) +independent numerical review. S1 satisfied by 11 focused tests and affected +Clippy after independent review findings were corrected. S2 satisfied as retained negative selection evidence +(108 reduced hydro, 162 reduced shear, 36 3D operator studies, 18 geometry +diagnostics), not production accuracy. S3 satisfied by independent code, raw +field and result review; both formulations return to selection. No scientific +validation, mesh, GPU, UI, capillary or moving-wall claim is selected. No new Lean statement +is necessary: existing MaterialPreview antisymmetry is conditional and cannot +prove the candidates' missing geometry/adjoint hypotheses. + +Investigation bound: the unresolved wall/force/work formulation can invalidate +any production repair, and the plan explicitly requires selection before that +repair. This contained executable campaign is cheaper than integrating two +invalid native solvers. Stop after the fixed screen matrix and independent +review, retain failures, then return to method selection or 3D qualification. diff --git a/docs/plans/fluid-accuracy-composition/p1/execution-ledger.md b/docs/plans/fluid-accuracy-composition/p1/execution-ledger.md new file mode 100644 index 00000000..15c3bfe5 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1/execution-ledger.md @@ -0,0 +1,68 @@ +# P1 execution ledger + +This is disjoint supporting evidence for the canonical PR120 plan. Shared plan, +ledger and integration edits remain with the parent/repository lead. + +2026-10-20: user implementation direction supplied revisit authority for P1, +which moved from Deferred to Planned direction then Active bounded selection. +Fresh main bc2f472 matched the plan's admitted base, including D1/PR115. Isolated +branch/worktree and exclusive write set were declared; no shared declarations, +Session/recording/desktop source, existing preview, audit119, plan120 or PR59 +source was changed. Coding Standards pin 0fc92a2 read; no AGENTS.md found. + +Primary-source and independent numerical review established exact candidate +adaptations and limits before evaluation. Native standalone examples own the +bounded experiment, not a new production family. Fixed criteria and method +versions were committed before the scientific campaign in **39098e0**. Eleven +focused tests, strict affected Clippy, format and diff checks passed. Review +corrected candidate/ledger rollback, independent energy decomposition, +nonvacuous slip/isolation, source policy attribution, independent all-pairs +oracle, norm-bounded perturbations, zero-gravity limits and evidence flushes. +Early compile/analysis-script mistakes are retained in development logs; none +altered the frozen numerical campaign or its thresholds. + +Actual commands (run after sourcing the existing pinned setup environment): + +``` +cargo test --locked --no-default-features --example particle_planar_selection +cargo clippy --locked --no-default-features --example particle_planar_selection -- -D warnings +cargo fmt --all --check +cargo build --locked --release --no-default-features --example particle_planar_selection +cargo run --locked --release --no-default-features --example particle_planar_selection -- /workspace/rheon-p1-evidence/campaign-v1 +python3 /workspace/rheon-p1-evidence/analyze_campaign.py +cargo test --locked --no-default-features # supporting debug run interrupted +cargo test --locked --release --no-default-features +git diff --check +``` + +Campaign exit 0; 108 hydro/162 shear/36 cloud/18 isolation rows retained. Both +adaptations fail required scientific screens: [results](results.md). Independent +review checked all raw hydro/shear/cloud exports, recomputed RMS/energy/rates, +and confirmed return to method selection. Reduced arithmetic closure is not +physical conservation. No method was enabled in production. The full-core test +command is a supporting regression check, separate from selection accuracy; +its final outcome is recorded in qualification/manifest. The initial debug +run completed 37 groups (310 passed, none failed) before the long rotating +material scene was deliberately interrupted with SIGINT for verification cost. +That command returned 101 and is not a passing full-suite claim. Its log and +interruption record are retained. The complete optimized regression command +is the replacement supporting gate and completed: **582 passed, 0 failed, +3 ignored**, 75 groups, exit 0. The new ordinary-test-discovery adapter passes +the same 11 contracts in both profiles, with strict affected Clippy. Scientific +source, criteria and results were unchanged. + +Current P1 state: active method selection, no admitted winner. Bounded experiment +implementation and retained-negative-information claims S1/S2/S3 are satisfied. +P-W production accuracy, native 3D wall, consistent reaction/work and actual +pressure timestep claims remain pending. Next slice is one independently +reviewed discrete construction and new frozen protocol, not an unreviewed +coefficient/density fix. [Issues](issues.md) own specific follow-ups. + +Resource disposition: task-created `/workspace/Rheon-p1` and branch +`implementation/p1-planar-selection-20261020` are retained-protected for the +focused open PR. Source checkpoint 39098e0 was pushed to the matching origin +branch before reporting. Final report commit and remote/PR identity are recorded +in PR/manifest. Parent/repository lead owns serial integration and subsequent +resource disposition; no merge, rebase, branch deletion or worktree removal by +this instance. Raw fields/logs remain outside Git with retained archive and +compact byte binding, not a second production recording/custody implementation. diff --git a/docs/plans/fluid-accuracy-composition/p1/issues.md b/docs/plans/fluid-accuracy-composition/p1/issues.md new file mode 100644 index 00000000..390f169b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1/issues.md @@ -0,0 +1,14 @@ +# P1 selected findings + +| ID / severity | Evidence and consequence | Owner / disposition / next gate | +|---|---|---| +| P1-S1 / high | AHA adaptation perturbed n32/h1.5 speed .167893 m/s, pressure 19.0076%; material pressure/EOS work defect. Density pass does not establish pressure accuracy. | Particle numerics; return this version to method selection. Derive consistent pressure/continuity/wall reaction and prove/test constant/linear-field moments before another trajectory campaign. | +| P1-S2 / high | SA adaptation fine traction 29.33–35.87%, Poiseuille momentum ledger up to 3.3833e-4 kg/(m s); gamma pair force is not physical-mass antisymmetric. | Particle/wall quadrature owner; new matched construction required. Do not assign unexplained pair defect to wall reaction without derivation and independent traction verification. | +| P1-S3 / medium | Fixed-support partition/Laplacian bias persists under cloud refinement. Wendland fine rate pass is not full consistency or native decay qualification. | Particle kernel owner; keep neighbor/support growth separate from h→0; ordered and perturbed moment/trajectory gates. No single preset normalization. | +| P1-S4 / high admission gate | No qualified nonlinear discrete acoustic/geometry timestep for either method. h/c scales alone cannot establish stability. | Particle numerics; production timestep returns explicit unavailable state. Derive actual staggered pressure/viscous spectral/row bound after a coherent operator is selected. | +| P1-S5 / pending capability | Reduced trajectories and infinite-slab queries do not satisfy actual native 3D wall/mesh/corner/free-surface-junction verification. | Particle and geometry owners; 3D production qualification after necessary screens pass. P2 only after selected variable-volume-compatible quadrature. | + +All findings are retained in the current bounded selection work. None authorizes +a shared Session/recording/desktop edit or changes the original audit criteria. +V1's missing physical observations are independent; they did not block or +substitute for this campaign. No action was denied by approval review. diff --git a/docs/plans/fluid-accuracy-composition/p1/manifest.json b/docs/plans/fluid-accuracy-composition/p1/manifest.json new file mode 100644 index 00000000..b71d900f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1/manifest.json @@ -0,0 +1,68 @@ +{ + "schema": "rheon-p1-selection-evidence-v1", + "scientific_source_commit": "39098e0e0b0b0f8c966ff7f811d548b6d396ec15", + "base_main": "bc2f472787060d9a69cb619ed2c2fea10fd754b6", + "plan_commit": "8422f77bb45e60b95c5694ed0b39e01377b62976", + "audit_commit": "3d2bc4ea76dc71dfbb063afec5059d437f8826ce", + "coding_standards_commit": "0fc92a24279f3a4574c80af0a2f31ea347a21597", + "executable_sha256": "78b5e6d4c93249c4cd9940c987a1d134eac70e5b8b9bdc27b42dd0b63bb02537", + "sources": { + "examples/particle_planar_selection/cloud.rs": "62eb3d59366421f23b84baf678e7f4e7247112182720c0210b059e49a7669a3c", + "examples/particle_planar_selection/eos.rs": "1c40e49c33929af3aac7a52718eedfed181b43efe2993205f22074227b3d15db", + "examples/particle_planar_selection/fixtures.rs": "cf0b64c15efc3d0aa0a32664d8a8bb77436c90df09159a265333a41f7078d3be", + "examples/particle_planar_selection/isolation.rs": "c8454062461234b3c92afd443372c6ec2afd051006e52c899fdd8d5039e63d45", + "examples/particle_planar_selection/kernel.rs": "36edad1b3121dafe87bd4810af0f73c3babc339c85e7b45e1cf367c04047265e", + "examples/particle_planar_selection/matrix.rs": "97855af66d96197331e344db09234472b761166bf361a06bb9438453bad7a516", + "examples/particle_planar_selection/planar.rs": "e22f868592c5d022609e861f215c885a06b76615bb634beb84082ff805fcbde2", + "examples/particle_planar_selection.rs": "b746f302718d81fd64fad4f0f0466462d972b870cf7d67eca3de9f14c8ca6fd6" + }, + "protocol_sha256": "53ea889a1f64a2b34a007e658dc8a5d19f41bf90cdf03b30cdcaf0231ff105ee", + "ordinary_test_adapter_sha256": "5b52e344facae609a22dafce7f4e6b129872a481363f4765f476cd20d611795f", + "archive": { + "filename": "rheon-p1-planar-selection-39098e0.zip", + "sha256": "eb3a3886f80686cc97e9674ef65cb7af91b8d43b898d9d1af4f5bcd4d8f7a1fa", + "size_bytes": 28207734, + "custody": "retained outside Git; Library save recorded in task handoff" + }, + "retained_file_index_sha256": "c079ebff0ec2f17e1501cf7ee72116f629dd283cf4ca5fa4c30f805456c7d49f", + "retained_files": 353, + "summary_sha256": { + "hydro.csv": "946e2f6da2261fe21b9443b67b11dd6afd30d7bf01bdbfff44ce71a159ad8a00", + "shear.csv": "2d0b24c8a7b83becf32d3152e544cd328c3f6e7d468b6cdfe584d75d6c25b682", + "clouds.csv": "c25bc06e3a536c8cf5df37de6eaedfea2e8fe16a0af0f7b1b3b805609839a6ea", + "isolation.csv": "05e5e770e8bd68b486098b8e177af0a9281d83759a52e37eb1e3056061f68b4a" + }, + "analysis_sha256": "a431771fbbf4b992a45bcf5fec14f17626f60bb0a6677f68a2fef9d4372f5954", + "context_sha256": "ccb37a7e70e7d7d7a7c211b151a2fbdebd02f30e496229af0c2b32229c1b1768", + "verification_sha256": "288b3fdc04c558a4340f126d555b8733d230905f83411a24237803d0003bab96", + "verification": { + "command": "cargo test --locked --release --no-default-features", + "exit_code": 0, + "result_groups": 75, + "passed": 582, + "failed": 0, + "ignored": 3, + "ignored_tests": [ + "test frozen_model_selection_and_unsupported_domain_fallback_are_visible ... ignored, requires RHEON_AI_EXPORT from the SHA256-verified frozen checkpoint exporter", + "test real_model_advances_production_session_for_twenty_four_intervals ... ignored, requires RHEON_AI_EXPORT from the SHA256-verified checkpoint exporter", + "test real_checkpoint_support_replay_and_corruption ... ignored, requires RHEON_AI_EXPORT from the hash-pinned real lab checkpoint" + ], + "new_adapter_separately": { + "default_profile_passed": 11, + "release_profile_passed": 11, + "clippy": "passed -D warnings" + }, + "full_debug_suite": { + "exit_code": 101, + "disposition": "interrupted for bounded verification cost; not a full pass" + } + }, + "measurements": { + "hydro": 108, + "shear": 162, + "cloud": 36, + "isolation": 18 + }, + "production_admitted": false, + "disposition": "Both tested adaptations return to method selection; no physical/mesh/GPU/UI/Lean qualification inferred." +} diff --git a/docs/plans/fluid-accuracy-composition/p1/protocol.md b/docs/plans/fluid-accuracy-composition/p1/protocol.md new file mode 100644 index 00000000..69a43d0a --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1/protocol.md @@ -0,0 +1,123 @@ +# Fixed P1 necessary-screen protocol (v1) + +Frozen before numerical campaign execution. Authoritative full acceptance remains +[PR120 verification](https://github.com/MrScripty/Rheon/blob/8422f77bb45e60b95c5694ed0b39e01377b62976/docs/plans/fluid-accuracy-composition/reports/verification.md#particle-wall-and-equilibrium-gates). +No pass here admits production; failures are retained and return to selection. +This screen cannot establish the full plan's 3D native pressure/shear/wall gates. + +## Versions and sources + +Compare `aha2012-linear-wendland-planar-screen-v1` and +`mayrhofer2013-k0-si-mu-planar-screen-v1` against identical water/geometry. +[Adami–Hu–Adams 2012](https://doi.org/10.1016/j.jcp.2012.05.005), +eqs 6–10, 22–23 and 27, motivates dummy wall extrapolation. +[Original article text](https://www.academia.edu/4728278/A_generalized_wall_boundary_condition_for_smoothed_particle_hydrodynamics) +is the inspected primary article reproduction. [Mayrhofer et al.](https://arxiv.org/pdf/1304.3692), +eqs 37–38 (k=0), 18 and 20, motivates analytical wall integrals and the +native near-wall linear viscous law. Neither adaptation reproduces the whole +published method: kernel, EOS and integration differ; artificial viscosity, +density diffusion, damping and background pressure are absent. Source references +justify comparison, never Rheon equivalence. + +Use binary64 SI: rho0=998.2 kg/m³, mu=.001002 Pa s, g=9.80665 m/s², c=32 m/s. +Wendland C2 support **R=2h**, W=21/(2 pi R³)(1-q)^4(1+4q), q=r/R. +No lattice renormalization. Kernel/moment source: +[Dehnen–Aly 2012](https://arxiv.org/pdf/1204.2471). +Its application evidence does not validate water. Also compare frozen preview +poly6 density/spiky viscous stencil in the 3D instantaneous consistency study. + +The necessary planar reduction is a column per unit tangential area, mass kg/m², +volume m, force/area Pa and energy/area J/m². Exact tangential kernel marginal +K(s)=3/(2R)(1-|s|/R)^5(1+5|s|/R+8s²/R²), +K'(s)=-2 pi s W(|s|); phi=-K'/s=2 pi W(|s|). +Analytical gamma and its derivative are exact integrals of this kernel over the +admitted half-space/channel. Gamma is not the discrete particle partition. + +AHA fluid V_i=m_i/rho_i. Boundary quadrature volume per area stays its initial +spacing; pressure/density are extrapolated, the source freezes this volume in continuity. Fixing it also in +pressure and viscosity here is an explicit adaptation, not a source-exact claim. Boundary extrapolation uses K weights, physical prescribed velocity +in continuity, 2*u_wall-mean(u_fluid) in viscosity. Pressure uses symmetric +(V_i²+V_j²)*pbar. Record pressure/continuity EOS work defect; pair momentum +alone does not prove energy. SA k=0 uses V-weighted pressure extrapolation, +exact gamma surface terms in pressure and continuity, and dynamic-mu viscosity +divided by rho_i for SI acceleration. Wall slope is (u_i-u_wall)/distance, +measured from native particles; no analytic profile slope is supplied. +Record SA pair momentum/adjoint defects, including gamma asymmetry. Wall +pressure/viscous reaction is minus each actual wall contribution. Stationary +wall mechanical work is zero; extrapolated ghost velocity is not wall motion. +All density, pressure and viscosity use the same support and planar side. + +## Predeclared measurements and stopping rule + +Hydrostatic: H=1 m, free atmospheric top, bottom wall, infinite periodic tangent +planes (no vertical/free-surface-wall junction). n=16/24/32, h/dx=1.5/2/2.5, +ordered and seeded 10%-spacing displacement, dt=1e-4/5e-5/2.5e-5, T=.1 s. +Parcel mass integrates rho0 exp(g(H-y)/c²) over its source interval exactly; +initial rho is that continuum value at the parcel center. This is not a +quadrature correction. Measure discrete acceleration before stepping. Kick +velocity, then update continuity and positions with kicked velocity (declared +symplectic-Euler adaptation; no universal stability claim). Stop/refuse on +nonfinite state, nonpositive rho, bottom crossing or Mach>.1; retain last state. +Research dt is externally fixed, **not production-admitted**. Record density RMS, +pressure RMS/(rho0*g*H), maximum speed over horizon, fixed mass ledger and full +EOS internal+kinetic+gravity energy. Record integrated instantaneous pressure-work +and viscous power plus independently accumulated kinetic/gravity kick, kicked-continuity and +nonlinear EOS chain remainders, and their final closure residual. Never infer +these contributions from the remaining energy difference. Targets unchanged: rho RMS<=1%, +pressure<=2%, speed<=.01 m/s, mass<=1e-12, no crossing and decreasing resolution +error. Full unexplained energy threshold is 1e-8 of rho0*g*volume*H; explicit +measured defects are diagnostics, not a substitute pass. + +Shear: height .001 m, n=16/32/64, all support choices, T=.1 s, +requested dt=1e-4/5e-5/2.5e-5. Start exact Couette (upper .001 m/s) or +Poiseuille (stationary walls, body acceleration .01 m/s²). Also free-slip +constant velocity .001 m/s. The native assembled constant-density viscous +matrix includes actual dummy extrapolation or SA slope law. Before stepping, +equal parcel masses make the Euclidean norm exactly proportional to kinetic +energy. Check its explicit contraction matrix +`-(L+L^T)-dt L^T L` for positive definiteness, reduce dt to .9 of the numerically +computed contraction boundary, and shorten final step. This floating-point +matrix check does not prove nonlinear acoustic/geometry stability. Free-slip +has a constant null mode; its constant-profile screen uses the native +nonnegative row/Markov bound and checks the invariant directly. If no +positive contraction interval exists, record refusal. Targets: finest RMS<=2%, +finest two pairwise spatial orders>=.9, traction<=5%, momentum/source/reaction +ledger<=1e-8 of nonzero rho0*height*.001 m/s and wall work closure at same scaled +tolerance. Report absolute SI defects, measured viscous exchange and the independently +computed explicit-kick energy term. Do not call exchange physical dissipation +until traction, conservation and nonpositivity gates pass. + +3D consistency: periodic L=.001 m cubes at n=16/24/32, h/dx=1.5/2/2.5, +ordered/seeded 10% perturbations, vx=.001 sin(2 pi y/L), other velocities zero. +Seed fixed integer mixer; actual vector displacement normalized to norm<=.1dx and independently checked. +Evaluate density partition, gradient/Laplacian quadratic moments, actual neighbor +count, native initial viscous decay Rayleigh rate vs nu*(2pi/L)^2, pair momentum +and kinetic power. Pair enumeration is symmetric; self density included. This is +an instantaneous operator screen, not the full trajectory/decay gate. Finest +rate<=2%, consistency improves with support/resolution, closed momentum<=1e-10 +and no positive viscosity power. Fixed-support dimensionless biases are retained. + +Planar isolation: side-labelled infinite resolved slab, angles 0/17/31 degrees; +use independent segment/slab intersection oracle. Identical excluded-pair +predicate must remove density, pressure and viscosity support factors exactly. +Thin diagnostic queries retain nonzero unmasked support; they test the query +only and do not admit the refused volumetric wall formulation. Refuse thinner +than 2R and zero-thickness volumetric dummy support in this limited screen; +that conservative experimental domain does not establish a general physical +thickness limit. Imported meshes, edges and free-surface-intersecting finite +walls remain untested, explicitly unavailable for production. + +Stop selection at this bounded campaign. Any failed required screen or missing +3D/pressure timestep gate prevents production admission. Passing reduced +screens only identifies the next candidate for independent 3D qualification. +Do not silently retune kernel, wall law, dt, EOS or thresholds during evaluation. + +## Execution and evidence + +`source /workspace/rheon-setup/env.sh`; `cargo test --locked --no-default-features --example particle_planar_selection`; +`cargo run --locked --release --no-default-features --example particle_planar_selection -- FRESH_DIRECTORY`. +Retain all raw CSV fields and summary measurements outside Git. Commit only +source, protocol, results/review and compact hashes. Binary/source/compiler/command +binding in manifest; previous failed runs retained separately. Program exit 0 +means campaign execution completed, not physical acceptance. Focused Clippy, +format and unchanged-preview regression checks are supporting gates. diff --git a/docs/plans/fluid-accuracy-composition/p1/qualification.md b/docs/plans/fluid-accuracy-composition/p1/qualification.md new file mode 100644 index 00000000..e0acb336 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1/qualification.md @@ -0,0 +1,77 @@ +# P1 bounded campaign qualification + +This qualifies the experiment and retained negative results. **Neither wall +adaptation nor full P-W production accuracy is accepted.** The actual native +scientific source is frozen commit 39098e0e0b0b0f8c966ff7f811d548b6d396ec15; +subsequent report and ordinary-test-discovery adapter edits leave every +experimental numerical source byte unchanged. + +Environment: Linux x86_64 native CPU, Rust/cargo 1.92.0, rustc compiler commit +ded5c06cf in the retained verbose toolchain output. Binary64 Rust f64, no +fast-math or GPU claim. SI water inputs, temperature label 293.15 K, requested/ +actual intervals, dimensions, seed, support convention and executable/source +hashes are retained in the context/manifest. No physical observations or model +weights are used. + +| Claim / supporting check | Actual outcome | Limit | +|---|---|---| +| S1 focused equation, refusal, work, matrix, perturbation and enumeration contracts | 11 passed through the explicit example target and ordinary integration adapter | Native research source; not production wall verification | +| Strict affected Clippy | Example and integration-adapter target pass with `-D warnings` | Selected no-default-features CPU targets | +| Frozen numerical campaign execution | Exit 0; 108 hydro, 162 shear, 36 cloud, 18 isolation measurements; all reduced trajectories reach .1 s | Completed measurement, not physical pass | +| S2 selection information | Both adaptations fail fixed accuracy/work/traction/consistency gates | Return to method selection; no winner | +| S3 independent review | Primary-equation/source review, all raw-field checks and report disposition completed | Separate agent review; not an independent physical experiment | +| Full existing CPU regression, release profile | **582 passed, 0 failed, 3 ignored**, 75 result groups; exit 0 | Supporting behavior only; not full water validation | +| Formatting and diff | Pass | Selected source/repository hygiene | + +The ordinary adapter is `tests/particle_planar_selection_contract.rs`. It runs +the same eleven source-owned checks under existing Cargo/CI discovery and does +not execute the campaign CLI, expose a library API or edit shared workflows. +Independent review confirms that this adapter does not change the scientific +review subject. Check it with: + +``` +cargo test --locked --no-default-features --test particle_planar_selection_contract +cargo clippy --locked --no-default-features --test particle_planar_selection_contract -- -D warnings +``` + +The first broad debug regression was deliberately interrupted with SIGINT after +37 completed groups/310 passing tests (plus later tests in the still-running +material group). That command returned 101 and is not reported as a full-suite +pass. Its partial output and precise interruption record are retained. The +complete optimized regression command is the supporting replacement: +`cargo test --locked --release --no-default-features` passed the full existing +582-test population. The separately discovered new adapter also passes 11/11 in +both debug and release profiles. Three existing ignored tests require a +hash-verified real checkpoint exporter (`RHEON_AI_EXPORT`); they are not wall +physics acceptance and were not substituted. This profile change did +not change the already completed frozen scientific campaign or its criteria. + +Independent reconstruction of every hydro/shear/cloud raw field verifies RMS, +energy, moments, initial decay rate and pair power to the stated rounding limits +in [review](review.md). Finite/cardinality/source checks and actual retained +binary hashes bind observations; they do not establish accuracy by themselves. +The balance residual <= 7.25e-12 J/m² does not erase pressure/EOS work defects up +to several J/m². All source versions, original failing thresholds and raw +campaign files remain retained. No failed scientific screen was retuned. + +No new Lean source or axiom was introduced. Existing +[MaterialPreview](../../../../proofs/Rheon/MaterialPreview.lean) and +[WallFriction](../../../../proofs/Rheon/WallFriction.lean) algebra informed pair +work and wall-work accounting, with their explicit hypotheses preserved. Their +conditional pair/step statements do not prove gamma assembly, new dummy-wall +operators, perturbation consistency or Rust execution. No historical inventory +or proof receipt was regenerated and no fresh kernel qualification is claimed. + +Evidence custody: raw fields, executable, source snapshot, raw recomputation +script and all actual logs are outside Git in the retained archive identified +by [manifest](manifest.json). Only authored numerical source, tests, reports and +compact byte binding are committed. Audit119, plan120 and pressure-warm-start59 +remain independent and untouched. No Session/recording/desktop/public API, +solver ordering, old persisted representation or production default changed. + +Required remaining gates: one coherent discrete pressure/continuity and wall +reaction/work construction; consistent native viscosity/traction and neighbor +refinement; actual discrete pressure/geometry timestep admission; full native 3D +wall, thin-wall and boundary/interface suite. P2 remains after quadrature +selection. Experimental water/impact validation, GPU and native UI were not +executed and cannot be inferred from these results. diff --git a/docs/plans/fluid-accuracy-composition/p1/results.md b/docs/plans/fluid-accuracy-composition/p1/results.md new file mode 100644 index 00000000..9398e1fa --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1/results.md @@ -0,0 +1,154 @@ +# P1 selection results: neither adaptation is production-admissible + +The frozen campaign completed at source **39098e0e0b0b0f8c966ff7f811d548b6d396ec15**: +108 hydrostatic trajectories, 162 shear trajectories, 36 actual 3D cloud operator +studies and 18 planar isolation diagnostics. All 270 reduced trajectories reached +.1 s without a refused interval. Successful execution is not physical acceptance. +The fixed speed/pressure/traction/work criteria reject these adaptations. Return +P1 to method selection; do not change water defaults, normalize density alone, +or promote either candidate. The original preview and frozen failed rest +screens are unchanged. + +The [protocol](protocol.md) fixes dimensions, coefficients, geometry, versions +and targets before execution. [Admission](admission.md) records authority and +exclusive write set; [review](review.md) records independent findings. Full P-W +production acceptance remains pending, including actual 3D native wall +trajectories, geometry and discrete timestep qualification. + +## Matched planar results + +Representative finest hydrostatic results below use n=32, h/dx=1.5, support +R=2h, dt=2.5e-5 s, c=32 m/s. Pressure error is RMS/(rho0*g*H), density error is +RMS relative to the compressed equilibrium at actual parcel positions. Targets +remain .01 m/s speed, 2% pressure and 1% density. + +| Adaptation / cloud | Max speed (m/s) | Pressure error | Density error | +|---|---:|---:|---:| +| AHA dummy / ordered | .001558 | .1931% | .001843% | +| AHA dummy / perturbed | **.167893** | **19.0076%** | .3729% | +| SA gamma k=0 / ordered | **.062635** | **4.6447%** | .04506% | +| SA gamma k=0 / perturbed | **.190580** | **22.1342%** | .3218% | + +Both methods pass all 54 density targets individually. AHA passes only 24/54 +speed and 27/54 pressure targets; SA passes neither speed nor pressure target +in any of its 54 runs. Thus passing density RMS targets does not establish an +acceptable pressure/force method. The perturbed cloud is the prescribed seeded +10% displacement with fixed mass, not a uniform unpressurized fill. + +At n=64, h/dx=1.5, dt=2.5e-5 s, reduced no-slip shear gives: + +| Adaptation / flow | Velocity RMS error | Wall traction error | +|---|---:|---:| +| AHA / Poiseuille | .1483% | .06702% | +| AHA / Couette | .009288% | .1537% | +| SA / Poiseuille | .1221% | **29.3342%** | +| SA / Couette | .04883% | **30.3604%** | + +Across all support/dt choices, all 18 AHA fine no-slip profiles pass the 2% +velocity and 5% traction screens. Its measured pairwise spatial orders range +.9733–2.1852. SA also passes fine velocity, but fails all 18 fine traction +comparisons (up to 35.87% error); orders range .5700–1.1444 and do not meet the +fixed .9 target throughout. A good velocity profile alone would conceal this +traction error. The largest SA momentum/source/reaction ledger defect is +3.3833e-4 kg/(m s), versus the fixed nonzero-scale tolerance 9.982e-12 kg/(m s). +AHA's largest absolute shear ledger defect is 5.28e-17 kg/(m s). Stationary-wall +mechanical work is exactly zero in the recorded Poiseuille/slip arithmetic. +Both nonzero free-slip constant profiles remain invariant (worst relative +roundoff 8.58e-17) with measured zero traction. + +## EOS work and admission + +Mass is fixed in both reduced formulations: all mass ledger defects are zero +at recorded precision. No accepted center crosses the bottom plane. Full +internal+kinetic+gravity energy is evaluated, with stationary wall work zero. +The independently accumulated finite-step kinetic/gravity kick, +kicked-continuity and nonlinear EOS chain terms close the arithmetic balance +to at most **7.25e-12 J/m²**. Independent reconstruction from all raw state exports +confirms the pressure/RMS/energy observations. That small closure error is +**not** a conservation pass: it accounts for an inconsistent method's defect. + +Integrated pressure/EOS work defects range −.4248 to **+6.5868 J/m²** for AHA, +and −6.8197 to **+4.1195 J/m²** for SA. The plan's characteristic 1e-8 energy +scale here is 9.7890e-5 J/m². These large defects cannot be relabelled wall work +or physical dissipation. SA's gamma-dependent pair forces also lack exact +physical-mass momentum cancellation. The measured matched wall surface term +alone does not close that physical ledger; assigning the missing force to an +invented body reaction would hide the failing formulation. + +The linear EOS reference follows dp/dy=−rho*g: rho=rho0*exp(g*(H−y)/c²), +p=rho0*c²*expm1(g*(H−y)/c²). Exact source-interval integrals supply reference +mass per area; no global rescaling or lattice multiplier is used. Its internal +energy e=c²*(log(rho/rho0)+rho0/rho−1) on the compressed branch satisfies +rho²*de/drho=p. The source includes branch, integral, derivative and invalid-input +checks, including the zero-gravity limit. + +For 1 m and 1% allowed compression, c>=31.393633 m/s; c=20 would give 2.481963% +compression. The frozen c=32 meets that continuum criterion. The low-Mach +limit is U<=3.2 m/s and every retained trajectory stays below it. Neither fact +supplies a discrete acoustic stability bound. `production_dt` returns +`UnqualifiedAcousticOperator`; it does not disguise h/c as a proof. The reduced +hydro trajectories use fixed diagnostic timesteps, not admitted production +timesteps. Their kick/continuity/drift ordering differs from the original papers. +Native assembled shear matrices provide measured floating-point explicit +contraction intervals; actual and shortened-final timesteps are retained. This +linear constant-density check does not establish nonlinear pressure, geometry, +capillary or future variable-volume stability. + +## F5 native 3D consistency findings + +The cloud campaign evaluates actual native 3D kernel/viscous sums on 16/24/32 +periodic cubes with ordered and norm-bounded perturbed clouds. It uses a +constant-density operator isolation, not the current preview's full pressure, +estimated-density and contact update. The poly6/spiky variant studies those +kernel shapes at the same declared supports; it is not a replay of the preview's +fixed R=2dx default. No production result is silently reinterpreted. + +At n=32, Wendland/Morris initial shear decay-rate error is .5300–1.5897%, +passing the necessary 2% instantaneous rate screen in all six support/cloud +cases. Poly6/spiky errors range .8300–5.2362%, passing only two of six. All +observed pair kinetic powers are negative, and absolute closed momentum rates +are <=1.01e-22 N. This is an instantaneous rate/consistency study, not a full +native trajectory-decay gate. + +At fixed h/dx=1.5 the ordered Wendland partition bias is .3141% and its +Laplacian moment bias .06193%; refining spacing with the same dimensionless +stencil preserves those biases. For the poly6/spiky support study the analogous +ordered Laplacian bias is 4.4068%. At h/dx=2.5 Wendland partition and Laplacian +biases fall to .01379% and .003500%. Increasing support reduces sampling bias +while broadening the physical kernel, so it is not interchangeable with spatial +refinement. No preset coefficient is calibrated to erase one measured moment. +This is useful direction for the next selection study, not a selected pressure/ +wall method. + +## Isolation and capability limits + +All 18 infinite-slab diagnostic queries mask excluded density, pressure and +viscosity support factors exactly; 12 have nonzero unmasked kernels. Fifteen +volumetric support requests are explicitly refused, including zero thickness. +Angles 0/17/31 degrees and an independent local-coordinate segment oracle are +covered. The three thicker cases satisfy only this experiment's conservative +support envelope. These diagnostics do not execute a mesh-equipped production +particle solver, match wall loads, or qualify finite thin surfaces, corners, +curvature, free-surface/wall junctions or imported obstacles. + +The candidate implementations are explicit adaptations of primary-source +families, not reproductions or counterexamples to the published papers. The +semi-analytical adaptation uses exact half-space/channel gamma and a native +near-wall slope law; it does not implement every boundary vertex, diffusion or +free-surface construction in the paper. The dummy adaptation changes EOS, +kernel, fixed-volume force policy and integrator. Results decide these frozen +versions only. No full mesh water, physical impact, GPU, native UI, capillary, +turbulence or experimental water validation is claimed. No new Lean source was +added and no historical proof receipt was refreshed. + +## Next decision + +P1 remains in method selection. AHA's reduced ordered shear behavior is useful, +but its perturbed-pressure and EOS work defects preclude production selection. +Do not relabel gamma-induced pair defects as wall force without deriving and +verifying matched wall traction. The next bounded direction must derive pressure/continuity as a +single physical-mass adjoint pair with matched wall reaction, then establish +quadrature consistency on perturbed clouds and derive the actual staggered +pressure/viscous timestep bound. If that changes equations or wall quadrature, +freeze a new explicit version and protocol before evaluation. Preserve this +campaign. P2 follows a selected coherent quadrature; G1/C1 remain independent. diff --git a/docs/plans/fluid-accuracy-composition/p1/review.md b/docs/plans/fluid-accuracy-composition/p1/review.md new file mode 100644 index 00000000..8af342b2 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/p1/review.md @@ -0,0 +1,89 @@ +# Independent numerical implementation review + +Reviewer: delegated read-only `p1_numerical_review`, distinct from implementation +author. Reviewed the actual source, primary equations and fixed screen protocol. +No reviewer edits and no physical/production acceptance are implied. + +Pre-campaign findings and dispositions: + +- AHA pair antisymmetry does not imply EOS work consistency; SA gamma boundary + operators are not exactly discrete adjoints. Both now measure actual pressure + work and pair momentum defects; no global conservation theorem claimed. +- SA printed viscosity with dynamic mu needs whole-operator division by density. + SI adaptation is explicit; native wall slope comes from parcel velocity/distance, + never the exact analytic profile derivative. +- Simultaneous forward Euler cannot stabilize undamped acoustic eigenmodes. + Research uses declared kick/continuity/drift ordering; production acoustic + admission remains explicitly unavailable. Shear uses the actual assembled + explicit contraction matrix with equal physical parcel masses. +- Rejected candidate velocity/work/momentum must not enter accepted results. + Complete candidates and ledger terms are now published only after all checks; + refused candidate fields are separate from initial/last accepted fields. +- An energy remainder cannot be labelled temporal by subtraction alone. Native + code independently accumulates kinetic/gravity splitting, kicked-continuity + and nonlinear EOS chain terms, and compares their sum to measured total change. +- Fixed dummy volume in all operators is an adaptation; the inspected source + explicitly establishes this policy in continuity. Protocol now distinguishes it. +- Added independent 3D all-pairs enumeration comparison, norm-bounded rather than + per-axis perturbation, zero-gravity helper checks and empty wall-support handling. +- Added actual nonzero free-slip campaign plus a focused fixture regression. + Initial zero slip data would have made the comparison vacuous. Traction is + measured, final physical time and shortened final dt are retained. +- Thick slabs cannot nonvacuously test cross-wall kernel masking. Thin geometry + diagnostic queries now have positive unmasked kernels and exact zero masked + density/pressure/viscosity factors, while volumetric support admission is a + separate refusal. This is not native mesh-wall qualification. +- All evidence writers now explicitly flush and propagate write failures. + +Supporting pre-campaign checks: 11 focused tests passed, strict affected Clippy +passed, format/diff checks passed. These check code and experimental contracts; +they do not decide the water accuracy thresholds. + +Final pre-campaign disposition: adequate to freeze and execute this bounded +research campaign; no production method admitted. Frozen source checkpoint: +39098e0e0b0b0f8c966ff7f811d548b6d396ec15. + +## Independent campaign disposition + +**Return both adaptations to method selection.** Reviewer independently parsed +all 108 hydro, 162 shear and 36 cloud summaries and raw field files. Every +hydro density/pressure RMS and every shear velocity RMS agrees to roundoff; +pressure matches the EOS; all accepted centers remain above the bottom; every +reduced trajectory reaches .1 s. Direct total-energy reconstruction agrees +within 8.46e-11 J/m² using an independently evaluated log expression. The +accumulated ledger closure <=7.25e-12 J/m² verifies accounting, not conservative +dynamics: integrated pressure-work defects are orders of magnitude larger than +the fixed characteristic energy target. + +Verified decisive failures: perturbed AHA n32/h1.5 speed .167893 m/s and +pressure 19.0076%; ordered SA same configuration .062635 m/s and 4.64473%; SA +fine traction 29.33–35.87%, Poiseuille momentum defect 2.93e-4–3.38e-4 kg/(m s), +and multiple spatial orders below .9. Fourfold diagnostic dt reduction barely +changes these failures. All 36 raw cloud fields reproduce rates, moments and +power to summation roundoff; powers are negative and momentum rates negligible. +Wendland's fine instantaneous rate success does not close consistency: +fixed-support partition/Laplacian moment biases persist under refinement. +Nonzero free-slip invariance passes. + +The report's counts, values and capability limitations were independently +reviewed. Two wording findings were corrected: passing density targets does not +establish improvement against the preview, and a future justified wall-reaction +derivation remains possible even though post-hoc relabelling of current defects +is invalid. Final disposition: the necessary-screen implementation and retained +negative information are reviewable; P1 production remains unaccepted. + +Recommended next mathematical work: first establish constant/linear-field +consistency and neighbor growth; derive continuity, pressure work and wall +reaction from one discrete construction; derive viscosity/traction from the +same quadrature and boundary lift; repeat focused algebra/moment/traction gates +before another trajectory campaign. No independent Lean kernel rerun, native +GUI, GPU, physical experiment or full production water test is claimed. + +## Ordinary test discovery + +The reviewer checked the small integration adapter. It only makes +the existing eleven checks discoverable by ordinary Cargo test; it does not +execute the campaign CLI or change its numerical sources. All example sources +remain byte-identical to 39098e0. Scientific review/disposition is unchanged. +The complete 582-test existing CPU release suite and 11 adapter checks passed; +the partial debug run is explicitly retained as interrupted, not accepted. diff --git a/docs/plans/fluid-accuracy-composition/plan.md b/docs/plans/fluid-accuracy-composition/plan.md index 4e2f273e..9fd3d130 100644 --- a/docs/plans/fluid-accuracy-composition/plan.md +++ b/docs/plans/fluid-accuracy-composition/plan.md @@ -1,6 +1,48 @@ # Water accuracy and inspectable solver composition -Repair-plan status: **Deferred — production not admitted**. P0 is the separate plan/proof delivery completed in draft PR120; writing this proposal does not approve its candidate methods. Current phase: P0 delivered and qualified; production remains deferred. Exactly one next slice: **G1, inspect the existing configured MAC pressure workflow from authoritative composition and execution receipts**. A future authorized follow-up can select this plan unambiguously in conversation; the implementation owner then resolves the relevant deferral and approves the bounded direction as Planned, rechecks current main and freezes G1 contracts/write set before `start` transitions Planned to Active. The user need not recite a path or repeat already granted authority. This proposal alone does not start production. +Repair-plan status: **Active — PR142 final hosted integration gates**. +Continue under fresh 2026-10-21 user authorization to complete and normally merge +the five retained PRs. Current main is `15026a966265cf9eaedf464e2b5a066bd0fef3d8`; +PR142 is the sole serial integration lead. Independent complete 152-path source +admission passes, and actual source `dbd49d3` passes the scoped composite +native/rational/packet/fullcore plus source-identical hosted feature evidence +([result](reports/pr142-completion-20261021/qualification.md)). The original +all-local duplicate attempt is intentionally cancelled, retained as such under +its [explicit evidence replan](reports/pr142-completion-20261021/evidence-reconciliation.md). +The next slice is exact reporting-head hosted checks and independent final +result review, followed by normal expected-head PR142 merge and post-merge +verification. Historical no-merge delegation is superseded only for this fresh +task; earlier denied task reads/artifact retrieval remain prohibited. Integrate +#142 → #138 → #143 → #59; admit #150 only when its final artifact gate is +satisfied. Every original branch and receipt remains. Whole-application +production acceptance is separate from code integration. + +PR138 preparation is independently source-reviewed and preliminarily qualified +on `91c4f4bd8bb29e9862f6ee29cd8bdead79e0d57e`: complete 152-input composition, +150 exact dependency identities and two dev-only Cargo changes. All 18 native +commands, 52 real-packet tests and 143 focused ordinary checks pass with independent +source/execution/archive review ([results](reports/pr138-integration-20261021/preliminary-results.md)). +Its isolated branch now reconciles reporting head +`3cd735fde7655aedffbd0ffb2f041ca6994961a4`, whose outer follow-ups are the CI +feature-job budget, its coordinated source-only guard and reviewed authored +result/status/custody documents; selected source and bound admission remain frozen. PR138 is not final-ready: verify the actual +PR142 merged-main identity, revalidate final combined source and hosted gates, +then let the sole lead normally merge it. The [PR138 protocol](reports/pr138-integration-20261021/protocol.md) +retains its source, scope and outcome boundaries. This does not add a second next +integration slice or change the lead's order. + +PR143 preserves that complete admission unchanged and records its separate +preliminary ordinary attempt on `31c1958` in the +[result](reports/pr143-integration-20261021/qualification.md). Its isolated +composition retains reviewed PR138 reporting and guard follow-ups at `da1708d`. +These results do not represent merged main. Actual verified PR142 then PR138 +landing, current-source revalidation and final hosted/review gates remain +prerequisites for PR143 readiness; normal main merges remain solely with the lead. + +The numerical owner delivered Q1 source and retained incomplete qualification in [PR126](https://github.com/MrScripty/Rheon/pull/126), head `dfcc693bf8b66678a924e4a92d299127f6746526`, scientific freeze `b9a9d4ca3ff02c9eae38eb20dced49e87a923380`. The numerical owner has now implemented the separately frozen **Q2 common-geometry reference toward coupled Stokes** in [PR127](https://github.com/MrScripty/Rheon/pull/127), checkpoint `7d7306ad4421e8424f836fd4cfc3c38b52860e2b`. Independent post-run review found five positive native apertures on exact-zero-measure source faces in version 2. PR132/e6525a1 repairs exact represented-source predicates for the fixed corpus; PR134/f84f651 supplies eight aligned coupled-algebra cases. Their separately reviewed Cargo closure passes fresh qualification on `9a9904f`, documented in the [dependent result](https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md). Fixed PR133/9c04278 remains unchanged. Version-1 refusal and version-2 failures remain retained. PR135/4f8bd22 delivers the separately qualified CV1 cut-cell operator/physical-trace reference at frozen source `6d99e77`; later PR139/902f609 reports the bounded CV2 static 24-case conditioning/coupled-solve gate locally satisfied at source `b0a9d52`. Generic mixed-pair stability, PDE/evolving-geometry and production gates remain open; no production Stokes or water-accuracy acceptance is claimed. The bounded P1 production-selection direction is superseded: the two wall adaptations and the later static alternatives did not meet their unchanged gates, and the coherent 1D material reference would require a third production state/geometry family. Preserve all three campaigns and their failures. No particle production method, transport repair or new physical accuracy is admitted by this route decision. Draft [PR128](https://github.com/MrScripty/Rheon/pull/128) has locally qualified bounded C1-B1 supplied-array validation at tested source `f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a`, final evidence head `43a084a66bdfb3731b24bd480909c81e317b1e53`; supporting checks and final architecture/contracts reviews passed within that scope. Hosted integration and full replacement remain pending. C1-B/C/C1-R stay separately gated and numerical work does not wait for a universal composition framework. + +Composed-design review: **applicable**. The [complete eight-probe admission](reports/architecture.md#standards-and-composed-design-admission) remains the ownership boundary: existing numerical/Session/provider/runtime/recording/UI owners, finite native contracts and explicit unavailable transfers. The Q1/Q2 route advances the existing grid family rather than adding a moving-material production family; it does not change those owners. Re-run the probe if Q2's actual selected assembly changes that composition. + ## Objective and acceptance @@ -8,14 +50,14 @@ Repair the eight findings in [the frozen audit](https://github.com/MrScripty/Rhe Objective acceptance requires (1) all F1–F8 dispositions backed by native CPU verification, with failed/unavailable capabilities still explicit; (2) independently reproduced convergence and conservation gates for each admitted family; (3) coherent fluid/solid/free-surface stress and mass accounting; (4) stage, compatible-subgraph and whole-family substitution demonstrated with adversarial classical fixture providers and exact provenance; (5) a working interactive 2D workflow inspector in the existing native application, from live execution through cold archive inspection; and (6) physical validation claimed only for observations actually retained with uncertainty. AI accuracy requires separately qualified model assets and comparisons; contract acceptance alone is insufficient. -Current acceptance: the original audit is complete and immutable; planning, research and new proof qualification are separate evidence. **None of the production repair, interactive native inspector, new solver accuracy or experimental-validation acceptance claims is satisfied by this proposal or its HTML prototype.** See [qualification](reports/qualification.md) for what was actually checked in this PR. +Current acceptance: the original audit remains complete and immutable; P0 planning/proof evidence remains separate. **Recorded G1 local CPU/archive/native-interaction and fixed-budget gates passed** within [G1 qualification](reports/g1-qualification.md). G1-U retains its recorded environment scope. G1-C iteration consistency is repaired and locally verified on fixed stage `9c04278`, with independently reviewed 135-path admission and fresh native/rational/packet evidence. PR137 repairs the later-reproduced advection-cancellation label at tested `70da36d`; the separate clean 140-input stage `186dc0a` freshly verifies its 26 workflow contracts within the full library suite. Fixed 9c/9a retain that historical defect and their original receipts. Full hosted integration remains separate. Hosted Pages/browser/publication and implementation integration remain pending. New numerical accuracy, other solver families, learned deployment and experimental-validation acceptance remain pending their own gates. The HTML prototype establishes none of those production claims. [P0 qualification](reports/qualification.md) retains its original scope. ## Authority, constraints and reuse -- Admitted source: remote `main` **bc2f472787060d9a69cb619ed2c2fea10fd754b6**, fetched 2026-10-19. It includes PR115 merge `60eca79a688167532e71faa17b9e5b2bc5ce2b3d` (source head `62d73f1c43c12a1df1e20dfd311c0b0fe5d881b6`). D1 is implemented; do not restart it. [Architecture](reports/architecture.md) identifies concrete reusable owners. -- Audit PR119/head `3d2bc4ea76dc71dfbb063afec5059d437f8826ce`, PR59 pressure warm-start head `7f1733f0dc956ef8f25d5b110d990117fb765903`, original checkout and unrelated branches are protected. No merging, history rewrite, broad production patch or surrogate substitution is authorized here. +- Current remote `main`: **15026a966265cf9eaedf464e2b5a066bd0fef3d8**, freshly fetched for PR142 completion on 2026-10-21. Prior PR120/119 integration main was `718469beedb9a949f4bb6f3299c7b880b4c47e47`. Original discovery main `bc2f472787060d9a69cb619ed2c2fea10fd754b6` and PR115 source remain historical. Fixed staged execution is bound separately to `9c04278`, not to later documentation. D1 is implemented; do not restart it. [Architecture](reports/architecture.md) identifies reusable owners. +- Current operation is `continue` on this canonical `docs/plans/fluid-accuracy-composition/plan.md`. The implementation owners recorded explicit bounded user admission for G1/C1-A and the numerical continuations. The repository integration lead serially owns shared status, dependency retargeting and integration disposition; no owner may widen another write set. PR120/119 are verified merged after direct confirmation. Automatic approval review rejected PR121 and the single requested retry because it applied the original trusted no-merge delegation over tool-relayed confirmation. That historical task paused public merges. Fresh 2026-10-21 user authorization now admits normal reviewed merge of these five retained PRs through the sole PR142 lead; required hosted/review gates remain binding, and denied reads/downloads remain prohibited. PR59 at `7f1733f0dc956ef8f25d5b110d990117fb765903`, original worktrees and unrelated work remain protected. No history rewrite, broad production patch or surrogate substitution is admitted. - Applicable Coding Standards pin: `0fc92a24279f3a4574c80af0a2f31ea347a21597` in `MrScripty/Coding-Standards`. No AGENTS.md found in `/workspace` or repository. Apply core/router, planning/discovery, implementation, verification/GUI, development proportionality, architecture, contracts/evolution, persistence, accessibility, library and commit rules. [Standards decisions](reports/architecture.md#standards-and-composed-design-admission) records their concrete effect. -- This isolated branch `plan/fluid-accuracy-composition-20261019` is owned by the delegated Codex planning agent, targets `main`, and is retained for the open draft proposal until repository owner disposition. It exists to isolate plan/proof review from PR119/PR59, not as a permanent evidence store. Integration owner: repository maintainer. No merge in this task. +- P0 source `8422f77` is retained in merged PR120. The earlier documentation branch `integration/fluid-route-status-20261020`/PR129 remains historical review context. Fixed PR133 branch `integration/native-admission-fluid-20261020` remains at 8bf542e. Q2 PR138 retains its exact owner PR132/134 commits and separately qualified Cargo closure. Current branch `integration/c1b2-admission-20261020` retains exact PR136/e56bc7b and PR137/d3e6237 and adds only its separate admission/review and shared qualification/status documentation; the repository lead is integration owner. Preserve every component source/protocol and exact qualification subject. Retire task resources only after the accepted target retains the exact intended head; no unrelated cleanup. - CPU binary64 reference first; production precision is explicit per family. Water at 293.15 K, SI, incompressible single liquid with prescribed atmosphere for the grid path. Particle weak compressibility is a distinct model. Frozen replay: rho=998.2 kg/m³, dynamic mu=0.001002 Pa s, nu=mu/rho=1.0038068523342016e-6 m²/s, g=9.80665 m/s², sigma=0.0728 N/m. Property rounding and correlation uncertainty are separate from solver error. - No turbulence closure, compressible acoustics, multiphase entrainment, boiling, arbitrary moving rigid bodies or hardware speed claim is implied. Record Re, Fr, We, Mach and feature/grid ratios for each claimed envelope. Water at metre scale can be turbulent; laminar verification does not validate that regime. @@ -37,25 +79,46 @@ Owners below are **responsibility roles**, not assignments to an unverified pers ## Dependency milestones -All production milestones are **Deferred** implementation proposals awaiting explicit slice admission; none has acquired Planned status merely by being written. At `start`, admit only the selected direction and required bounded selection experiments, then use Planned/Active/Implemented/Verifying/Accepted as warranted. The particle algorithm decision and experimental inputs remain explicit gates. A method-selection experiment can be admitted without authorizing its winner as production. Each slice freezes its exact methods/coefficients/thresholds first; a failed gate returns to method selection rather than quietly relaxing tolerances. +G1 and C1-A have **passed local qualification, integration pending**. Their scoped local claims remain distinct from required hosted integration gates. The numerical admissions/results below replace the original proposal's unstarted P1/Q1 cells; the original criteria remain unchanged. A selection experiment does not accept its candidate as production. Freeze method-specific coefficients, thresholds and write sets before each evaluation; failed gates require a retained method/envelope decision. | ID / lifecycle | Goal, dependencies and bounded write set | Acceptance and review | |---|---|---| | P0 / Accepted (proposal/proof artifact only) | This plan, research, isolated proof sources and compact manifests only. No `src` changes. | Qualified proof claims, independent math/architecture/standards reviews disposed, focused draft PR; no production claims. | -| G1 / Deferred | First vertical slice: existing configured sealed-MAC pressure execution → typed descriptor and attempt receipts → live/archive native workflow inspector. `simulation`, `liquid_step`, `solver_provider`, `session` observation seams; `recording` additive profile; desktop inspector/run-set/archive consumers and focused tests. Do not widen supported numerical domains. | [G1 exact acceptance](reports/verification.md#g1-native-workflow-inspection). Descriptor digest/actual interval/provider/fallback binding; corrupt/missing/legacy evidence handled; actual native pointer+keyboard+close/reopen/cancel workflow. Composition, persistence and GUI reviewers. | -| C1 / Deferred | After G1, add finite typed stage/subgraph/whole-family interfaces alongside pressure v1. Native-family facade delegates to existing state owners. Implement deterministic adversarial classical fixtures before learned deployment. `solver_provider`, family-specific step/session adapters, existing configured intent/custody/comparison; no arbitrary registry or tensor engine. | [Replacement gates](reports/verification.md#replacement-contract-gates): support/units/layout/operator identity; accepted trajectory unchanged for same native baseline; rejection/fallback/rollback under bad candidates, stale identity, errors and cancellation; cold inspection without runtime. Architecture + contracts review. | -| P1 / Deferred | F1/F2/F5: planar wall comparison and linear-EOS equilibrium initialization/dt admission. Shared pair visibility and wall quadrature; pressure/density/viscosity derived together. `particle_fluid`, boundary geometry queries, focused reference fixtures; new formulation version, existing preview preserved. Native selection/reference tests are independent of G1; graph integration follows G1 support/evidence semantics. C1 is needed only for substitutable candidate integration. | [Particle gates](reports/verification.md#particle-wall-and-equilibrium-gates); select method only after native force/work + consistency studies. No density-only repair. Independent SPH and proof reviews. | -| P2 / Deferred | F4: clipped-volume/centroid/mass quadrature, including variable-volume compatible particle subgraph after P1 selection. Geometry clipping/admission and initialization owners, no mesh import rewrite. | Rotation/phase sweep, analytic/independent clipped volume, uncertainty, disconnected/solid-centroid refusal; mass and native force quadrature gates. Geometry + particle review. | -| Q1 / Deferred | F6: publish measured resolution/Courant guidance and add native verification matrix before changing transport. Existing channel/transport owners and source fixtures; retain coarse failure. If transport repair needed, select conservative geometric interface fluxes on common cut geometry in Q2. | Channel, time and interface shape/volume gates below. No claimed accuracy from volume alone. Numerics + verification review. | -| Q2 / Deferred | F3/F7: common static embedded geometry and unified Stokes reference, first 2D/extruded manufactured fixtures then 3D closed, resolved obstacles/free surfaces; geometric fraction transport must use same open faces/swept flux. `obstacle`, geometry, pressure/viscous/transport owners; new qualified capability variant, old refusals retained. Depends Q1; C1 for interchangeable Stokes provider, not prerequisite to analytic reference derivation. | Shared B/M/S assembly, component/gauge handling, actual flux/traction/refinement gates. Coupled nonzero-interface-pressure MMS, oblique pressure/load tests, positive small-cell treatment. No arbitrary mesh claim until imported mesh suite passes. Grid/geometry/proof review. | +| G1 / Verifying — iteration repair locally verified; hosted integration pending | Existing configured sealed-MAC execution → authoritative descriptor and real attempt receipts → exact live/archive/comparison native inspection. Additive RCP4/RCT2; numerical formulas/order/domains unchanged. | [Qualified result](reports/g1-qualification.md): native workflow and independent reviews pass; fixed 30-pair release capture/projection overhead 1.88086% ≤5%. PR131 repairs the iteration-count finding; fixed stage `9c04278` passes fresh 135-path native/rational/packet and focused contracts. PR137/70da36d also repairs the legacy advection cancellation label; separate stage `186dc0a` freshly passes 26 workflow/cold-custody checks within its full library suite. Hosted integration remains pending; see [fixed historical qualification](reports/native-admission-20261020/qualification.md) and [current closed-stage result](reports/c1b2-admission-20261020/qualification.md). | +| C1 / Active (C1-A and closed C1-B2/B3 locally qualified; hosted pending) | [C1-A result](reports/c1a-qualification.md): closed pressure-v1/native-family adapters delegate to existing owners; draft PR125 integration pending. [Bounded sequence](reports/c1-readiness.md) retains separately gated existing projection/whole-MAC candidates. Particle candidates/transfer remain explicitly unavailable. No registry, tensor engine or numerical-framework prerequisite. | [Replacement gates](reports/verification.md#replacement-contract-gates) unchanged. C1-A architecture/contracts PASS remains scoped. C1-B1 supplied-array foundation is locally qualified in draft PR128 at f161d1a with final evidence43a084a; it is not provider invocation or Session adoption. C1-B2 is locally qualified for closed BuiltinNativeV1 Session/custody in PR136/e56bc7b; PR137/d3e6237 repairs the legacy cancellation label. Separate stage `186dc0a` passes fresh 140-input native/rational/packet and focused qualification ([result](reports/c1b2-admission-20261020/qualification.md)). Hosted integration remains pending; Final PR140/5dc1741 reports 227 passing/5 existing ignored executions for separate closed C1-B3 selection at core4af3802/consumer9ddf8d2. Earlier failures/repairs remain retained; the separate clean stage `3b3b667` now passes complete 140-input admission and fresh native/rational/packet plus 228 focused contracts ([result](reports/c1b3-admission-20261020/qualification.md)). It remains excluded from 186dc0a; exact-head hosted gates remain pending. Full C1-B/C/C1-R acceptance remains pending. | +| P1 / Superseded production-selection direction; bounded reference evidence retained | F1/F2/F5: planar wall comparison and linear-EOS equilibrium initialization/dt admission. Shared pair visibility and wall quadrature; pressure/density/viscosity derived together. `particle_fluid`, boundary geometry queries, focused reference fixtures; new formulation version, existing preview preserved. Native selection/reference tests are independent of G1; graph integration follows G1 support/evidence semantics. C1 is needed only for substitutable candidate integration. | [Particle gates](reports/verification.md#particle-wall-and-equilibrium-gates); the tested candidates were not admitted. [Three frozen campaign dispositions](reports/integration-20261020.md#retained-numerical-evidence-and-selected-route) retain all failures and the grid-route comparison. A new particle proposal requires new bounded admission and unchanged gates; no density-only repair. | +| P2 / Deferred — numerical owner; revisit only after a newly selected particle method | F4: clipped-volume/centroid/mass quadrature, including variable-volume compatible particle subgraph after P1 selection. Geometry clipping/admission and initialization owners, no mesh import rewrite. | Rotation/phase sweep, analytic/independent clipped volume, uncertainty, disconnected/solid-centroid refusal; mass and native force quadrature gates. Geometry + particle review. | +| Q1 / Implemented — evaluated, accuracy qualification incomplete | F6: publish measured resolution/Courant guidance and add native verification matrix before changing transport. Existing channel/transport owners and source fixtures; retain coarse failure. If transport repair needed, select conservative geometric interface fluxes on common cut geometry in Q2. | [Q1 results](https://github.com/MrScripty/Rheon/blob/dfcc693bf8b66678a924e4a92d299127f6746526/docs/plans/fluid-accuracy-composition/q1/results.md) retain the original channel failure, only 12/18 transport trajectories, n64 sphere-source exhaustion and three Full-control refusals. No finest transport-accuracy acceptance. Hosted checks/integration pending. | +| Q2 / Active — bounded geometry reference Implemented/Verifying; full Stokes pending | F3/F7: common static embedded geometry and unified Stokes reference, first 2D/extruded manufactured fixtures then 3D closed, resolved obstacles/free surfaces; geometric fraction transport must use same open faces/swept flux. `obstacle`, geometry, pressure/viscous/transport owners; new qualified capability variant, old refusals retained. Q1 negative disposition selected common volumes/open faces/boundary moments with CPU polynomial flux/stress/refinement gates. PR127/7d7306a retains a versioned private planar reference and reviewed 24-case computation. PR132 repairs those five artifacts in its fixed corpus (0 mismatches across 76,384 faces / 152,780 regions); PR134 passes eight aligned coupled-algebra cases, each bound to its own tested source. The separate 135-input Cargo-closure stage `9a9904f` passes fresh native/rational/packet and 83 focused tests. Fixed PR133 remains unchanged. PR135/4f8bd22 separately qualifies bounded CV1 cut-cell operators/physical traces at source `6d99e77`; PR139/902f609 subsequently reports its fixed 24-case CV2 static conditioning/coupled-solve reference locally qualified at source `b0a9d52`, with independent R1/R2 reconstruction and retained unscaled-comparator failures. Original mass condition remains 6.53e11; generic stability/PDE/evolving-geometry gates remain open. Both sources are excluded from this admission. The version-1 axis-tangent refusal is retained and version 2 is separate, not a retuned rerun. Full coupled MMS/hydrostatic/transport acceptance stays separately gated. The next numerical milestone is [CV3-A static polygon MMS](reports/cv3a-admission.md): prospective source/oracle/resource preparation is admitted; no pilot result exists and canonical full-disk gates remain unchanged. C1 is required only for interchangeable Stokes providers. | Shared B/M/S assembly, component/gauge handling, actual flux/traction/refinement gates. Coupled nonzero-interface-pressure MMS, oblique pressure/load tests, positive small-cell treatment. No arbitrary mesh claim until imported mesh suite passes. Grid/geometry/proof review. | | Q3 / Deferred | F8: capillary pressure/traction and stationary wall impulse/work ledgers for each admitted family. Add balanced interface force with curvature convention; do not relabel cohesion. Depends P1 or Q2 by family. | Drop/wave/spurious-current tests and stress/work closure below. Moving prescribed wall is a later sub-slice with GCL/swept-volume tests; coupled rigid-body admission remains deferred. Physics + numerics review. | | V1 / Deferred, load-validation input blocked | Independent canonical water/obstacle experimental comparisons after relevant P/Q gates. Observation import and comparison fixtures under existing comparison owner. Height validation can precede loads with retained observations. | MARIN or a documented comparable primary experiment: retained independent sensors/uncertainty and matched measurement operator. Missing numeric MARIN observations block this validation only, not G1/C1/P/Q. Scientific independent review; no surrogate/A1 substitution. | -Suggested dependency order is G1 → C1, with P1 and Q1 native selection/reference tests independent of graph implementation, using existing audit evidence custody until graph integration; P2 follows selected P1 quadrature; Q2 follows Q1 geometry/transport decision; Q3 is admitted independently by family; V1 follows the capability it validates. No universal graph abstraction blocks numerical repairs. Every milestone can end in an explicit narrower supported envelope when its broader gate fails. +Current dependency order is G1 → C1 for composition and Q1 → Q2 for numerical repair, independently owned. P1 production selection is stopped; P2 waits for a future admitted particle formulation. Q1 now has a retained incomplete result; Q2 has bounded fixed-corpus geometry and aligned coupled-algebra results, with general method selection and full Stokes/transport gates still pending; Q3 is admitted independently by family; V1 follows the capability it validates. No universal graph abstraction blocks numerical repairs. Every milestone can end in an explicit narrower supported envelope when its broader gate fails. + +## Long-term solver and geometry priority + +The user-selected order is **voxel/grid first, particles and particle surface +reconstruction second, Lagrangian finite-element-style solvers later**. Current +grid correctness, source admission and qualification remain the active work. +This direction retains all failed P1 evidence and does not admit a tested particle +candidate or begin a third family. + +| Priority | Future result and boundary | Admission before implementation | +| --- | --- | --- | +| 1 — existing voxel/grid | Qualify the current grid owners, common geometry, transport and pressure/viscosity path through Q1/Q2 and applicable Q3 gates. | Retain incomplete Q1 results and Q2 topology failures; complete the bounded repairs and their unchanged deciding gates first. | +| 2 — particle solver and output surface | Select and qualify a future particle formulation, then add a mesh generator that reconstructs a 3D object's surface from its particle point cloud. The reconstructed mesh is an output/visualization or export artifact; it does not silently replace particle state or become solver connectivity. | Freeze the new formulation and reconstruction contracts, coordinate/length units, time/run association, supported inputs/outputs and validation before implementation. Reuse existing Session, worker, recording and export owners where compatible. Current failed candidates remain unselected. | +| 3 — Lagrangian finite-element-style family | A later solver uses its separately declared material volume mesh, element connectivity, degrees of freedom and constitutive/boundary semantics. A particle reconstruction surface is not this material mesh. | Separate numerical-family proposal, typed state/transfer contracts, ownership and physical/verification qualification. Any surface-to-volume meshing or particle-to-material transfer is an explicit later capability, not an implied conversion. | -## Exact next-slice write set and admission +The second and third priorities are **future, unimplemented and unqualified**. +Model-specific inputs/outputs can vary within declared supported contracts; new +physical semantics still require qualification. The order does not promote a +generic replacement framework or particle mesher ahead of the active grid work. -G1 may modify `src/lib.rs` and `src/recording.rs` only for the new module declarations, plus `src/simulation.rs`, `src/liquid_step.rs`, `src/solver_provider/configured.rs`, `src/session/configured.rs`, `src/recording/provider.rs`, `src/recording/provider/runtime.rs`, `src/bin/desktop/run_sets/configured/archive.rs`, `src/bin/desktop/saved_comparison.rs`, `src/bin/desktop/configured_comparison_tests.rs` and `src/bin/rheon-desktop.rs`. Bounded new modules are `src/workflow.rs` (numerical descriptor/receipt types), `src/recording/workflow.rs` (new persisted profile/terminal-attempt ownership), and `src/bin/desktop/workflow_inspector.rs` with adjacent focused test modules; their parent module declarations and explicit affected lock/schema fixtures are included. Freeze actual module names and serialization profile at G1 admission after checking current main. No numerical formula, accepted ordering, public pressure v1 behavior or old persisted representation may change. Unexpected owners, generic registries, second custody stores, incompatible serialization, production solver repair or graph editing trigger replan before expansion. Additive docs/protocol and compact source-bound manifests under this plan are included; generated fields/logs stay outside Git. +## Frozen G1 write set and next-slice admission + +G1 below is locally qualified and retained as its historical source boundary. C1-A is locally qualified within the [frozen first-slice write set](reports/c1-readiness.md#frozen-first-slice-write-set), with lead integration pending; C1-B1 is a separately frozen supplied-array foundation in draft PR128; full C1-B/C and transfers remain separately gated and do not widen C1-A implicitly. + +G1 may modify `src/lib.rs` and `src/recording.rs` only for the new module declarations, plus `src/simulation.rs`, `src/liquid_step.rs`, `src/solver_provider/configured.rs`, `src/session/configured.rs`, `src/recording/provider.rs`, `src/recording/provider/runtime.rs`, `src/bin/desktop/run_sets/configured/archive.rs`, `src/bin/desktop/comparison.rs` (the `saved_comparison` module’s actual path), `src/bin/desktop/configured_comparison_tests.rs` and `src/bin/rheon-desktop.rs`. Bounded new modules are `src/workflow.rs` (numerical descriptor/receipt types), `src/recording/workflow.rs` (new persisted profile/terminal-attempt ownership), and `src/bin/desktop/workflow_inspector.rs` with adjacent focused test modules; their parent module declarations and explicit affected lock/schema fixtures are included. Freeze actual module names and serialization profile at G1 admission after checking current main. No numerical formula, accepted ordering, public pressure v1 behavior or old persisted representation may change. Unexpected owners, generic registries, second custody stores, incompatible serialization, production solver repair or graph editing trigger replan before expansion. Additive docs/protocol and compact source-bound manifests under this plan are included; generated fields/logs stay outside Git. ## Migration, compatibility and rollout @@ -78,3 +141,18 @@ Re-plan when a selected boundary method fails planar isolation/work, common geom The [qualified acceptance claim register](reports/verification.md#claim-register) separates P0 evidence from future production and physical validation. Supporting owners: [architecture/contracts](reports/architecture.md), [mathematical research](reports/mathematics.md), [verification and thresholds](reports/verification.md), [interactive provisional visual](reports/workflow-preview.html), [proof qualification](reports/qualification.md), [issues](issues.md), [execution ledger](execution-ledger.md). Durable ADRs should be extracted only when a selected architecture outlives this effort; these provisional method gates do not need premature ADR authority. + + +### Historical G1 admission amendment — 2026-10-20 + +Implementation branch `implement/g1-native-workflow-20261020`, base plan `8422f77bb45e60b95c5694ed0b39e01377b62976`, current fetched main `bc2f472787060d9a69cb619ed2c2fea10fd754b6`. Implementation owner: delegated G1 Codex instance; integration and merge remain with repository lead/parent. Branch retained for review, no cleanup or merge authorized. + +Before source edits, discovery identified a bounded write-set mismatch: failed attempts are consumed in `src/bin/desktop/ai_comparison/configured_track.rs`, accepted recording and exact cached selection are owned by `src/bin/desktop/inspector.rs`, and `saved_comparison` is the module alias for `src/bin/desktop/comparison.rs`. Add these first two existing owners to G1 and correct the third path. Adjacent focused tests are included. This amendment preserves the existing Session/process/recorder/selection owners; introducing another custody store would violate admission. No numerical formula, accepted order, domain, or pressure v1 change is admitted. + +Frozen names: `src/workflow.rs`, `src/recording/workflow.rs`, `src/bin/desktop/workflow_inspector.rs`. Profiles: additive `RCP4:` controls for workflow-bearing accepted publications and `RCT2:` terminal status; retain SQLite v1, configured RSC1/profile and old RCP2/RCP3/RCT1 decode/encode meanings. Bounded fixed sealed-MAC descriptors, at most 256 node summaries and 1 MiB descriptor by criterion, additionally subject to existing 16 KiB recording metadata limit. In-process types are internal coordinated; persisted profiles are versioned. Actual owners emit receipts directly at numerical/provider/commit boundaries, never infer them from cancel callbacks. + +Parallel roles: root owns workflow core/numerical observation and plan/module declarations; native UI worker owns new desktop module, App integration and Inspector selection accessor; persistence worker owns new recording module, provider/archive/recording integration and configured-track observation. Shared files have disjoint sections and serial integration; no worker modifies plan/module declarations. Independent final architecture/persistence and native UI review required. G1-C/G1-U and fixed overhead gates remain unsatisfied until measured evidence. C1 preparation follows G1 qualification, not a prerequisite to numerical repairs. + +G1 observation re-plan before expansion: independent architecture review found that successful-return-only pressure observation loses host qualification/fallback facts on an in-solve cancellation, and that opaque input state alone does not identify forcing/source controls. Extend only `src/solver_provider.rs` and `src/provider_step.rs` for an internal optional dispatcher observer, retaining the public `solve` API/ordering byte semantics; extend `src/liquid_volume.rs` only with an internal source-stamp/rate observation accessor. These are existing numerical owners, not new schedulers, methods or domains. The direct numerical owner captures a bounded typed input summary/digest and a native RHS digest at actual assembly. The full finite ordered receipt trace, typed dependencies and publication association are validated at storage ingress. Independent architecture review owns these corrections; fixed G1 acceptance is unchanged. + +The directly affected standalone consumer `tests/saved_comparison_ui_contract.rs` is included for its new legacy-workflow-unavailable regression. It imports `comparison.rs` independently of App; exercising the new exact-side API there also preserves strict all-target dead-code checks without weakening production lints. diff --git a/docs/plans/fluid-accuracy-composition/q1/admission.md b/docs/plans/fluid-accuracy-composition/q1/admission.md new file mode 100644 index 00000000..9ae0219f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/admission.md @@ -0,0 +1,60 @@ +# Q1 route admission — implementation checkpoint + +User explicitly adopts PR124's evidence-based route decision: STOP the P1 +production-selection attempt, preserve all three campaigns and their limits, +proceed with bounded Q1 verification and dependency-ready Q2 shared geometry / +coupled Stokes. Do not create a third material-mesh production family. This is +implementation authority, not another request for direction. Production water +accuracy remains unadmitted until the unchanged gates pass. + +Canonical authority: PR120/8422f77, plan.md and reports/{mathematics,verification, +architecture,qualification}.md. Q1 original targets and failed audit evidence are +binding. P1 evidence PR121/a64d4d3, PR123/bc2573f, PR124/9d84f66 and their raw +archives stay immutable. User route adoption supersedes the old P1 next-candidate +recommendations without rewriting any frozen campaign. + +Fresh origin/main fetch: bc2f472787060d9a69cb619ed2c2fea10fd754b6. Isolated +branch implementation/q1-grid-verification-20261020 in /workspace/Rheon-q1, +stacked on PR124/9d84f66. Parent/repository lead owns shared lifecycle integration, +G1 coordination, later admission and merges. No branch cleanup/rebase/merge. + +PROPOSED exact exclusive Q1 writes (freeze after independent review): +- src/liquid_volume.rs: bounded explicit periodic represented-volume boundary + support in the existing owner, required to run the plan's native periodic + interface comparator; donor-cell reconstruction itself remains unchanged. +- tests/liquid_volume_periodic_contract.rs; tests/grid_verification_contract.rs. +- examples/grid_verification.rs and examples/grid_verification/*. +- this q1/ directory: admission/protocol/source-bound evidence/route handoff. +No lib.rs declarations/exports, Session, recording, UI, simulation, configured +pressure/provider, existing source/test, dependency/lockfile, old P1, proof or +canonical root-plan write. Any unexpected owner or overlap is declared before +editing. G1 retains its own shared write set. + +Parent/G1 handoff: the canonical lifecycle must reflect the adopted route, P1's +stopped selection with no production winner, Q1's bounded Active verification +once frozen, and Q2's dependency-bound status. This instance supplies the concrete +handoff under q1/ for the lead to reconcile with ongoing G1 lifecycle changes; +it does not overwrite shared plan/ledger/status rows from a stale PR120 snapshot. +Independent numerical work proceeds using this source-bound admission. + +Current phase: discovery/implementation preparation; no Q1 tests or numerical +campaign yet. Missing native periodic boundary is a verification support gap, +not permission to substitute closed-box outflow for the periodic sphere target. +A new explicit periodic boundary version must bind matching face velocities, +one seam transfer, Courant, mass and cancellation/refusal semantics. Existing +box-inlet, slab/reconstructed and f32 carrier/f64 fraction behavior is preserved. + +Standards continuation pin0fc92a24279f3a4574c80af0a2f31ea347a21597, same routed +core/planning/implementation/numerical-oracles/verification/Rust/contracts, +architecture, docs and commits. No AGENTS.md found. Native existing grid owners +are reused. Before numerical evaluation, freeze exact source/criteria and obtain +independent discretization review. Actual CPU convergence/flux/stress evidence, +not positive algebra or small residual alone, governs later Q2 admission. + +## Lifecycle checkpoint after frozen execution + +The proposed write set was frozen by b9a9d4c and independently reviewed before +execution. One campaign executed and stopped at a fixed source-geometry refusal. +See results.md for counts/negative disposition; no accuracy acceptance. Earlier +phase wording above is historical discovery state, not current execution status. +Shared canonical lifecycle edits remain with parent/G1 coordination. diff --git a/docs/plans/fluid-accuracy-composition/q1/analyze.py b/docs/plans/fluid-accuracy-composition/q1/analyze.py new file mode 100644 index 00000000..e17a448b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/analyze.py @@ -0,0 +1,42 @@ +"""Frozen native Q1 criteria; geometry/discretization independent review remains separate.""" +import csv,json,math,pathlib,sys +# Evaluator tooling v2. Frozen scientific criteria and original bytes are +# retained under ../evaluator-tooling/. Guards remain active under -O / -OO. +def require(condition, message): + if not condition: + raise SystemExit("evaluator input refused: " + message) + +root=pathlib.Path(sys.argv[1]) +def read(name): + with (root/name).open() as f:return list(csv.DictReader(f)) +c=read('channel-summary.csv');t=read('transport-summary.csv');g=read('geometry.csv');controls=read('constant-controls.csv') +require(len(c)==6 and len(t)==18 and len(g)==9 and len(controls)==18, 'q1: input contract at original line 7') +steady=sorted((r for r in c if r['case']=='steady'),key=lambda r:int(r['n'])) +time=sorted((r for r in c if r['case']=='temporal'),key=lambda r:int(r['steps'])) +orders=lambda e:[math.log(a/b,2) for a,b in zip(e,e[1:])] +spatial=orders([float(r['relative_rms']) for r in steady]);temporal=orders([float(r['rms']) for r in time]) +rho=998.2;nu=.001002/rho;volume=1e-9;speed=.01*.001**2/(8*nu) +channel={'original_coarse_failure_preserved':float(steady[0]['relative_rms'])>.02 and abs(float(steady[0]['relative_rms'])-.02139313)<=5e-9, + 'resolved_velocity_pass':all(float(r['relative_rms'])<=.02 for r in steady[1:]),'spatial_orders':spatial,'spatial_order_pass':all(1.8<=p<=2.2 for p in spatial), + 'temporal_orders':temporal,'temporal_pass':all(p>=.9 for p in temporal) and all(float(b['rms'])/float(a['rms'])<.65 for a,b in zip(time,time[1:])) and all(float(r['max_energy_increase'])<=0 for r in time), + 'native_algebra_pass':all(float(r['max_energy_identity'])/(.5*rho*volume*speed**2)<=1e-10 and float(r['max_momentum_identity'])/(rho*volume*speed)<=1e-10 and float(r['max_force_residual'])/(rho*volume*.01)<=1e-10 for r in steady)} +geometry_native=all(r['exhausted']=='false' and float(r['empirical_uncertainty'])<=1e-4 and abs(float(r['volume_fine'])-4*math.pi*.15**3/3)/(4*math.pi*.15**3/3)<=1e-4 for r in g) +control_pass=all(r['status']=='complete' and float(r['max_change'])<=1e-12 for r in controls) +transport=[] +for case in ['translation','vortex-adapted']: + for courant in [.1,.25,.5]: + rows=sorted((r for r in t if r['case']==case and float(r['requested_courant'])==courant),key=lambda r:int(r['n'])) + require(len(rows)==3, 'q1: input contract at original line 23') + completed=all(r['status']=='complete' and abs(float(r['time'])-1)<=16*sys.float_info.epsilon for r in rows) + item={'case':case,'courant':courant,'complete':completed,'statuses':[r['status'] for r in rows], + 'conservation_bounds_pass':all(float(r['relative_drift'])<=1e-10 and float(r['min'])>=-1e-12 and float(r['max'])<=1+1e-12 for r in rows), + 'actual_courant_pass':all(r['status']!='complete' or abs(float(r['max_courant'])-courant)<=16*sys.float_info.epsilon*courant for r in rows)} + if completed: + errors=[float(r['relative_l1']) for r in rows];u=2e-4 + lower=[math.log((a-u)/(b+u),2) if a>u and b>0 else None for a,b in zip(errors,errors[1:])] + item.update(errors=errors,orders=orders(errors),order_lower=lower,geometry_uncertainty_budget=u, + finest_shape_pass=errors[-1]+u<=.05,finest_order_pass=lower[-1] is not None and lower[-1]>=.9) + else:item.update(errors=None,orders=None,finest_shape_pass=False,finest_order_pass=False) + item['positive_accuracy_candidate']=completed and item['conservation_bounds_pass'] and item['actual_courant_pass'] and item['finest_shape_pass'] and item['finest_order_pass'] and geometry_native and (case=='translation' or control_pass) + transport.append(item) +print(json.dumps({'channel':channel,'geometry_native_estimate_pass':geometry_native,'independent_geometry_gate':'REQUIRED before positive scientific disposition','constant_controls_pass':control_pass,'transport':transport,'general_water_or_Q2_admitted':False},indent=2,allow_nan=False)) diff --git a/docs/plans/fluid-accuracy-composition/q1/discovery.md b/docs/plans/fluid-accuracy-composition/q1/discovery.md new file mode 100644 index 00000000..c76a3372 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/discovery.md @@ -0,0 +1,40 @@ +# Q1 discovery checkpoint (before any new computation) + +Existing actual channel owner StaticObstacleShear uses the retained +StaticObstacleGeometry volumes/open areas and true centroid/wall distances. +The original audit channel uses gap1mm, rho998.2, mu.001002, a.01, backward Euler +20steps of1s at8/16/32 levels. Preserve its coarse2.139313%>2% failure and the +original semidiscrete sine-decay8/16/32step evidence at n32,T.05s. + +LiquidVolumeState is the existing f64 shared-face donor-cell fraction owner; +LiquidFlowInterval supplies f32 face velocities. It currently supports uniform +outside inlet fractions per side, not periodic wrapped donors. A periodic sphere +cannot be honestly substituted by outflow/refill. New bounded periodic support +must mirror one seam transfer exactly and demand paired boundary-normal velocities. + +Smooth analytic divergence-free face sampling in f32 can lose discrete zero +divergence and make raw full fractions exceed1. Do not clamp them, loosen their +bounds, refill, or hide a projection. Proposed reversible vortex uses a dyadic +integer vertex streamfunction curl at n16/32/64, giving exactly discrete-solenoidal +f32 faces. Define actual summed-outward multidimensional Courant from these faces. +Quantization must be stated separately; autonomous forward/reverse target remains +the original set. A 2D vortex extruded through a3D sphere is a narrower explicit +case, not an arbitrary3D vortex or velocity qualification. + +Proposed independent sphere cell average: integrate exact disk/rectangle YZ area +along X; freeze analytic primitive, integration knots/tolerance and separate +oracle/uncertainty tests. Source initialization and final sphere reference use +volume fractions, not point-center binary masks. Total analytic sphere volume, +periodic image semantics and independent quadrature checks must precede any +positive shape claim. Unresolved oracle uncertainty cannot pass a threshold. + +No scientific Q1 output is present at this checkpoint. Independent reviewer is +assessing topology/CFL/ledger, f32 solenoidal construction, geometry oracle and +smallest Q2 reference scope. Exact protocols/code will be frozen before evaluation. + +01:34UTC recovery check: actual shell/git/process access works; the one active +Clippy/check invocation completed exit0. No tests or scientific Q1 campaign had +started, no live campaign exists, and nothing was duplicated. Periodic support +and native fixture source are checkpointed before final protocol/source review; +this checkpoint is NOT the numerical freeze or qualification result. Both prior +disconnect notifications have no scientific-evidence impact at this phase. diff --git a/docs/plans/fluid-accuracy-composition/q1/manifest.json b/docs/plans/fluid-accuracy-composition/q1/manifest.json new file mode 100644 index 00000000..7a51ab27 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/manifest.json @@ -0,0 +1,51 @@ +{ + "scientific_source": "b9a9d4ca3ff02c9eae38eb20dced49e87a923380", + "base_main": "bc2f472787060d9a69cb619ed2c2fea10fd754b6", + "plan": "8422f77bb45e60b95c5694ed0b39e01377b62976", + "native_campaign_exit": 1, + "frozen_evaluator_exit": 1, + "counts": { + "channel": 6, + "transport": 12, + "geometry": 7, + "controls": 12 + }, + "required_counts": { + "channel": 6, + "transport": 18, + "geometry": 9, + "controls": 18 + }, + "regression": { + "passed": 613, + "failed": 0, + "ignored": 3, + "targets": 80, + "exit_code": 0 + }, + "archive": { + "path": "/workspace/rheon-q1-grid-verification-b9a9d4c.zip", + "bytes": 8376830, + "sha256": "bb32e9a749130115e44fa3c43aea5320f10d0cf5490ab4e3f74e81a702d43794" + }, + "library": { + "library_file_id": "libfile_1d86dc8b48fc8191aa5fedd8b859b403", + "file_id": "file_000000006a608230a699057dc44ee2aa" + }, + "binaries": { + "grid_verification": { + "sha256": "af1a20cef8d210aeb4a0159a8753f395158db0f8d79d353965b7144d1130ee88", + "bytes": 804720 + }, + "liquid_volume": { + "sha256": "8bc72778f74ccf0ae0538eafc69b48ee690969453311d4b88bb1d01cd8e2edb4", + "bytes": 658312 + } + }, + "review": { + "field_summary_sha256": "c974a18a8054ccada3f16e4ce20568bdf4d82d7867321a0e32b9afd39d22119b", + "geometry_summary_sha256": "1fb92bdf2e4d26ef05ef523483d78ee484645152bbde2888b25cb253606b2de8", + "review_sha256": "f60cb0506ebb45aea2f2889e83511f2e08a36d48d27a6e43cfd711fc2a3dee51" + }, + "production_water_or_Q2_coupled_accuracy_admitted": false +} diff --git a/docs/plans/fluid-accuracy-composition/q1/pre-run-review.md b/docs/plans/fluid-accuracy-composition/q1/pre-run-review.md new file mode 100644 index 00000000..80a01e7f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/pre-run-review.md @@ -0,0 +1,20 @@ +# Independent pre-run review + +Reviewer: existing independent `/root/p1_numerical_review`, 2026-10-20 UTC. +Read-only review; no candidate tests or numerical experiments performed before freeze. + +Reviewed native periodic topology, signed donor/seam transfer and cancellation, +channel replay and discrete temporal reference, dyadic RT0 carrier, sphere +cell-average quadrature, fixed criteria/evaluator, uncertainty/refusal semantics. +Requested fixes, all verified before freeze: +- Signed seam impulse coverage on at least three cells. +- BeforeFlux cancellation precedes seam reads. +- Explicit sphere adaptive-depth exhaustion prevents positive admission. +- Every channel report/state and actual native geometry retained, not just maxima. +- Reverse fallback never exceeds nominal dt; operational time mismatch retained. + +Final disposition: no remaining source/protocol/evaluator blocker to freeze and +execute ONE bounded Q1 comparator campaign. Post-run independent cellwise geometry, +field/ledger reconstruction and required regressions remain binding. No production +or Q2 accuracy admission follows. No criterion changed in response to selected +scientific execution, which has not begun. diff --git a/docs/plans/fluid-accuracy-composition/q1/protocol.md b/docs/plans/fluid-accuracy-composition/q1/protocol.md new file mode 100644 index 00000000..e32e674c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/protocol.md @@ -0,0 +1,150 @@ +# Q1 frozen pre-evaluation protocol v1 + +Canonical plan PR120/8422f77 grid Q1 targets remain unchanged. User adopts Q1→Q2 +and stops P1 selection; route-handoff.md is the parent-owned shared lifecycle +handoff. Exact exclusive writes in admission.md are confirmed: one existing +numerical owner src/liquid_volume.rs, two new focused tests, new grid_verification +example/modules, q1 docs. No G1/shared lifecycle/exports/dependencies/proofs edits. + +## Native methods and source identity + +Existing StaticObstacleShear/StaticObstacleGeometry, backward Euler and stationary +no-slip channel are reused unchanged. Existing shared-face first-order donor-cell +LiquidVolumeState is reused with explicit `advance_periodic` boundary version1; +no higher-order reconstruction, clipping, mass reset or pressure/momentum coupling +is added. Report.periodic distinguishes the new topology; report.inlet retains +old box-inlet identity when false and identifies periodic boundary policy when +true. Existing prepare_advance callers and old arithmetic ordering stay intact. + +Paired normal velocities must match as f32 values (signed zeros may compare equal). +Compute lower periodic seam transfer ONCE, copy it bitwise to upper; wrap donor +indices, keep one-cell axes valid. Periodic external influx/outflux are zero; +signed source ledger remains unchanged. Reject slab/reconstructed domains, stale +start, mismatched velocities, excessive CFL/divergence/bounds/ledger or cancellation +before publishing any accepted fraction/time/stamp. No native panic or clamp is +a normal refusal mechanism. Memory Vec accounting remains the existing owner. + +Commit final source/protocol/evaluator and independent pre-run review before +ANY selected tests or scientific execution. Earlier d6bf4e1 is a prequalification +source checkpoint, not the numerical freeze. Native Linux x86_64 release f64 +fractions/channel and f32 face carriers are explicit. Record actual source/binary, +commands, toolchain, geometry, dt, refusal/last-accepted state and raw fields. + +## Channel: preserve original failure and separate time error + +Exact frozen-audit replay: rho998.2,mu.001002,nu=mu/rho,gapH=.001m,lowerwall +.001m, tangential extents.001m,bodya=.01m/s². Mesh lower box uses the original +triangle winding/stamp321 and full cross section. n=8/16/32 wet levels; initialize +u=a*y(H-y)/(2nu) at true fluid centroids,20 BE steps dt1s toT20s. RMS is relative +to the same pointwise analytic profile as audit119. Retain n8's2.139313%>2% fixed +failure. Resolved n16/n32 target<=2%; observed spatial orders1.8–2.2 for aligned +smooth case. Do not relabel all resolutions accurate because fine passes. + +Original temporal replay: n32 sine mode amplitude1m/s, no force,T=.05s,8/16/32 +steps. Exact semidiscrete eigenvalue4sin²(pi/(2n))/dy²; compare toexp(-nu lambda T), +not a continuum/spatial-floor mixture. Original ratios<.65 and new first-order +observed temporal order>=.9 remain binding. Energy cannot increase. This exact +unidirectional operator fixture is numerical verification, not a turbulent-water +validation. Report both RMS and relative RMS and actual fields. + +Report physical channel flux Q=.001 sum_j dy*u_j versusa*.001*H³/(12nu), each +wall traction from native boundary conductance andu/area versusrho*a*H/2, and +native residual/momentum/energy ledgers. Retain every native report field, every +accepted and initial layer profile, actual native volumes/masses/conductances in +channel-ledger.csv, channel-states.csv and channel-geometry.csv; maxima alone are +not sufficient. Q1 does not infer general3D stress from +this reduced channel. Native algebraic targets: force residual/(rho*V*a)<=1e-10, +energy identity/E_ref<=1e-10 and momentum identity/P_ref<=1e-10, withV=1e-9m³, +U_ref=aH²/(8nu),E_ref=.5rho V U_ref²,P_ref=rho V U_ref, all fixed before execution. +Also retain the unchanged existing liquid_volume example's4 slab/CFL diffusion +comparators as auxiliary evidence, distinct from audit119's prior3D export. + +## Interface: actual native periodic comparator + +Grid[0,1]^3, n=16/32/64, R=.15m, source water density998.2 (represented mass only; +carrier inertia/pressure is NOT coupled). Nominal summed-outward C=.1/.25/.5 +independently at each resolution. Actual source f32 fields determine maximum +percell outward rate S=max_i sum_d(max(u_hi,0)-min(u_lo,0))/h. dt_nom=C/S; +shorten only to exact phase/end times. Native safety max_outward_courant=1 and +actual_divergence_limit=0; record actual C of every interval. Scientific nominal +C matching permits16*f64EPS relative representation error, not a physical CFL +relaxation. A violation/refusal is retained; no velocity/fraction/source fixes. + +Translation: initial spherecenter(.65,.5,.5), u=(.25,.125,.0625)m/s,T1s. Final +center(.9,.625,.5625), with periodic images; the final sphere crosses the X seam. +Vortex adaptation: initialsphere(.35,.35,.5),T1s. Vertex streamfunction +psi=sin²(pi x)sin²(pi y)/pi, boundaries exactly0, quantized to integers*2^-20. +Build u=Delta_y psi/h,v=-Delta_x psi/h,w=0 as exact dyadic f32; assert integer +representability and EXACT discrete divergence0 before native use. It defines a +2D RT0 curl field extruded through the3D sphere, held static for half a period +then reversed with the same dt sequence backwards, shortened atT1. If accumulated +time roundoff leaves a positive remainder after that sequence, one tiny end +interval is appended; it never enlarges the requested maximum dt. Actual dt/time +are retained, including forward/reverse sums derived from each ledger; their few-ulp +finite-time mismatch is reported rather than called exact operational reversal. This accounts for finite-time representation without a fraction or +velocity correction. Exact autonomous flow reversal returns the initial +set. Quantization bound at vertices q/2 and velocity q/h is separate from +transport error. This is an explicit bounded adaptation of Enright/Fedkiw/ +Ferziger/Mitchell, NOT the full3D/T3 or long-stretch single-vortex benchmark. +Retain actual f32 carrier arrays, forward/reverse rates and dyadic div checks. + +The18 requested trajectories must reachT1 to pass their accuracy gate. On refusal +retain exact error/cell/value/start/attempteddt and final accepted f64 field, set +requested-final shape/Fourier errors UNAVAILABLE, and do not count early time as +completion. Before vortex mixed runs,18 one-step Full/Dry controls (3n*3C*2fills) +check the raw arithmetic at requested dt: require completed interval and max +constant defect<=1e-12. Refusal is a failed control, never clipped away. Unit +contracts additionally check a small dyadic-step invariant and signed seam +impulses on>=3 cells. No live accepted state or benchmark is rerun after seeing +failure without a separately versioned, reviewed implementation rationale. + +Fixed interface gates: source-free relative represented-volume drift<=1e-10 +against ACTUAL initialized V0; f in[0,1] within1e-12; finest completed relative +L1 error E=sum_cells Vcell*|f-f_exact_cellavg|/Vsphere<=.05; finest pairwise +observed spatial order>=.9 (report both pairs separately). Full/Dry controls, +requested-time completion and source oracle must pass for a positive scope. +Record periodic Fourier moments; ordinary centroid across a seam is not used. +No universal monotonic-dt claim; preserve the existing donor diffusion evidence. + +## Geometry and independent uncertainty gate + +Sphere initialization/final reference use actual cell averages including periodic +images, no center mask or global mass renormalization. Rust reference integrates +exact disk/rectangle cross-sectional area inX. Quarterprimitive I(t)=[t sqrt(r²-t²) ++r²asin(t/r)]/2 and split at allX edge/corner contacts, center and sphere endpoints. +FULL/EMPTY branches follow independent nearest/farthest distance semantics. +Adaptive Simpson depth22; eachcell absolute tolerance1e-12*h², paired tolerance/16. +Depth exhaustion is explicit and prevents positive admission. Store BOTH arrays, +empirical quadrature estimates and known analytic Vsphere=4piR³/3. These estimates +are NOT rigorous enclosures. No volume/fraction clamp is part of initialization; +source outside[0,1], exhaustion or gross geometry failure refuses the fixture. + +Before any positive scientific disposition require, for EACH of9 geometry fields: +- reported empirical sum estimate plus paired normalized L1<=1e-4; +- analytic total sphere-volume defect/Vsphere<=1e-4; +- independent percell source integral oracle: sum_cells Vcell*|fRust-fOracle|/ + Vsphere plus oracle's aggregate integration estimate<=1e-4. A separate positive + quadrature/vertical-slice implementation must check partial cells and independent + FULL/EMPTY predicates, not just a total-volume cancellation check. +Native drift versus actualV0 is independent of geometric mass uncertainty. +Uncertainty in shape includes initial+target geometry budgets. Require finest +E+uncertainty<=.05 and lower pairwise order from error intervals>=.9; if those +intervals overlap target/order thresholds the result is unresolved, never pass. +For refusals/uncompleted paths no target-time continuum error/order is asserted. + +## Qualification and dependency disposition + +A1 focused native policy/rollback/geometry/carrier contracts; A2 actual CPU native +channel and transport data, retained failures; A3 independent discretization, +source geometry and field/ledger reconstruction. Source-owned tests do not replace +A2/A3. Relevant old volume/step/slab/column regressions and full no-default release +CPU regression are required after the production-owner extension; real-checkpoint +ignored assets remain explicit, no surrogate substitution. + +Q1 may close with explicit failed accuracy/support rather than false admission. +Actual evidence then admits the smallest Q2 common-geometry/flux/stress reference, +with exact shared zeroth/first/boundary moments and B/M/S/W coupling. Keep pressure +absolute on free-traction components and apply gauges only to appropriate sealed +components. Do not widen to3D mesh water, geometric transport or coupled Stokes +accuracy until the corresponding fixed convergence/flux/physical-stress gates +pass. No third material family, UI/Session/recording, GPU or physical validation. diff --git a/docs/plans/fluid-accuracy-composition/q1/qualification.md b/docs/plans/fluid-accuracy-composition/q1/qualification.md new file mode 100644 index 00000000..53c7fded --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/qualification.md @@ -0,0 +1,36 @@ +# Q1 qualification and dependency disposition + +Scientific freeze b9a9d4ca3ff02c9eae38eb20dced49e87a923380; independent read-only +review before native evaluation, final review.md after retained CPU outputs. +Existing StaticObstacleShear unchanged, LiquidVolumeState periodic boundaryv1 +extension only. Old prepare_advance consumers and box transport remain covered. + +A1: nine focused contracts pass both debug and release, strict selected Clippy +passes. Signed multiaxis seams, >=3-cell direction, one-cell seam cancellation, +sources, legacybox identity, mismatch/CFL/all-stage cancellation rollback and +source geometry/carrier contracts are covered. +A2: one native CPU campaign exits1 at its fixed n64 sphere-depth gate. Channel +complete; transport12/18, geometry7/9, controls12/18. Frozen evaluator exits1 on +incomplete counts. No retune/retry or missing finest claim. Auxiliary unchanged +liquid_volume comparator exits0 and preserves greater diffusion at smaller dt. +A3: independent70-digit channel ledger reconstruction, generalized BE eigenmode +reference, translation Fourier-symbol fullfields, decodedf32 carriers/constant +refusals and separate positive chord/SciPy geometry all support retained facts. +Independent source agreement does not override native64 exhaustion. Full details +and exact independent scripts/hashes are retained in the raw evidence archive. + +Full `cargo test --release --no-default-features`:613passed,0failed,3ignored across +80 result summaries. The ignored tests require actual hash-pinned AI checkpoint +exports (RHEON_AI_EXPORT); no substitute asset supplied. No GPU, physical water +validation, native UI or arbitrary imported-mesh capability tested or claimed. + +Disposition: periodic native represented-volume boundary/transaction contracts +verified; reduced aligned-channel resolved accuracy supported. Interface accuracy +and complete Full/Dry support unadmitted; original coarsechannel failure retained. +Only separately admitted Q2 common-geometry reference work is dependency-ready. +Coupled MMS/hydrostatic/physical-traction, capillary, transport-selection, P2 and +production water accuracy remain pending. No new Lean obligations introduced; +existing algebraic proofs are not credited as geometric/IEEE/PDE verification. + +Shared canonical lifecycle integration remains with parent/repository lead and +G1 coordination; no rootplan overwrite, unilateral merge or branch cleanup. diff --git a/docs/plans/fluid-accuracy-composition/q1/results.md b/docs/plans/fluid-accuracy-composition/q1/results.md new file mode 100644 index 00000000..591e0de8 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/results.md @@ -0,0 +1,62 @@ +# Q1 native result — incomplete accuracy qualification + +Scientific source freeze `b9a9d4ca3ff02c9eae38eb20dced49e87a923380`. +One native Linux CPU campaign; native exit1 retained. No criterion/tolerance changed, +no refused sphere/transport run restarted. A frozen evaluator additionally exits1 +on missing required row counts; it cannot produce a positive result from this run. + +## Channel and original diffusion comparator + +| Wet levels | Relative profile RMS | Relative flux error | +|---|---:|---:| +| 8 | 2.1393127492% (FAIL fixed2%) | 3.125% | +| 16 | .5348817394% | .78125% | +| 32 | .1337212717% | .1953125% | + +Spatial orders1.99985555,1.99999097. Original temporal sine-mode RMS at +8/16/32 steps: .006386724998/.003245674510/.001636294871; observed temporal +orders .97655800/.98808557. Energy did not increase. Both wall tractions +.004991Pa match rho*a*H/2 to displayed precision. Native momentum/energy/force +residuals are retained with every step/profile and native geometry, independently +reviewed before disposition. This reduced aligned shear is not general3D water. + +Unchanged auxiliary `liquid_volume` example retains all four slab comparators: +L1 volume errors .09375/.068359375/.04909515381 at n16/32/64,C.5, while n64,C.25 +has .06039030345. Represented volume .25m³ in each. Smaller dt at fixed grid +increased donor diffusion; this distinct example does not replace audit119's +frozen3D export evidence. + +## Interface and source-geometry failures + +The required18 trajectories /9 geometry fields /18 Full/Dry controls are +incomplete:12 /7 /12 were produced before the first n64 sphere-source refusal. +The `translation-initial/64` paired sphere quadrature exhausted its fixed depth22. +Its empirical uncertainty8.0853e-12 is small, but is not a rigorous error bound +and cannot override the explicit no-exhaustion gate. The candidate geometry is +retained, and no n64 transport run or finest-pair order claim exists. + +All twelve n16/32 mixed trajectories reachedT1 and respected native mass/bounds +checks. Relative represented-volume drift max1.2271e-14. Their relative shape +L1 errors are large: translation .9506–1.0331 at n16 and .7611–.8391 at n32; +adapted vortex1.2713–1.3363 and1.1057–1.1807 respectively. These are available +coarse diagnostics, not the missing finest accuracy criterion. + +Full controls additionally refused native fraction1.0000000000000002 at +(n16,C.5,cell56), (n32,C.1,cell373), (n32,C.5,cell180). Accepted state remains +unchanged on refusal. No clamp, mass reset, retry or silent safety relaxation was +introduced. Full/Dry target completeness and support are not admitted. + +Vortex scope is only the documented dyadic2D curl extruded through a sphere, +T1 abrupt autonomous reversal. It is not the full Enright3D/T3 benchmark. Actual +forward/reverse dt sums and float carriers are retained in raw ledgers/arrays. + +## Disposition + +No Q1 transport-accuracy admission; no production water repair, general mesh-water, +physical validation, GPU/native UI, or Q2 coupled-Stokes accuracy claim. +The aligned channel resolved envelope is numerical verification of its existing +owner. Q1 failures justify only a separately frozen Q2 geometry/reference +prerequisite: common volumes/open faces/boundary moments and actual CPU polynomial +flux/stress closure and geometry-refinement checks. Production transport selection +and full coupled MMS/hydrostatics remain gates with unchanged plan criteria. +Independent raw-data review and regression disposition are recorded separately. diff --git a/docs/plans/fluid-accuracy-composition/q1/review.md b/docs/plans/fluid-accuracy-composition/q1/review.md new file mode 100644 index 00000000..817ef129 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/review.md @@ -0,0 +1,145 @@ +# Independent Q1 post-run disposition + +Frozen scientific source/protocol: `b9a9d4ca3ff02c9eae38eb20dced49e87a923380`. +Only `independent-new/` was written by this reviewer. No native candidate, +campaign, branch file, criterion, or existing evidence was edited or rerun. + +**The channel verification is supported. The interface campaign is incomplete +and cannot receive its requested accuracy admission.** Native execution stopped +on the declared 64-grid sphere quadrature exhaustion gate. Independent agreement +with that retained array does not turn the failed native gate into a pass. + +Retained cardinality is exactly 6 channel summaries, 116 channel step reports, +3064 channel layer states and 56 channel geometry rows; 12/18 completed transport +trajectories, 7/9 geometry fields and 12/18 constant controls. There is no 64-grid +transport result or finest-pair spatial order. The full frozen evaluator requires +the complete matrix; these independent partial reconstructions do not replace it. + +## Channel reconstruction + +`reconstruct.py` uses 70-digit Decimal arithmetic to reconstruct every retained +step's kinetic energy, increment energy, bulk plus boundary dissipation, body +work, momentum, body and wall impulses, true equation residual and rounding +budgets from the actual adjacent layer states, masses and conductances. It +also checks geometry/centroids, source-force units, summary maxima, physical +flux and traction. Geometry matches the source channel: maximum cell-volume +relative deviation is 6.00e-15, centroid deviation 2.17e-19 m, and the exported +mass/conductance coefficients agree with their independently reconstructed +physical definitions. + +A separate generalized symmetric eigendecomposition of the stored mass and +stiffness gives the closed-form backward-Euler modal solution at every saved +time, without advancing another reference trajectory. Its maximum velocity +discrepancy is 2.60e-14 m/s. The independently reconstructed instantaneous +ledger defects remain at rounding scale. Steady-case actual reported maxima, +normalized by the frozen physical scales, are 6.263e-14 energy, 3.744e-14 +momentum and 1.445e-15 equation residual, all below 1e-10. + +| Wet levels | Relative velocity RMS | Relative volume-flux error | +|---|---:|---:| +| 8 | 2.139312749% | 3.125% | +| 16 | 0.534881739% | 0.78125% | +| 32 | 0.133721272% | 0.1953125% | + +Spatial orders are 1.99985555 and 1.99999097. The 8-level velocity result still +fails its original 2% criterion. Both resolved levels pass the new resolved +velocity envelope. Native wall-traction magnitudes reconstruct as 0.004991 Pa +on each stationary wall, up to rounding; this reduced-channel agreement does +not admit arbitrary 3D stress or free-surface traction. + +The separate fixed-spatial-operator temporal study has RMS errors +0.006386725, 0.003245675 and 0.001636295 m/s at 8/16/32 steps, with orders +0.97655800 and 0.98808557. These support the declared first-order backward-Euler +time claim against its semidiscrete decay reference. The continuum spatial +error is not substituted for this temporal error. + +## Transport, carriers and constant controls + +All supplied f32 carrier arrays have matching periodic seams and exactly zero +native discrete divergence when independently decoded. Outward and reversed +outward rates reconstruct exactly. Every retained trajectory reaches T=1 s, +with the ledger's timestep, volume difference, zero external flux, divergence +and summed outward Courant reconstructed. Maximum actual forward/reverse +sum(dt) mismatch is 4.219e-15 s; this is a retained finite-time representation +error, not a claim of exact operational reversal. + +For the six constant-velocity trajectories, an independent product of periodic +upwind Fourier symbols reproduces each full saved final field within 1.111e-15 +in fraction. Saved L1 and discrete Fourier diagnostics reconstruct within +1.10e-14 and 1.54e-14 respectively. The maximum native-reported relative mass +drift is 1.2271e-14; stable independent summation gives at most 1.228e-16 for +the same stored fields. Both are far below 1e-10, but conservation alone does +not establish shape accuracy. + +| Case | C | E_L1 at 16 | E_L1 at 32 | Single available pair order | +|---|---:|---:|---:|---:| +| Translation | .1 | 1.033111 | .839138 | .30001 | +| Translation | .25 | 1.005394 | .812178 | .30789 | +| Translation | .5 | .950567 | .761136 | .32063 | +| Adapted vortex | .1 | 1.336294 | 1.180684 | .17861 | +| Adapted vortex | .25 | 1.314800 | 1.155071 | .18686 | +| Adapted vortex | .5 | 1.271279 | 1.105685 | .20134 | + +E_L1 is normalized symmetric volume difference against source cell averages, +not a percentage in this table; it may exceed one. These available-grid errors +are much larger than .05. There is no measured 64-grid error or finest pair, +so no finest-grid threshold or three-level convergence result is asserted. +The lower-C comparator is more diffusive here; no universal improvement from +reducing dt is inferred. The vortex remains the explicitly adapted 2D RT0 +carrier extruded through the 3D sphere, not the full 3D deformation benchmark. + +The six dry controls pass. Three full controls pass with changes of at most +1.111e-16; three full controls refuse. Independent reconstruction of the declared +f64 face-product arithmetic using the retained f32 fields reproduces the exact +first offending cells: 56 at n16/C.5, 373 at n32/C.1, and 180 at n32/C.5. +Each offending fraction is 1.0000000000000002. That computation is a diagnostic +of the saved inputs, not an additional native attempt. Accepted constant state +is preserved on refusal. The raw bounds policy rejects these results; no +clamp, tolerance relaxation, or post-run corrected comparator is introduced. + +## Separate per-cell source geometry oracle + +`geometry_oracle.py` constructs a different positive clipped-chord integration: +it partitions an inner coordinate at chord/box contacts and integrates its +positive interval length, followed by SciPy QUADPACK Gauss-Kronrod in the outer +coordinate. It does not import the candidate, use its four-corner disk-area +formula, or use adaptive Simpson. Exact sphere reflection/permutation symmetries +cache repeated integrals without approximate key matching. Independent nearest +box-point and all-eight-corner predicates classify every retained field; contacts +within an explicit roundoff band receive Decimal checks. No native source +fraction is clipped or renormalized. + +Every native FULL/EMPTY cell agrees with its independent classification. +Every one of the seven stored fields passes the frozen independent source gate: +normalized sum of cellwise absolute discrepancy plus the oracle's aggregate +integration estimate is below 1e-4. Maximum cellwise normalized discrepancy is +1.399e-14; maximum aggregate oracle integration estimate is 4.983e-12. There are +no SciPy integration warnings. All independent per-cell arrays and classification +maps are retained. Integration estimates are empirical, not rigorous enclosures. + +For the refused translation-initial/64 field specifically, normalized cellwise +discrepancy is 6.776e-16 and aggregate estimate is 2.183e-13. This is evidence +that the saved geometric field agrees closely with an independent integral; it +does not discharge the native termination/exhaustion criterion. `exhausted=true` +remains a failed native admission, the executable's exit1 remains retained, and +missing final/initial fields and all 64-grid trajectories remain absent. + +## Dependency disposition + +Preserve this single incomplete campaign, the original coarse channel failure, +all three P1 campaigns and the current donor version. The observed interface +diffusion and raw Full-cell refusals block positive interface promotion. Do not +claim an n64 accuracy/order result, full coupled water acceptance, physical +validation or native UI/GPU capability. + +A smallest Q2 common-geometry prerequisite is justified for implementation and +review, while its coupled Stokes/MMS, true solid-exterior geometry, absolute +free-surface pressure, boundary traction and transport method-selection gates +remain pending. A convex-fluid polygon integration reference can support common +moments and oriented flux assembly; it cannot be represented as completion of +the original coupled Q2 capability. + +Reconstruct with `python3 reconstruct.py RAW_DIR OUTPUT_DIR` and +`python3 geometry_oracle.py RAW_DIR OUTPUT_DIR`. Python/NumPy/SciPy versions, +all raw input hashes, numerical comparisons and per-step/per-field results are +retained in `field-summary.json` and `geometry-summary.json`. diff --git a/docs/plans/fluid-accuracy-composition/q1/route-handoff.md b/docs/plans/fluid-accuracy-composition/q1/route-handoff.md new file mode 100644 index 00000000..49433ae8 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q1/route-handoff.md @@ -0,0 +1,34 @@ +# Canonical lifecycle handoff for parent / G1 coordination + +User-adopted decision (2026-10-20): stop the P1 production-selection attempt; +preserve PR121,PR123,PR124 and their exact reference/negative limits. Do not build +a material-mesh production family. Prioritize the existing grid Q1→Q2 route. + +Requested lead-owned canonical updates, reconciled with the G1 owner's current +plan/ledger changes (do not apply an obsolete whole-file replacement): + +1. P1 milestone: selection attempt stopped; no selected production particle wall + method or nonlinear acoustic timestep. Three campaigns retained. PR124's + successful n8 material reference is explicitly a representation-change/cost + discriminator, not an SPH repair. P2 particle quadrature remains blocked on an + actual selected particle formulation; no reinterpretation as a material mesh. +2. Q1 milestone: admit bounded native channel/transport verification and only the + native verification support needed for its fixed comparator. Freeze the exact + numerical write set/protocol before evaluation; transition Planned→Active at + that freeze. Q-S claim remains pending until actual source-bound evidence and + independent review. Preserve the8-layer2.139313% channel failure and donor-cell + interface diffusion evidence; no changed thresholds or blanket dt assertion. +3. Q2 milestone: remain dependency-bound while Q1 runs; after actual Q1 disposition, + admit the smallest common geometry / coupled-pressure-viscosity reference or + geometric-flux selection justified by Q1. No general mesh/free-surface claim + from planar/extruded results. Reuse existing B/M/S owners and D1 interfaces. +4. Execution ledger/issues: record adopted route and source pins, stopped P1 + production promotion, exact Q1 result/failures at qualification, future Q2 + dependency decision. Keep G1/C1 native inspection/integration status under its + owner and preserve its current statements. + +This instance's current exclusive numerical write set is admission.md. Shared +root plan/claim-register/ledger changes belong to the parent. G1 Session, +recording, desktop, provider and module-declaration files are excluded here. +This handoff is a concrete field-level change request under existing authority, +not a new approval requirement or a reason to stop independent numerical work. diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/admission.md b/docs/plans/fluid-accuracy-composition/q2-coupled/admission.md new file mode 100644 index 00000000..63ff7a4e --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/admission.md @@ -0,0 +1,19 @@ +# Bounded aligned coupled algebra reference + +Explicit user direction: after independently qualified Q2 geometry, advance the +next dependency-ready slice; separate dependent DRAFT, exact-source qualification, +independent review, no merges/cleanup or old failure replacement. Geometry v3 +0f4e7e0 passed all fixed-corpus exact/finite gates; reports checkpointe6525a1. + +Exact exclusive write set: new examples/grid_coupled_reference.rs (and private +submodules if needed), tests/grid_coupled_reference_contract.rs, this q2-coupled +owner. No Cargo/production/AlignedStrain/StaticObstacleGeometry/Session/UI edits. +Reuse existing PR115/D1 owners and aligned rows. No claim the old split +aligned_stokes experiment is coupled. No cut/free-surface velocity-extension or +active-space selection from zero-aperture positive-dual observations. + +Source/protocol independent review and freeze before selected tests or numerical +campaign. Parent/repository lead owns final source inventory/CI/merges. This is +a tiny direct CPU algebra reference, not a production backend, continuum PDE +convergence or physical water qualification. Coding Standards0fc92a2 numerical, +Rust, contracts, architecture, verification and bounded lifecycle remain applied. diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/analyze.py b/docs/plans/fluid-accuracy-composition/q2-coupled/analyze.py new file mode 100644 index 00000000..8b3a1b67 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/analyze.py @@ -0,0 +1,44 @@ +"""Fixed tiny aligned algebra corpus; independent discretization oracle required.""" +import csv,json,math,pathlib,sys + +def require(value,message): + if not value: raise SystemExit('coupled input/gate refused: '+message) +def rows(p): + with p.open() as stream:return list(csv.DictReader(stream)) +root=pathlib.Path(sys.argv[1]); summary=rows(root/'summary.csv') +expected={(f,r,dt) for f in ['unit','anisotropic'] for r in [1.0,998.206] for dt in [.125,1.0]} +keys=[(r['fixture'],float(r['rho']),float(r['dt'])) for r in summary] +require(len(keys)==8 and len(set(keys))==8 and set(keys)==expected,'eight unique prescribed fixtures') +results=[] +for r in summary: + fixture=r['fixture'];rho=float(r['rho']);dt=float(r['dt']);mu=.1 if rho==1 else .001002 + require(float(r['mu'])==mu,'prescribed mu') + require(all(math.isfinite(float(v)) for k,v in r.items() if k!='fixture'),'finite summary') + for field in ['momentum','continuity','work','corrected_work','residual_work_bound']: + require(0<=float(r[field])<=1e-10,fixture+' fixed '+field) + require(float(r['old_energy'])>0 and float(r['energy'])>=0 and float(r['dissipation'])>=0,fixture+' energy/dissipation') + case=root/f'{fixture}-rho{rho:g}-dt{dt:g}';meta_rows=rows(case/'meta.csv');meta={v['key']:v['value'] for v in meta_rows} + require(len(meta)==len(meta_rows),'duplicate metadata') + require(all(math.isfinite(float(v)) for k,v in meta.items() if k!='fixture'),'finite metadata') + require(meta['fixture']==fixture and float(meta['rho'])==rho and float(meta['mu'])==mu and float(meta['dt'])==dt,'source parameters') + nv,nc,ns,components=[int(meta[k]) for k in ['nv','nc','ns','components']];nn=nv+nc-components + require(0components>0 and ns>0,'bounded dimensions') + faces=rows(case/'faces.csv');rr=rows(case/'rows.csv');terms=rows(case/'terms.csv');cells=rows(case/'cells.csv');mat=rows(case/'matrices.csv') + require(all(math.isfinite(float(v)) for f in faces for v in f.values()),'finite face fields') + require(all(math.isfinite(float(c[k])) for c in cells for k in ['volume','p']),'finite cell volume/pressure') + require(len(faces)==nv and {int(f['active']) for f in faces}==set(range(nv)),'active IDs') + require(len(rr)==ns and {int(t['row']) for t in rr}==set(range(ns)),'strain rows') + require(all(0<=int(t['row'])=0 for t in rr),'nonnegative finite weights') + require(all(float(f['mass'])>0 and float(f['area'])>0 and float(f['distance'])>0 for f in faces),'positive mass/area/distance') + echar=.5*sum(float(f['mass']) for f in faces) + require(float(r['energy'])<=float(r['old_energy'])+1e-10*echar,'energy upper bound') + pressure=[c for c in cells if float(c['volume'])>0];require(len(pressure)==nc,'pressure cells') + require({int(c['pressure_index']) for c in pressure}==set(range(nc)) and sum(c['gauge']=='true' for c in pressure)==components,'pressure IDs/gauges') + sizes={'B':(nc,nv),'K':(nv,nv),'A':(nv,nv),'coupled':(nn,nn)} + actual={(m['block'],int(m['row']),int(m['column'])) for m in mat} + wanted={(block,i,j) for block,(n,m) in sizes.items() for i in range(n) for j in range(m)} + require(len(actual)==len(mat) and actual==wanted and all(math.isfinite(float(m['value'])) for m in mat),'complete finite blocks') + results.append(dict(fixture=fixture,rho=rho,mu=mu,dt=dt,nv=nv,nc=nc,ns=ns,components=components,full_size=nn,metrics={k:float(v) for k,v in r.items() if k not in ['fixture','rho','mu','dt']})) +print(json.dumps(dict(native_tiny_aligned_gate=True,results=results,independent_blocks_solution_work_gate='REQUIRED',cut_free_surface_or_production_admitted=False),indent=2,allow_nan=False)) diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/independent-review.md b/docs/plans/fluid-accuracy-composition/q2-coupled/independent-review.md new file mode 100644 index 00000000..19457ba4 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/independent-review.md @@ -0,0 +1,27 @@ +# Independent tiny aligned coupled-algebra disposition + +PASS for the eight predeclared aligned algebra cases at frozen source `06b31902fd229624080bff1562f80beb1be2449c`. No remaining blocker to reporting this bounded result. General cut/free-surface assembly, continuum PDE accuracy and production water remain unqualified. + +Prospective review checked the source, protocol, structural evaluator and mathematical correspondence before selected computation. Prefreeze finite-field guards and evaluator energy upper bound were corrected before source freeze. This source assembles and directly solves a single coupled system; it does not invoke the existing split viscosity/projection step. Reviewer performed no native solver/test/evaluator execution and changed no candidate source or raw data. + +The independently written oracle was hashed before first inspection/evaluation of completed raw data; the source hash remains `b76e7c926d5746aa76bbf2a60d768443b97f7cb4c31e5c2f072a82af117b8d3f`. It completed once with exit 0 and empty stderr. Its construction starts from prescribed integer cell boxes, spacing, origin and obstacle indices. It reconstructs fluid cells and active faces analytically, graph components and gauges, normal differences, every interior engineering-shear quadrant, flat-wall halfwidth derivatives and obstacle-corner quadrant traces. Exported strain rows are used only for comparison. It then assembles independent M/B/S/W/K/A/KKT blocks and uses NumPy LAPACK direct solution independently of the native Gauss-Jordan implementation. No candidate/evaluator import or execution occurs. + +The geometry, mass, analytic initial velocities, B, every strain coefficient and every quadrant weight agree exactly with their exports. Independent K/A/KKT scaled discrepancies are at most `6.938893903907228e-18`, below the fixed `1e-12*max(1,actual magnitude)` assembly allowance. Native K and KKT are symmetric in these cases. The reconstructed corpus comprises 8 summary rows, 448 active-face records, 252 total-cell records, 1,984 strain rows, 4,960 strain terms and 123,848 dense block entries. All 49 input CSV hashes remain unchanged after reconstruction. + +Unit fixture: 48 active velocities, 26 fluid pressures, 210 strain rows, 73 coupled unknowns. Its rows comprise 78 normal, 96 interior and 36 obstacle-corner rows. Anisotropic fixture: 64 active velocities, 34 fluid pressures, 286 strain rows, 97 coupled unknowns; 102 normal, 128 interior, 48 obstacle-corner and 8 obstacle-flat rows. Each actual incidence graph has one component, gauge cell 0 and exact-real B rank respectively 25 and 33. Positive weighted graph incidence proves this rank; no numerical SVD tolerance is chosen to admit a deficient matrix. Positive M, nonnegative W and positive dt imply positive-definite A; independent Cholesky also succeeds. Full-row-rank reduced B then gives nonsingular KKT in exact arithmetic. + +Across both density/viscosity scales and both timesteps, maximum independently solved velocity discrepancy is `1.0047518372857667e-14*Uref`; maximum pressure discrepancy is `1.9589259591386796e-14*Pref`, both below the fixed `1e-10` limits. Raw, unscaled SI KKT 2-norm condition numbers range from `78.81576737871652` to `771737527.583345`; A ranges approximately `1.00000169..3.86188462`. These are diagnostics dependent on units/scaling, not a production conditioning or solver guarantee. + +Full fields, including the gauge-cell continuity equation, were reconstructed from independent blocks. Maximum normalized momentum residual is `1.0860877414811312e-15`; continuity is `1.491399596413127e-14`. Maximum physical cell flux is `4.474198789239381e-14 m³/s`, maximum divergence `4.474198789239381e-14 s⁻¹`, and maximum momentum residual force `1.6370904631912708e-11 N` over the two numerical scales. Each remains finite and satisfies its predeclared normalized gate. Initial velocity is the prescribed analytic function, with no desired final solution or matrix-manufactured forcing; its initial divergence need not vanish. + +Independently reconstructed raw unforced work balance normalized by Echar is at most `3.872264413582959e-15`; defect-corrected balance at most `7.068755768240839e-17`; the measured absolute pressure-plus-momentum residual-work allowance at most `5.029525230184282e-15`. All are below the fixed `1e-10` gates. Dissipation is nonnegative and energy decreases in every case. Pressure work is retained as its computed finite value rather than asserted to be zero from a solver tolerance. The temporal penalty is included, so pressure constraint loss from the initially divergent state is accounted for. + +Signs and units match the declared method: integrated outward B has units m²; M is kg; S is m⁻¹; W=mu*quadrature-volume is kg·m²/s; K and M/dt are kg/s. Normal row weight 2V and engineering-shear weight V represent the discrete mu integral of 2D:D. With native residual r=M(u-u*)/dt+Ku-Bᵀp, polarization yields + +`Enew-Eold + .5||u-u*||²_M + dt*uᵀKu = dt*pᵀBu + dt*rᵀu`. + +The symmetric KKT signs `[A,-Bᵀ;-B,0]` enforce this pressure convention and Bu=0. Homogeneous stationary traces are eliminated, so no nonzero boundary lift or moving-boundary work is omitted within this reference. Preserved plan StokesWork.lean has exactly the corresponding step identity with proof defect=dt*r, mass=M, strain=S and weight=W. This is conditional reuse of an existing exact-real result, not a new kernel proof, native/IEEE correspondence proof or continuum consistency theorem. + +All eight independent fixed algebra gates pass without threshold change, native rerun or source mutation. The result supports a tiny aligned direct CPU reference only. The tested graphs have one component; no disconnected or nonhomogeneous compatibility claim follows. It does not select active velocities/extensions for the 732 zero-aperture/positive-dual observations from geometry v3, admit arbitrary cuts/free surfaces, establish natural nonzero pressure/traction boundary lifts, qualify a scalable backend, or establish disk/annulus MMS, hydrostatic obstacle accuracy, physical impact, GPU/UI or production mesh water. Earlier P1, Q1 and Q2 negative evidence remains unchanged. + +The next cut/PDE stage must stop at its unresolved active-space/extension and physical traction/boundary-lift selection gates, with a coherent prospective method and independent protocol before new computation. Parent/repository lead owns integration and merges. Supporting evidence is retained in `results/summary.json`, eight reconstructed NPZ field/block archives, `execution-and-counts.json`, frozen source/manifest, captured stdout/stderr and `SHA256SUMS`. diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/manifest.json b/docs/plans/fluid-accuracy-composition/q2-coupled/manifest.json new file mode 100644 index 00000000..911eaeb0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/manifest.json @@ -0,0 +1,26 @@ +{ + "numerical_source_commit": "06b31902fd229624080bff1562f80beb1be2449c", + "binary_sha256": "2e6dce9e317aa157d41ae05f8ba29c6a8ed4df51f8fcb7c88bd96f6294cbef93", + "source_archive_sha256": "8cb96557b1b401167d979a3587fa4175b26a9f53a34bcfff93ebdf92e238fff7", + "native_exit_code": 0, + "cases": 8, + "selected_debug_tests": 2, + "selected_release_tests": 2, + "independent_oracle_sha256": "b76e7c926d5746aa76bbf2a60d768443b97f7cb4c31e5c2f072a82af117b8d3f", + "independent_result_sha256": "284417cca5ba7cae4020b475cdeafe8f7ca31f6a88e3e209afc09c17bca5da99", + "independent_review_sha256": "159c818739defdb3ebf393469c080c95fb3f3dd251fcf138e7487828a2e9be7c", + "independent_hash_manifest_sha256": "89631999bba71d7cd8d17b6b78274d46f89b4e8b67d8fd11f0f3864ed1a82004", + "evaluator_sha256": "a129ae79ed54f520883d508a0a3c2cc4d72b5540079d6d28aa7461088d71b336", + "custody": "Archive created once, CRC checked, independent review/manifest hashes match final reviewer receipt, saved privately to Library with local identity persisted.", + "archive": { + "path": "/workspace/rheon-q2-aligned-coupled-06b3190.zip", + "bytes": 6469513, + "sha256": "550bc5173f14939deed7666e348a95edc0ea1474cd80112578cdd7c3dbc79fa5", + "library": { + "library_file_id": "libfile_dc54eac485448191815068901b1b2332", + "file_id": "file_00000000c4748230aef762e6b63a0be1", + "current_version_number": 0, + "path": "/rheon-q2-aligned-coupled-06b3190.zip" + } + } +} diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/mathematics.md b/docs/plans/fluid-accuracy-composition/q2-coupled/mathematics.md new file mode 100644 index 00000000..b657f030 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/mathematics.md @@ -0,0 +1,42 @@ +# Aligned coupled algebra and proof correspondence + +Existing AlignedStrain supplies active stationary-box face velocities and strain +rows, not a timestep. The new reference assembles their mass, integrated outward +incidence and viscosity into a single backward-Euler system. It does not invoke +the existing split aligned_stokes update/projection experiment. SI dimensions: +velocity m/s, pressure Pa, M kg, B m² (Bu m³/s), S m⁻¹, W=mu*quadratureVolume +kg*m²/s, K=SᵀWS kg/s, A=M/dt+K kg/s. Positive M and nonnegative W imply A is +positive definite for dt>0. Normal rows carry2V and engineering shear rows carry +V, so the quadratic viscous work is mu times the discrete integral of2D:D. + +For each positive open interior face the incidence column is +A_face at the +negative cell, -A_face at the positive cell. Componentwise column sums vanish. +B equals an oriented graph incidence times a positive diagonal edge-area matrix; +its exact-real rank is nc-components. Remove one pressure column and its paired +constraint row per connected component. The resulting B has full row rank. +[A,-Bᵀ;-B,0] is then nonsingular: a homogeneous solution satisfies Bu=0, and +uᵀAu=0 forces u=0; full row rank then forces the gauge-fixed pressure to0. +All eliminated velocities have homogeneous stationary boundary values, so no +unaccounted boundary lift/work enters. This argument does not admit nonhomogeneous +compatibility, disconnected cut policies, arbitrary mesh geometry or an iterative +backend. Independent graph reconstruction checks the actual assembly hypotheses. + +Native residual r=M(u-u*)/dt+Ku-Bᵀp has units N. Polarization gives exactly +E(u)-E(u*)+.5||u-u*||²_M+dt*uᵀKu = dt*pᵀBu+dt*rᵀu. +The reported a posteriori residual-work allowance is + dt*(sum_c |p_c(Bu)c| + sum_i |r_i*u_i|)/Echar, +with Echar=.5sum_i M_i*Uref², Uref=1m/s. Pressure work is zero only when actual +continuity is satisfied; report its numerical value and the full residual. +The original arbitrary analytic u* can have divergence; pressure projection loss +is included in the positive .5||u-u*||²_M term. No forcing/desired final solution +is manufactured from the assembled matrix. Enew<=Eold follows for an exact +unforced constrained solve; floating residual allowance is measured separately. + +Reuse plan120's kernel-checked exact-real StokesWork.pressure_work, viscous_work, +coupled_work_with_defect and exact_constrained_work: set proof mass=M, proof +weight=W, proof strain=S, and defect=dt*r. Their assumptions are fixed rows/weights, +homogeneous stationary boundaries and the actual step equation/constraint. That +prior proof does not check this native assembly, binary64 errors, linear solver, +continuum traction or convergence. No duplicate/new Lean theorem or axiom claim. +Parent integration may bring the already merged plan proof into the final source; +this bounded reference's evidence remains source-bound to its own frozen commit. diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/protocol.md b/docs/plans/fluid-accuracy-composition/q2-coupled/protocol.md new file mode 100644 index 00000000..6a8f0ae3 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/protocol.md @@ -0,0 +1,66 @@ +# Prospective aligned coupled reference v1 + +No selected tests/native computation before independent source/protocol review and +freeze. Two exactly aligned fixtures reuse existing StaticObstacleGeometry and +AlignedStrain with sealed outer normal/free-slip tangential walls and stationary +no-slip interior box. Unit grid3³ h1, origin0, obstacle indices[1,2]³; anisotropic +grid3x4x3 h(.5,.75,1.25), origin(-.5,.25,-1), obstacle indexlo(1,1,1),hi(2,3,2). +Both are fully aligned resolved geometry, not a cut-cell or free-surface extension. +Each has rho/mu=(1,.1) or(998.206,.001002), dt=.125 or1: eight cases. The water +scale checks dimensions/numerics only; no experiment or physical qualification. + +At each existing active face, actual positive M=rho*A*d (kg). Integrated outward +B (m²) has +A at the negative cell and -A at the positive cell. Existing strain +rows S have inverse-length coefficients; geometry weights are2V for normal rows +and fluid-sector V for shear. W=mu*geometryweight; K=SᵀWS (kg/s). All positive +mass and nonnegative finite weights must remain; no floor/merging. A=M/dt+K. +Assemble and solve ONE KKT system [A,-Bᵀ;-B,0] with rhs[M*u*/dt,0]. Prescribed +boundary velocities are homogeneous and already eliminated by existing rows; +there is no undisclosed nonzero boundary lift. Keep old split comparator unchanged. + +Analytic input at actual active face position (SI numerical coordinates x/Lref, +etc, Lref=1m,Uref=1m/s), axis index d=0,1,2: +u*=Uref[sin(.7x/Lref-.4y/Lref+.3z/Lref+.2d) + +.25cos(x/Lref+.6y/Lref-.2z/Lref+.4d)]. +No manufactured RHS generated from the assembled matrix/desired solution, no +forcing; initial divergence need not vanish. Pressure is Pa. Pressure reference +Pref=rho*Uref*Lref/dt+mu*Uref/Lref. Gauge one first pressure cell per actual +connected component; omit only those pressure columns/constraint rows, reconstruct +all pressures with gauge0 and check ALL fluid-cell continuity afterward. Verify +incidence graph components and B column cancellation independently; homogeneous +flux RHS is component-compatible. Nonhomogeneous compatibility/lifts are outside +this reference. Direct partial-pivoted elimination bounded to256unknowns, exact +zero/nonfinite pivot refusal; no arbitrary small-pivot floor or production backend. + +Mandatory fixed gates before admission: +- Independent analytic aligned geometry, active-face IDs/positions/areas/distances, + mass, component/gauges, every strain row/term/weight and B/K/A/coupled block agree + within1e-12 scaled by max(1,actual magnitude), signs/IDs/counts exactly. S rows + independently reconstructed from aligned finite differences/halfwidth obstacle + traces and per-quadrant geometry, never accepted solely by reassembling exports. +- Independent direct solution of independently assembled blocks: velocity error + /Uref <=1e-10, pressure error/Pref <=1e-10. Report condition numbers; rank of B + is nc-components, positive M, nonnegative W, symmetric K and KKT verified. +- Full momentum r=M(u-u*)/dt+Ku-Bᵀp normalized per face by + M_i*Uref/dt+sum_j|Kij|Uref+sum_c|Bci|Pref <=1e-10. Full cell continuity + |Bu|/(sum_j|Bcj|Uref)<=1e-10, also report physical flux and divergence /V. +- E=.5uᵀMu, Echar=.5sum(M)*Uref²; unforced backward-Euler balance + E-Eold+.5||u-u*||²_M+dt*uᵀKu=dt*pᵀBu+dt*rᵀu. + Both raw unforced balance/Echar and defect-corrected balance/Echar <=1e-10; + dt*(sum|p_c(Bu)c|+sum|r_i u_i|)/Echar <=1e-10. Dissipation >=0 and energy + <=Eold+1e-10Echar. Independently reconstruct all terms, pressure work and bound. +- Every selected value finite. No criterion relaxation after observation. Retain + any refusal/failure; stop dependent progression. No continuum MMS orders inferred. + +Focused debug/release contracts cover pivoting/singular/nonfinite refusal and +coupled block dimension, gauge count, invaliddt and exact component flux +cancellation. Strict Clippy; ONE actual release CPU campaign with fresh root, +source/binary/commands/outputs/hashes retained. Independent oracle source frozen +before raw evaluation; eight-case structure/evaluator gates always-on underPython +normal/-O/-OO. Full-suite rerun unnecessary for a private reference-only addition. +Existing plan StokesWork theorem is exact-real correspondence guidance with fixed +M/B/S/W, stationary homogeneous boundary and actual residual; do not claim new +kernel proof or IEEE/PDE/physical result. Cut/free-surface operators, disk/annulus +MMS, oblique hydrostatics and production backend remain pending and gate progress. + +Prefreeze rank clarification: compute components from independently reconstructed positive-area face incidence. The weighted graph-incidence theorem fixes rank(B)=nc-components exactly; no observed SVD tolerance selects rank. Floating condition numbers are diagnostics only. Native tiny dimension refusal precedes allocating dense blocks. diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/qualification.md b/docs/plans/fluid-accuracy-composition/q2-coupled/qualification.md new file mode 100644 index 00000000..51da5ebe --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/qualification.md @@ -0,0 +1,23 @@ +# Bounded disposition and stopping gate + +PASS: eight fixed aligned private CPU coupled M/B/S/W assemblies and dense solves, +with independently reconstructed geometry/strain/blocks/directsolutions, actual +component/gauge/full residuals and polarization/residual-work accounting. Reuses +existing PR115/D1 architecture and conditional exact-real StokesWork identity; +no new kernel theorem/axioms/IEEE proof. The old split experiment stays unchanged. +Source/protocol reviewed before selected tests and one source-bound campaign. + +STOP dependent cut/free-surface progression here. The unresolved zero-aperture/ +positive-dual velocity extension/active-space policy, full cut/stress boundary +lifts and physical traction correspondence require method selection and separate +reviewed admission. No arbitrary extension/DOF rule is selected from the bounded +geometry observations. Disk/annulus coupled MMS, oblique water hydrostatics, +small-cell conditioning/refusal and production backend remain unqualified. +Aligned algebra does not discharge these correctness gates. No physical impact, +GPU/UI/native observation or general mesh-water claim. + +Prior P1 no-production-winner decision, Q1 n64 quadrature exhaustion and three +Full refusals, Q2 v1 refusal/v2 artifacts remain preserved and authoritative. +Geometry v3 repaired only its fixed-corpus aperture defect. Parent/repository lead +owns canonical lifecycle, final integration/source admission and merges. Both new +PRs remain DRAFT; no branch cleanup/rebase/merge by numerical owner. diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/results.md b/docs/plans/fluid-accuracy-composition/q2-coupled/results.md new file mode 100644 index 00000000..d22dbc27 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/results.md @@ -0,0 +1,31 @@ +# Frozen aligned coupled reference result + +Source06b31902fd229624080bff1562f80beb1be2449c; actual native binary SHA256 +2e6dce9e317aa157d41ae05f8ba29c6a8ed4df51f8fcb7c88bd96f6294cbef93. +One release CPU campaign, exit0, all8fixedcases;2focused contracts pass in debug +and release, strict Clippy passes. Frozen structural evaluator normal/-O/-OO +outputs byte-identical. No production/Cargo or previous evidence changes. + +Independent source/hash frozen before first raw inspection/evaluation. One +independent reconstruction, exit0, empty stderr; no candidate/evaluator imports, +execution or native rerun. Analytic aligned face geometry, M/B, every normal/ +shear-quadrant strain coefficient and weight agree exactly. Independently +assembled K/A/KKT maximum scaled discrepancy6.94e-18 vs fixed1e-12. Unitfixture: +48velocities,26pressurecells,210strainrows,73unknownKKT; anisotropic:64/34/286, +97unknowns. Actual incidence graphs each have1component, ranks25/33 and first-cell +pressure gauge0. Multi-component/nonhomogeneous compatibility not admitted. + +LAPACK direct solutions of independent blocks differ by at most +1.00475e-14*Uref in velocity and1.95893e-14*Pref in pressure vs fixed1e-10. +Full native momentum maximum1.08609e-15; full-cell continuity1.49140e-14; +raw energy balance3.87227e-15; corrected identity<=1.3e-16; +residual-work allowance<=5.031e-15. All fixed1e-10 gates pass and energy decreases, +with no forcing or wall work. Nonzero numerical pressure work/physical flux and +divergence are retained in independent reports, never assumed identically zero. + +Raw-SI KKT2norm condition numbers approximately78.8..7.717e8; A approximately +1.0000017..3.8619. These depend on units/scaling and are diagnostics only, not +posthoc rank tolerances or a production backend claim. Unit fixture exercises +normal/interior/corner rows; anisotropic also includes flat-obstacle rows. +This is exact-algebra/native-assembly numerical verification on existing aligned +owners, not continuum PDE convergence, physical stress accuracy or water validation. diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/review.md b/docs/plans/fluid-accuracy-composition/q2-coupled/review.md new file mode 100644 index 00000000..67624444 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/review.md @@ -0,0 +1,25 @@ +# Independent prefreeze review + +Existing user-authorized `/root/p1_numerical_review` independently reviewed the +native source, mathematics, prospective protocol and always-on structural +evaluator before selected tests/native evaluation,2026-10-20. Signs/units correct: +B integrated outward, symmetric[A,-Bᵀ;-B,0], positive M, K=mu*SᵀWgeom*S. +This actually solves the coupled system, not the preserved split experiment. +Arbitrary analytic u* is independent of matrices/desired final solution. Exact +work polarization, residual bound, gauge/rank graph argument and stationary +homogeneous elimination are coherent under stated assumptions. + +Prefreeze findings corrected: explicit finite momentum residual/positive finite +scale/full cell-flux checks (avoid NaN maxima); finite exported velocity/pressure/ +geometry fields and declared energy upper bound in evaluator; dimension refusal +before dense blocks. No scientific budget changed. Graph-incidence rank is +predeclared, with no observed SVD rank tolerance. Conservative failures remain +refusals. Strict compile-only Clippy checks pass; no selected execution yet. + +The reviewer read merged plan StokesWork.lean and confirms the conditional +correspondence mass=M, weight=mu*wgeom, strain=S, defect=dt*r. No new kernel proof, +IEEE or PDE correspondence is inferred. No remaining prefreeze blocker within +this eight-case aligned private-algebra scope. Independent actual-data admission +requires geometry-derived normal/shear rows, M/B/K/A/KKT blocks, graph/gauge, +direct solution, all fluid-cell fluxes and full work reconstruction. Oracle source +will be frozen before raw evaluation; source review does not replace that gate. diff --git a/docs/plans/fluid-accuracy-composition/q2-coupled/route-handoff.md b/docs/plans/fluid-accuracy-composition/q2-coupled/route-handoff.md new file mode 100644 index 00000000..1277733c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-coupled/route-handoff.md @@ -0,0 +1,29 @@ +# Final numerical source-admission inventory through parent + +DRAFT PR132 basePR130: source0f4e7e0944a7e0302690a0f71c08c21fe345cc89, +reportcheckpointe6525a116a07af486e4a682cc2b157241d6b9150. Changes vs c2fbbea: +Cargo.toml/Cargo.lock new dev-only rational requirements; existing private +examples/grid_geometry_reference.rs and geometry.rs/diagnostics.rs; new exact.rs; +new q2-exact reports. Test adapter unchanged. Fixed-corpus exact/finite geometry +qualified; archive15,077,327bytes SHAe0bb0e691ca27feec7991abe980f94013260ad12cda93daf904ba7c7fa9ecc4d, +Librarylibfile_b04abe9965fc8191843341e158250f25 version0. + +DRAFT PR134 basePR132/e6525a1: frozen numerical +source06b31902fd229624080bff1562f80beb1be2449c. Exact new source write set: +examples/grid_coupled_reference.rs; tests/grid_coupled_reference_contract.rs; +new q2-coupled owner. No Cargo changes, no existing operator/geometry/proof changes. +Eight-case aligned coupled algebra qualified. Its manifest identifies archive and +independent sources/results; no source mutation or native rerun after freeze. + +Shared currentmain last fetched718469beedb9a949f4bb6f3299c7b880b4c47e47 (merged +plan120/audit119 at preserved heads). No rebase/merge/cleanup; no combined-main, +C1/G1/Session or UI source-admission claim. Existing Q1 production LiquidVolume +API belongs toPR126, not these private references. PR126/127/130 evidence untouched. +The lead01a13f94-5c63-7243-abfc-f5474da1902d owns dependency/CI/source integration +through parent. This report does not overwrite canonical shared lifecycle files. + +Next correctness gate is method selection for cut/free-surface active spaces, +velocity extension, stress/traction boundary lift, then source-bound coupled +MMS/hydrostatic verification. No numerical owner's assumed physical approval or +selected P1/P2 quadrature/dt follows. Stop until these gates are resolved in a +new bounded prospective slice. No further code needs to be guessed here. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/decision.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/decision.md new file mode 100644 index 00000000..0bff3348 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/decision.md @@ -0,0 +1,49 @@ +# Bounded method decision + +Select candidateC for a private OPERATOR/TRACE reference and deciding experiment, +not for production or a native coupled step. Derive all operators from the +2017supplement's continuum variational functional using an explicit continuous +staggered-bilinear velocity basis, consistent full mass and primalP0pressure. +This changes discrete quadrature and support semantics and has its own version; +it is not a claim to reproduce the published weighted-difference implementation. + +A publishedVFD implementation is a legitimate comparator, but its minimum weights, +support elimination, missing-velocity backsubstitution and boundary-commutator +trace correspondence are not resolved under Rheon's fixed no-floor/actual-flux +requirements. Do not import them as guessed defaults or call clipped hdual volume +an exact mass for a different reconstruction. RT0 is a useful exact local flux +bridge for VFD, but its shear/traction trace does not automatically equal the +staggered strain trace. CandidateB's aperture-only active set plus aligned strain +therefore has no admitted variational/physical boundary correspondence. + +C makes active-basis support and physical trace explicit, eliminating extension +values guessed from aperture flags. FullM represents the declared field's kinetic +energy and permits physical linear/angular momentum tests. Exact common geometry +and a single field supply B, K and nodal traction. Its new pressure pair has no +assumed cut-uniform inf-sup theorem. Exact rank/positive mass, full nodal affine +stress/load and physical flux identities must pass per declared instance. +No pressure gauge is removed for an open-traction boundary. No arbitrary mass +floor, basis deletion, stabilization coefficient or threshold adaptation is allowed. + +Smallest admitted implementation CV1: exact-cut support and positive quadrature, +fullM/B/K and independently integrated physical load/flux/moment maps on four +static represented polygons, with source-bound independent reconstruction. No +linear solver/timestep/provider/transport/solid wall implementation in this slice. +CV2 coupled-step/backends depend on the CV1 rank/conditioning results and a new +bounded prospective protocol. Generic stability/PDE/solid Dirichlet lifting +remain explicit method gates. This is a useful closed reference builder rather +than a production capability or a pretense that aligned tests qualify cuts. + +No essential physical/user input is missing for these synthetic fixtures: rho, +mu, extrusion, source geometry, fields and prescribed liquid-outward traction +are explicitly fixed by protocol. Oblique no-slip Dirichlet, moving geometry, +capillarity/atmosphere choice for an actual application and measured experimental +observations are not silently inferred from this synthetic natural-traction test. + +User implementation authority is explicit in this delegation and prior grid-first +repair direction. Independent researchreviewa2d7483 accepts the mathematical +candidate subject to source/protocol review and actual deciding gates. The +bounded direction and its full-mass/new-quadrature consequence were explained +before code, with no separate approval ceremony or root-plan/source-owner edit. + +Prospective protocol review accepted mathematical CV1 scope subject to explicit Duffy map, fixed work-test vectors and omitted-minus-full load sign; all three clarifications were incorporated before implementation. M/B conditioning diagnostics only; no hidden CV2 timestep selected. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/discovery.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/discovery.md new file mode 100644 index 00000000..9b73ff0f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/discovery.md @@ -0,0 +1,58 @@ +# Cut/free-surface method discovery — provisional + +User now explicitly authorizes resolving the documented method gate, independent +review, prospective deciding tests and the smallest actually admitted slice. +This does not grant PDE/water qualification or alter earlier acceptance criteria. +Existing canonical repair plan remains docs/plans/fluid-accuracy-composition/plan.md; +its shared lifecycle/source admission belongs to parent/repository lead. This new +local owner records only the bounded numerical method decision and evidence. + +Current isolated branch implementation/q2-cut-method-selection-20261020 starts at +f84f65104d6a0f6f8f1a9b903412b1e5155f72a2 (PR134). Freshmain718469beedb9a949f4bb6f3299c7b880b4c47e47. +Previous PR132/134 source and evidence remain immutable. No AGENTS.md found. +CodingStandards0fc92a2 core/router, planning/discovery, implementation, +verification/oracles, proportionality, Rust, code/architecture/contracts/docs/ +commits apply. Explicit user direction supplies implementation authority once the +bounded mathematical gate is resolved; no repeated ritual approval is required. + +Exclusive provisional write set: this new q2-cut-method owner; optional new +examples/grid_cut_variational_reference.rs and private modules, and matching +new test adapter after admission. No Cargo changes anticipated (existing private +num-rational requirements reused); no existing production, Session, recording, +desktop/UI/provider, source-admission, shared-plan or prior-report edits. Exact +code write set and criteria freeze after method selection, before computation. +Independent reviewer owns only /workspace/rheon-q2-cut-research/independent; +visual agent owns provisional method-map.html there. No cross-source edits. + +Observed: exact source/cut geometry reference passed76,384face/152,780region +checks;732zero-aperture/positive-dual cases remain legitimate support observations. +Alignedcoupledalgebra passed8fixtures but has no cut/free-surface boundary model. +Primary2017supplement derives full natural stress traction from its variational +functional; published implementation has minimum weights/support closure and +cannot be adopted as Rheon geometry qualification unchanged. Primary predecessor +2011 supplies explicit weighted operators/nonhomogeneous commutators/nullspace +handling; distinguish it from2017. Main2017PDF body is currently inaccessible to +the tools (18MB web limit, public downloads403); do not claim it was read. + +Material decisions: active physical vs extension velocities and their mass; +one discrete field for divergence/physical flux/strain/traction virtual work; +absolute free-surface pressure vs closed-box gauge; no invented solid/traction +boundary data; conditioning/refusal on tiny cuts; prospective rank/consistency/PDE +gates. No essential physical/user input is missing for synthetic verification: +the model and analytic boundary data can be stated explicitly. Experimental +water observations remain a separate future qualification input, not this gate. + +CandidateA: faithful weighted finite differences with strict geometric weights +and explicit closure/backsubstitution/commutator boundary loads. Keep unresolved +support/physical-ledger correspondence visible; no floor and no default p=0. +CandidateB: graft aperture-only velocities/B onto aligned strain; not a coherent +reference without a new trace/strain derivation, rejected at design level. +CandidateC: conforming staggered bilinear velocity basis and cellwise-constant +pressure, integrating the same continuum variational functional over actual cuts; +consistent mass, divergence, symmetric strain and traction from one basis. +New discrete reference version, not literal published FD or drop-in aligned +operator. Exact active-basis/rank/stress/trace gates still require review. No +cut inf-sup/continuum convergence is assumed merely from positivity or algebra. + +Provisional visual /workspace/rheon-q2-cut-research/method-map.html is a design +picture only, not telemetry, numerical evidence, binding method or native UI. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/evidence-manifest.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/evidence-manifest.md new file mode 100644 index 00000000..747eea59 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/evidence-manifest.md @@ -0,0 +1,40 @@ +# Sealed CV1 evidence identity + +- Draft PR: https://github.com/MrScripty/Rheon/pull/135 +- Isolated branch: implementation/q2-cut-method-selection-20261020. +- Base: f84f65104d6a0f6f8f1a9b903412b1e5155f72a2 (PR134). +- Frozen numerical source: 6d99e7794a6aa69f5886bb15cc662e40ea43cd40. +- Reviewed qualification-doc snapshot: 2437bb597ec6fc6dd49a673ef556c0b5de125ac7. +- Release executable SHA256: 377edcf4142104e44ef16d1d884d8d4c8a6df8e32ccdf8f1c18507e4871caf05. +- Oracle freeze SHA256: 38d4b75a5bbcdc7991725aef091f5e2347f671fe0b19ce51a34e8a4ce1095d55. +- Independent final review SHA256: 3291663bee4073f143c6aecd8ec2a7d47d7048cf92d559a0fc1440cbe0c60676. +- Independent final manifest SHA256: ca2bc74076645be07162ae38578e1146408227a2afc4d0ce6ae5e03764c728ae. + +Archive: `rheon-q2-cut-operators-6d99e77.zip`,12,937,704bytes. +SHA256: `ff4cd5b0d265f2ea6d9df5944f3b2043f5c037ade9f4475f4ba0f4a1984a72a7`. +Payload MANIFEST.sha256 digest: +`c996ca73a5a471c3ff631325bf7ffde334fbfecea847b963133a2b97bd6559f9`. +CRC validation succeeds. There are237 regular payloads;896 derived mutant links +are represented in symlink-manifest.json without duplicate dereference. Original +65-file native corpus, frozen mutant recipes and actual changed mutant files, +all logs/results/reviews, source archives and copied binary are retained. +The final HTML is explanatory only; no screenshots/GPU/nativeUI evidence. + +Privately saved to Library at `/rheon-q2-cut-operators-6d99e77.zip`: +`library_file_id=libfile_2c3f477952408191bc194b4f58a8a9b1`, +`file_id=file_000000007fe0823089efbce39509b8ca`,version0. +The original local archive records the returned Library identity; save and local +metadata persistence both succeeded. No sharing operation was performed. + +External local evidence root: `/workspace/rheon-q2-cut-method-evidence`. +Archive local path: `/workspace/rheon-q2-cut-operators-6d99e77.zip`. +Qualification results and limitations: qualification.md; exact independent review: +independent-review.md. Archive/report snapshot necessarily precedes assignment of +this identity; final repository documentation supplies this closure record. + +Only new private examples/grid_cut_variational_reference.rs, its private modules, +new tests/grid_cut_variational_reference_contract.rs and new q2-cut-method/* docs +are written on this branch. Existing exactgeometry modules are read-only. No +production/Cargo/Session/UI/recording/source-admission owner changes. Earlier +branches/evidence, audit119, plan120 and pressure59 remain preserved. No merge, +rebase or branch cleanup was performed. Integration belongs to repository lead. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/execution-ledger.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/execution-ledger.md new file mode 100644 index 00000000..12c91a97 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/execution-ledger.md @@ -0,0 +1,38 @@ +# Execution ledger + +2026-10-20: explicit delegation authorizes bounded method resolution and smallest +admitted implementation. Freshmain718469b; isolated fromf84f651; earlier source, +archives, Session/UI and parent source-admission owners untouched. Read current +root plan and linked architecture/math/verification plus routedstandards0fc92a2. +Primary research compares published weightedFD, unsupported aperturehybrid and +basis-integrated variant. Independent researcha2d7483 supports mathematical +coherence only, requiring complete support, exactrank and physicaltrace gates. +2017mainPDF body unread due toolsize/public403; accessible2017supplement, +officialcodeHEAD1dbccfd and authors2011predecessor explicitly distinguished. +Provisionalvisual maintained separately with no native/qualification claim. +Independent reviewer admitted the method/protocol after explicit Duffy mapping, +fixed work vectors, pressure-control sign, and per-unit-depth assumptions were +made precise. CV1 implementation is Active. Bulk and physicaltrace modules and +raw exporter are complete; strict compile-only Clippy found one needless-range +test lint being corrected. Full source/oracle review pending; no selected tests, +native campaign, or oracle data evaluation has run. + +Independent source review found no blocker at fee53b2 and confirmed the final +GridGeometry API delta against src/geometry.rs. Source freeze now precedes +selected debug/release contracts. The fixed campaign still waits for the exact +oracle/analyzer source freeze; no raw campaign has been inspected or evaluated. + +Pre-driver checkpoint 5d352e0 passed 10 debug and 10 release contracts, strict +Clippy, formatting and locked release build. No native campaign ran. Independent +driver review then admitted complete four-case continuation and retained refusal +files, including corrected five-field refusal CSV rows. Final source freeze +follows this pre-data harness repair; all earlier receipts remain retained. + +Final source6d99e779 passed10debug/10release contracts, strictClippy, formatting +and lockedreleasebuild. Oracle38d4b75 froze before the ONE native campaign; +03:54:36UTC native releaseCPU exit0 completed all4cases, maxgate6.75016e-14. +Independent exact reconstruction normal/-O/-OO byte-identical; fullrank66/66, +fullmassCholesky, exact support/polynomial/nodaltrace/work pass.14malformed +fixtures×3modes refuse intentionally (45subprocesschecks total);65CSV hashes +unchanged. SquarecondM6.53316e11 remains next-solve concern. No criteria, source +geometry, thresholds or native source changed after campaign. See qualification. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/implementation.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/implementation.md new file mode 100644 index 00000000..afee3f52 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/implementation.md @@ -0,0 +1,27 @@ +# CV1 private reference owner + +`examples/grid_cut_variational_reference.rs` is the only executable owner. It +accepts one fresh output directory and runs the four frozen protocol fixtures; +it never advances state or solves a pressure system. Material constants are +rho=1 kg/m³ and mu=.1 Pa*s, with 1m reference length/depth. GridGeometry supplies +native MAC indexing; its single z layer carries no physical end-cap condition. + +`clip` classifies represented rational geometry and refuses positive pieces that +collapse in native arithmetic. `basis` defines both velocity fields on complete +staggered nodal hulls. `assembly` integrates full mass, divergence, symmetric +strain and physical moment maps on common halfcell pieces. `trace` independently +integrates the same basis on actual source edges and signed Cartesian apertures. +`observe` evaluates the fixed work/rigid/affine/pressure-control diagnostics. +`export` flushes source inputs before admission, then completed raw operators, +geometry, basis and observations before numerical gate evaluation. A refusal +leaves existing files in place; the caller retains stdout, stderr and exit status. + +The private test adapter includes exact-geometry contracts read-only from Q2. +It adds support-hull/coincidence, positive rational triangle, quadrature, basis +and nodal pressure-sign contracts. No production API or algorithm is changed. +No dependency is added beyond the already reviewed exact-reference dev deps. + +The independent evaluator reconstructs polynomials from source floats using +Fraction integration; it does not reuse native Gauss samples to assert exactness. +Its source hashes must precede first data inspection. Method/source admission +and native source freeze precede selected tests and the one fresh CPU campaign. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/independent-review.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/independent-review.md new file mode 100644 index 00000000..80dba695 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/independent-review.md @@ -0,0 +1,95 @@ +# CV1 independent deciding review + +Disposition: the four frozen cases pass the prospectively declared **operator / +physical-trace builder** gates. This does not admit a coupled timestep, pressure +PDE solve, general cut-cell stability, moving free surface, or production method. +No native rerun, source patch, altered threshold, floor, coefficient deletion, +gauge or stabilization was used by this reviewer. + +Reviewed native source is `6d99e7794a6aa69f5886bb15cc662e40ea43cd40`. +The independent oracle was frozen before native data inspection/evaluation; +`oracle-freeze.json` SHA256 is +`38d4b75a5bbcdc7991725aef091f5e2347f671fe0b19ce51a34e8a4ce1095d55`. +Its candidate-file receipts match the final native source. The only prospective +review corrections were the native five-field refusal row and continued-case +driver custody, plus matching the oracle to the actual native `passed` status. +No fixed native campaign preceded those source corrections/final freeze. Earlier +pre-driver focused-contract receipts remain separately retained. + +The ONE native campaign was produced by its owner. This reviewer executed only +frozen Python reconstruction/custody checks on the saved native-v1 CSV corpus. +Independent geometry and polynomial integration use exact represented-coordinate +Fractions and analytic standard-simplex factorial moments, not native Gauss +samples or candidate imports. Every active association, full matrix entry and +physical trace is rebuilt from the source polygon, declared lattice and common +partition. Physical loads are integrated from original source edges; they are +not manufactured as matrix actions. + +| Case | Active velocity coefficients | Exact rank(B) / positive pressures | Full-M condition diagnostic | B condition diagnostic | Active zero-old-dual coefficients | +|---|---:|---:|---:|---:|---:| +| rectangle | 40 | 16/16 | 4.0217109939e4 | 49.76132296 | 16 | +| square-17 | 44 | 13/13 | 6.5331614839e11 | 8114.51138737 | 18 | +| disk-64 | 104 | 36/36 | 1.4115143713e4 | 51.39203431 | 28 | +| corner-triangle | 8 | 1/1 | 1.0033118455e5 | 1 | 6 | + +Exact rational elimination gives full row rank without a pressure gauge or SVD +rank tolerance. Both the independently integrated full M and exported native M +pass finite, positive-diagonal Cholesky in all four cases. Condition numbers are +floating SVD diagnostics of the exact-integral matrices converted to f64; they +are not rigorous condition enclosures or a mesh-uniform stability theorem. +The square's minimum exact M diagonal is approximately1.7013962159e-14. +Its large condition number is a material unresolved next-solve issue, not a +failed CV1 threshold: conditioning was diagnostic and no coupled solve was run. +It forbids inferring trustworthy velocity/pressure forward error from these +builder identities or from a future residual alone. Any next solve needs a +prospective method/backend/scaling and accuracy/conditioning contract. + +The independent reconstruction checked all368 native node associations,196 +active restrictions,66 positive pressure cells,640 common regions (206 positive), +470 positive fan triangles,4230 bulk quadrature points,33840 bulk basis records, +502 split boundary/grid segments,1004 trace quadrature points,7292 nonzero trace +basis records,102 unique positive Cartesian faces, and43724 dense M/K/B/grid-flux/ +physical-flux entries. Exact cut polygons, rational area witnesses, zero/positive +classifications and active/pressure masks have zero mismatches. All68 active +restrictions with zero old h-width dual area remain present. The corner has no +positive Cartesian face aperture but eight positive-mass basis restrictions, +six with zero old dual. That is a result for the declared wider Q1 support; +it does not validate an aperture-based finite-difference extension policy. + +All fixed1e-10 finite geometry/moment, M/B/K, nodal derivative/trace, every-cell +physical flux, full mass/momentum maps, rigid/affine actions, full-stress/pressure +load, polarization and pressure/viscous work gates pass. The largest independent +normalized discrepancy is7.8496237288e-15 for disk viscous cross-work. All original +native fixed diagnostics also pass; their largest value is6.7501559897e-14. +The constant2Pa projected load coefficient and correct omitted-pressure sign are +retained entrywise, with nonzero nodal negative-control signal in every case. +These are affine physical-load discriminators, not PDE pressure recovery. +The reference remains two-dimensional per1m depth and has no 3D end-cap claim. + +Frozen evaluator custody checks pass in ordinary Python, `-O` and `-OO`: + +- All three complete reconstructions succeed with byte-identical analysis JSON. +- Fourteen prospectively fixed malformed fixtures each intentionally refuse in + all three modes: empty/truncated/duplicate/NaN summaries; missing quadrature; + duplicate bulk basis; NaN matrix/map; duplicate/misindexed node; invalid rational + denominator; zero quadrature weight; missing trace point; duplicate metric. +- All45 subprocess checks pass. Malformed runs have empty stdout and create no + success-artifact directory. Logs retain their guard reasons and exits. +- All65 original native CSV path hashes match before/after. Frozen Python sources + have zero Assert AST nodes and retain their original hashes. + +`evaluation-v1/report.json` is the interpreter/custody report; +`evaluation-v1/complete-normal-result/analysis.json` contains all case values, +exact-rank pivot indices, normalized discrepancies and original input hashes. +The other two analysis JSON files are byte-identical independent executions. +`command.json` records the replay invocation; `SHA256SUMS-final` binds retained +regular review files and changed malformed fixtures. Unchanged fixture files +are symlinks to the immutable65-file native corpus, whose hashes are separately +bound in the reports. No earlier P1/Q1/Q2 evidence or repository owner was edited. + +The bounded CV1 information is complete. The next coupled/free-surface stage +remains blocked on a predeclared conditioning/solver and approximation contract, +along with pressure stability/convergence evidence appropriate to the selected +basis pair. Solid boundary lifting, transport/GCL and full three-dimensional +water remain separate unqualified dependencies. Do not extend this result into +a production winner or silently repair small support by deleting coefficients. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/issues.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/issues.md new file mode 100644 index 00000000..4da705d7 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/issues.md @@ -0,0 +1,23 @@ +# Findings and dispositions + +- CV-I1: published minimum weights/support closure do not meet unchanged no-floor + and actualflux gate. Compare only; no adoption of code thresholds. Ownernumerics. +- CV-I2: RT0 divergence bridge and staggered strain do not define the same + physicaltractiontrace automatically. Resolve CV1 by one continuous declaredbasis; + independent fullnodalload/flux test, not globaltotals. Ownernumerics/reviewer. +- CV-I3: puretraction pressure has no inheritedclosedboxgauge. CV1fullB exactrank + perinstance; no pressuredeletion/defaultp0. Genericinf-sup remainsunavailable. +- CV-I4: small cuts can degrade conditioning even with positive exactmass. + Recordcondition evidence; no native timestep/backend admission or massfloor. +- CV-I5: obliqueDirichlet/movingwall lifting not supplied by traction-only C. + Explicitunsupported scope, separatefuturemethod decision; no userinputguess. +- CV-I6: main2017PDF inaccessible at18MB webreader/public403. Accessible primary + supplement/code/predecessor sufficient for stated own continuum derivation; + bodyunread, no claim fullpublishedFD reproduction or redistributed paper. +- CV-I7: frozen independent normal reconstruction reports square-17 fullmass + condition about6.533e11, Bcondition about8.115e3. Cholesky/rank and fixed operator + errors pass, but this is not a coupled-step/pressure accuracy qualification. + Preserve the small cut and full basis; a later prospective conditioning/solve + decision must address it without floors, deleting pressure/velocity, or quietly + changing quadrature. Condition numbers were diagnostic in CV1, not a new + posthoc numerical pass/fail threshold. Ownernumerics/independentreviewer. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/mathematics.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/mathematics.md new file mode 100644 index 00000000..b6cd8940 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/mathematics.md @@ -0,0 +1,89 @@ +# Basis-integrated reference proposal and conditional properties + +The selected2017continuum saddle functional, allowing prescribed liquid-outward +traction g and body force f, is + .5rho∫Ω|u-u*|² + dt∫Ω[mu D(u):D(u)-p divu-f·u] -dt∫Γg·u. +Its variation in velocity gives mass/dt + viscous work - pressure divergence; +physical sigma=-pI+2muD has sigma*n=g. No separate pressure Dirichlet condition. +Use a fixed planar convex represented polygon and1mextrusion, rho/mu positive, +stationary geometry during this numerical Stokes substep. A free-boundary +kinematic update/transport and solid Dirichlet enforcement are separate gates. + +CandidateC chooses continuous tensor-bilinear nodal basis on each of the two +existing staggered scalar lattices: u_x nodes at primalXfaces, u_y at primalYfaces. +Their knot rectangles differ; partition cuts at the union of their knot planes +(halfcell grid) so every basis is polynomial on each integration piece. Restrict +these basis functions toΩ. The source is contained within both lattice hulls, +so partition of unity and affine coordinate reproduction hold onΩ/Γ. Boundary +support truncation outside those hulls is explicitly refused, never zero-filled. +An active coefficient's basis has positive measure support inΩ. A node can lie +outsideΩ, or have zero physical aperture and zero old h-width dual volume, while +its wider basis support has positive actual mass. All active restrictions are +retained; no floor/deletion/merging/extrapolated-value guess. + +Velocity u_h=Σ_i U_i φ_i, pressure p_h constant independently on each positive +primal cut cell Q_c. Each vector basis has only one component. Define + M_ij=rho∫Ωφ_i·φ_j, + B_ci=∫Q_c divφ_i, + K_ij=∫Ω2mu Dφ_i:Dφ_j, + F_i=∫Ωφ_i·f +∫Γφ_i·g. +Mass is CONSISTENT FULL SPD, not the prior diagonal dual-lumped mass. Integrate +normal strain weights2mu and engineering shear weightmu, retaining full symmetric +stress. A=M/dt+K; solve[A,-Bᵀ;-B,0](U,p)=(M U*/dt+F,0). This is a new discrete +reference variant of the same continuum variational problem, not literal published +weighted finite differences, a bitwise aligned operator replacement or production +provider. Existing GridGeometry/indexing, immutable represented sources and +coupled architecture are reused, without changing their qualified owners. + +For every active restriction, some scalar lattice knot cell has an open subset +inΩ. Its four localQ1polynomials are linearly independent on any open subset. If +a global combination vanishes onΩ, the coefficients of all such local polynomials +vanish; consequently every active coefficient is zero. Thus exact integral M is +positive definite. K is positive semidefinite by its integral-of-square form. +This proof concerns actual basis-integrated mass, not clipped midpoint dual mass, +and does not bound floating conditioning as a cut shrinks. Positive quadrature +must be polynomially exact and full-column rank or refuse uncertain arithmetic. + +Free-surface pressure is absolute: Bᵀ1 is generally the physical normal-pressure +boundary load, not zero. Do NOT remove one pressure per component. Exact rank(B) +for the chosen represented corpus must be checked before solve; if full row rank, +positive A makes KKT nonsingular. No inf-sup/mesh-uniform stability theorem is +assumed for this particular unstabilized staggeredQ1/P0pair. A rank deficiency or +failed conditioning/accuracy check is a method finding; do not delete pressure, +introduce a gauge or add stabilization after observation under this version. + +One reconstructed H1velocity supplies all physical fluxes and virtual work: + (B U)c=∫∂Q_c u_h·n, +including both actual grid-face apertures and the physical source boundary. +Shared interior-face integrals cancel with opposite normals. Basis continuity +ensures unique trace; use the same piecewise-polynomial basis, not RT0 mixed +with a different shear trace. The physical interface flux is retained separately; +a frozen instantaneous free surface need not have zero normal velocity. +Natural incompressibility requires total closed-cell flux0, not zero interface +flux or unchanged free-surface geometry in a later transport step. + +With r=M(U-U*)/dt+KU-Bᵀp-F, define E=.5UᵀMU. Symmetry and polarization give + E-E*+.5(U-U*)ᵀM(U-U*)+dt UᵀKU + =dt UᵀF+dt pᵀBU+dt Uᵀr. +The same physical trace gives UᵀF_boundary=∫Γg·u_h. Translations and rotations +are represented exactly; their divergence/strain vanish, so total linear/angular +momentum change comes only from actual F and residual. Consistent mass identifies +these discrete moments with integrals of the represented velocity, subject to +native integration error. These facts do not prove a nonlinear/free-moving water +step or physical impact response. Existing diagonal-mass Lean StokesWork cannot +be relabelled as a full-mass proof; either derive the finite Gram-mass identity +with explicit assumptions or keep this a reviewed mathematical derivation. + +Prospective discriminator: prescribe analytic affine divergence-free u=A*x+c, +constant p0 and sigma=-p0I+mu(A+Aᵀ), with u*=u and g=sigma*n on each original +physical edge. Then divsigma0 and the SAME analytic boundary load, integrated +independently from geometry/basis, should give KU-Bᵀp=F. Do not construct F from +matrix actions on the desired solution. Nonzero p0=2Pa and shear distinguish +wrong pressure gauge, load sign and a normal-only/pressure-only lifting. A rigid +field with zero natural traction distinguishes boundary drag/support truncation. +These patch tests plus exact rank/work/flux are prerequisite evidence, not full +MMS convergence or a pressure/stress accuracy envelope. + +First implementation boundary: CV1 assembles operators and physical trace only. It does not execute the proposed coupled timestep/KKT solve. The KKT equations above define the eventual mathematical target, not a delivered native step. Exact B rank, mass positivity/conditioning and affine traction identities are deciding prerequisite evidence. A 2Pa coefficient check of the affine nodal load is not labelled PDE pressure recovery. + +Planar boundary convention: this is the two-dimensional Stokes problem measured per Href=1m depth. GridGeometry countsZ=1 is indexing/unit bookkeeping; there is no dynamic uz and no physical free end-cap boundary or three-dimensional closed-volume claim. Γ contains only polygon edges times Href. Do not infer unprescribed 3D normal end-cap traction from these planar tests. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/plan.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/plan.md new file mode 100644 index 00000000..94d66145 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/plan.md @@ -0,0 +1,49 @@ +# Bounded cut/free-surface operator method selection + +Status: Accepted CV1 bounded reference; production not admitted. +Objective: resolve active-basis/physical-trace mathematical correspondence and +implement the smallest coherent operator/traction reference under the explicitly +authorized grid-first repair plan. Root canonical lifecycle/source admission +remains with parent; this local plan does not rewrite it. + +Current acceptance: CV1 accepted — independent method/source review and all +fixed native/independent operator gates pass; production acceptance remains partial. +Current phase: CV1 qualification complete. No active implementation slice. The +next proposed slice needs a prospective conditioning/coupled-solve decision. +Binding method/owner: decision.md and mathematics.md, numerical owner with +independent math/source review. Preserved observed facts: PR132 exactgeometry, +PR134 alignedalgebra; neither establishes this variant or PDE/water accuracy. + +Composed-design review: not-applicable to this bounded implementation. One private +fixture executable owns immutable geometry/basis/quadrature and its operators; +it adds no public interface, production state, provider, persistence lifecycle, +Session/UI composition or independently deployed mechanism. Separate read-only +oracle owns its evidence. Internal modules separate exactgeometry from basis and +operator observations within that owner; they do not create a runtime framework. +Root plan's product composition remains unchanged and separately owned. + +| Claim | Criterion and evidence | Environment/mode | Status | +|---|---|---|---| +| CV-M | Explicit coherent mass/divergence/strain/traction/support/rank decision | primary derivation + independent review | accepted CV1 | +| CV-G | Exact source/piece/basis positivity; no floors or halo guesses | native CPU + independent Fraction | accepted CV1 | +| CV-T | Every nodal traction and cell physicalflux map matches bulk operators | native + independent polynomial integration | accepted CV1 | +| CV-A | Fullmass positivity/rank, rigid/affine/work/momentum identities | native + independent exact/algebraic oracle | accepted CV1 | +| CV-C | Source/toolchain/custody, focused tests/Clippy, draft PR | source-bound CPU artifacts | accepted CV1 | + +CV1 write set/protocol: protocol.md; lifecycle Planned until method/source contract +review, Active for implementation, Verifying after sourcefreeze, Accepted only +when all mandatory fixed gates pass. Replan on an exactrank, nativegeometry, +quadrature/trace/conditioning counterexample; retain failure, no threshold change. +No coupled step or production variant is implemented by this slice. Further +pressure/velocity solve, cut-uniform inf-sup/conditioning, solidDirichlet lifting, +transport and disk/annulus/hydrostatic PDE gates remain separate and unqualified. + +No essential physical/user input missing for prescribed synthetic fixtures. +External experimental observations still block physical validation only. +See execution-ledger.md, issues.md, decision.md, primary-sources.md and protocol.md. + +CV1 result: qualification.md. Square fullmass condition6.533e11 is an explicit +next-solve concern; no threshold, basis or fixture was adapted. Native one-campaign +and independent exact/polynomial/rank/work gates pass at fixed1e-10. Parent owns +root lifecycle and source admission; this local closure authorizes no merge or +production provider. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/primary-sources.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/primary-sources.md new file mode 100644 index 00000000..5fa7d6c7 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/primary-sources.md @@ -0,0 +1,38 @@ +# Primary evidence and limits + +Read2026-10-20; remote source observations are versioned evidence, not native +Rheon qualification. No third-party source code is copied into Rheon. Downloaded +reference source is for private inspection outside the repository/evidence bundle. +Main2017author PDF is about18MB: web reader refused size, direct public retrieval +returned403. Do not claim its body was read. Accessible primary sources: + +1. Larionov/Batty/Bridson2017, supplemental propositions2.2/2.3, eqs5–18: + https://cs.uwaterloo.ca/~c2batty/papers/Larionov2017/supplemental.pdf + Full liquid stress is -pI+2muD; the free-surface functional yields natural + total traction. It does not prescribe independent p=0 at a viscous interface. +2. Author project and official repository: + https://elrnv.com/projects/variational-stokes-a-unified-pressure-viscosity-solver-for-accurate-viscous-liquids/ + https://github.com/elrnv/stokes-houdini/blob/1dbccfdb09d62f96b9d778f3febfad12c4e6e6f5/SIM/SIM_Stokes.C + Code inspection binds to this exact commit. Dual-volume inclusion/support + checks and minimum sampled weights are practical implementation choices, + not proof of Rheon's exact-cut conservation or physical applicability. +3. Batty/Bridson2011, author preprint arXiv1010.2832v2, sections4–8: + https://arxiv.org/pdf/1010.2832 + A predecessor, not the2017paper. It derives weighted variational difference + operators and nonhomogeneous boundary terms, and explains support-nullspace + elimination. Distinguish these choices from a consistent-basis Galerkin variant. +4. Burman/Claus/Massing2015, stabilized cut finite elements for three-field Stokes: + https://arxiv.org/pdf/1408.5165 + Their particular stabilization establishes cut-independent stability. It is + not a theorem for the proposed unstabilized staggeredQ1/P0pair; positivity of + geometry/mass alone supplies neither inf-sup nor small-cut conditioning. +5. NIST DLMF§3.5(v), Gauss quadrature: + https://dlmf.nist.gov/3.5#v + Positive Gaussian weights and polynomial exactness ground the selected + quadrature rule; source geometry/basis partition and native rounding still + need separate independent checks. + +Own derivations in the decision derive explicit finite operators, trace and work +from the declared basis/functional. These are mathematical proposals until the +independent method review and prospective fixed-corpus gates pass. No citation +is used as a substitute for source-bound native or physical verification. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/protocol.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/protocol.md new file mode 100644 index 00000000..cff8a942 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/protocol.md @@ -0,0 +1,96 @@ +# CV1 prospective deciding protocol, reference version1 + +Scope: operator/physical-trace builder only. No native coupled timestep/pressure +solve. Freeze method/protocol after independent review, native source after +source review, BEFORE selected tests/campaign. One fresh native CPU campaign. +Retain all refusals/failures; return to method selection without changing budgets. +Earlier Q1/Q2/P1 evidence and exactsource qualification remain immutable. + +Fixtures (rho1kg/m³,mu.1Pa*s,Href1m,Lref1m,Uref1m/s): +- rectangle (.17,.23),(.83,.23),(.83,.79),(.17,.79); domain[0,1]²,n4. +- old shifted square side.3,center(.537,.479),17degrees; domain[0,1]²,n8. +- inscribed64edge diskR.75,center0, vertices .75(cos(2pi*k/64),sin(...)); + domain[-1,1]²,n8. Polygon approximation distinct from ideal disk geometry. +- CCWcornertriangle(.81,.99),(.99,.81),(.99,.99); domain[-1,3]²,n4. + Its positive liquid lies in one primal[0,1]²cell with unsupported old left/bottom + hduals. New basis support and fullmass must retain required coefficients. +No feature/volume floor. Source must fit BOTH staggered nodal lattice hulls; +reject missing halo and finite sourceedges coincident with primalgrid planes. + +Reuse nativeGridGeometry IDs and immutablePolygon admission. Exact BigRational +clipping to every common halfcell box; positive rational fan triangles retained. +Empty/zero-measure rational cuts contribute nothing; unrepresentable positive +triangle/area or nonfinite arithmetic refuses, never becomes empty fluid. +Positive3x3Gauss-Legendre tensor quadrature after Duffy triangle map: nodes on[0,1] +(.5*(1±sqrt(3/5)),.5), weights(5/18,4/9,5/18). Physical Duffy map x=a+r*((1-s)*(b-a)+s*(c-a)), r,s in[0,1]; Jacobian=positivecross*r. +Mass has totaldegree4; Duffy maps each coordinate degree≤1in each parameter, +so mapped integrand degree≤5perparameter after Jacobian, quadrature exact in reals. +Each velocitycomponent's Q1knot rectangle and every pressurecell line belong to +common partition. Export source, actual piece bounds, rational clipped vertices/ +areas, triangle and quadrature fields, basis indices/values/derivatives, all active +associations, matrices and trace ledgers. Old hdual volume is observation only. + +For physical sourceedges and Cartesian gridface apertures, exact intersections +and split segments at EVERY common halfcell knot line before2pointGauss. On each +piece basis trace is degree≤2; flux and constant-stress nodal load exact in reals. +Every positive primalcell has a full basis-level physical divergence map from +its signed unique Cartesianface fluxes PLUS physicalsource boundary. Compare all +entries against B, not just a divergence-free solution or global cancellation. + +Required gates (all finite; fixed1e-10 unless stated): +1. Independent Fraction from exact represented input floats certifies ALL common + piece and active-basis positivity/indexing; zero mismatches. All positive + quadratureweights and active Mdiagonal>0; native/independent actual geometry + source area/first/second moments match scaled by h²,Lref at1e-10. No tangent + artifact or source-coordinate change hidden by a finite tolerance. +2. Partitionofunity and x/y affine reproduction in both componentbases at ALL + volume/trace quadrature points <=1e-10 in Lref scales. Negative halo/coincidence/ + orientation and unrepresentable-positive contracts reach exact refusals. +3. Independent exact polynomial integration of M/B/K and physical source/cartesian + trace coefficients over rational clipped regions, not reused Gauss code. Errors + normalized by fixed rho*Lref³, Lref² and mu*Lref respectively <=1e-10. All nodal + constant-stress trace maps match volume gradient maps / (Lref*Href)<=1e-10. + Everycell B entry matches signed physical trace / (h*Href)<=1e-10. +4. Independent exact rational rank(B)=ALL positivepressurecells for this traction + corpus. No graph-gauge assumption/SVDtolerance. Independent fullM Cholesky + positive, finite; report M and B condition numbers diagnostically, + no rank/threshold selected after data. Conditioning failure stops a native + step admission; no solve or diagonal-lumped substitute in CV1. +5. Exact representable constanttranslations and rotation(-y,x) have B/Kactions + <=1e-10 in fixed scales. Fullmass translation/angularmomentum maps agree with + independent basis integrals, not clipped-dual lumping. Existing aligned M/K + differ by declared quadrature, but affine strain/continuum units match. +6. Affineu=(.25x+.75y+.1, -.2x-.25y-.3)m/s using numericalx/Lref,y/Lref, + p0=2Pa, sigma=-p0I+mu(A+Aᵀ). Independently integrate F_i=∫Γφ_i·sigma*n from + original physicalsourceedges. EVERY nodal KU-Bᵀp0=F <=1e-10 in1Pa*Lref*Href. + Also p-only load -p0∫φ·n must equal -p0Bᵀ1 entrywise; wrong omittedpressure + load must differ at some node and satisfy F_omit-F_full=+p0Bᵀ1. Global force/ + torque/power can cancel even for wrong pressure; totals alone are invalid. + A coefficient projected onto Bᵀ1 may check2Pa, explicitly not PDEpressure + recovery. No F constructed as matrixaction on a desired solution. +7. FullM polarization and pressure/viscous work use frozen nodal coefficient + vectors (numerical x/Lref,y/Lref; multiply byUref): + a_x=1/4+x/2-y/8+xy/4; a_y=-1/8+x/4+y/2-xy/8; + b_x=-1/4+x²/8+y/4; b_y=1/2-x/8+y²/4. + Pressurevector q_c=(3/4+x_c/8-y_c/4)Pa at originalprimalcellcenters. + Compare polarization E(a)-E(b)+.5||a-b||²_M-aᵀM(a-b), + aᵀK b versus independently integrated2muD(ua):D(ub), and + qᵀB a versus(Bᵀq)ᵀa plus independently integrated q*div(ua). + All discrepancies <=1e-10 in fixed Eref=rho*Lref³Uref², + Dref=mu*Uref²*Href,Wref=1Pa*Lref²*Uref scales respectively; + Qref=Lref²Uref,Fref=1Pa*Lref². This is operator identity, not a timestep energy + acceptance. No new Lean/native/IEEE claim inferred from abstract algebra. + +Focused debug/release contracts: source/hull/coincidence/orientation refusal, +exact tangent vs positive cut and collapsed-positive refusal; polynomial/basis +partition/derivative and triangle quadrature moments; physical trace pressure +sign. StrictClippy/lockednativebuild. ONEreleasecampaignfreshroot and always-on +analyzer normal/-O/-OO. Independent oracle sources hashed before raw evaluation; +fullrank and polynomial/load/flux reconstruction required, source/binary/commands/ +raw/hash reports retained and saved privately. No fullsuite repetition for private +reference unless new production/dependency changes occur. Exactsharedwriteset: +new examples/grid_cut_variational_reference.rs plusprivate modules under +examples/grid_cut_variational_reference/, new testadapter, new q2-cut-method/*; +read-only reuse earlier geometry/exact modules, no edits to those source owners. + +Planar boundary convention: this is the two-dimensional Stokes problem measured per Href=1m depth. GridGeometry countsZ=1 is indexing/unit bookkeeping; there is no dynamic uz and no physical free end-cap boundary or three-dimensional closed-volume claim. Γ contains only polygon edges times Href. Do not infer unprescribed 3D normal end-cap traction from these planar tests. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/qualification.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/qualification.md new file mode 100644 index 00000000..89157915 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/qualification.md @@ -0,0 +1,77 @@ +# CV1 qualification record + +Current disposition: CV1 operator/physical-trace reference accepted for the fixed +four-fixture corpus. Native and independent exact reconstruction pass, as do +normal/-O/-OO evaluator contracts. No coupled pressure solve, timestep, uniform +cut stability, PDE convergence or production water admission. + +Frozen native source: 6d99e7794a6aa69f5886bb15cc662e40ea43cd40. +Binary SHA256: 377edcf4142104e44ef16d1d884d8d4c8a6df8e32ccdf8f1c18507e4871caf05. +Independent oracle freeze SHA256: +38d4b75a5bbcdc7991725aef091f5e2347f671fe0b19ce51a34e8a4ce1095d55. +The oracle was frozen at03:54:12UTC before the native campaign03:54:36UTC. +Native execution is release CPU on the retained Rust toolchain; independent +reconstruction uses Python Fraction/NumPy on CPU. + +The single fresh campaign exited0 and completed the immutable four cases: + +| Fixture | Active velocities | Positive pressures | Native maximum fixed discrepancy | Active with zero old dual | +|---|---:|---:|---:|---:| +| rectangle | 40 | 16 | 4.440892098500626e-15 | 16 | +| square-17 | 44 | 13 | 9.769962616701378e-15 | 18 | +| disk-64 | 104 | 36 | 6.750155989720952e-14 | 28 | +| corner-triangle | 8 | 1 | 1.110223024625157e-16 | 6 | + +All native fixed gates use the prospective1e-10 budget. The corner liquid is +strictly inside one primal cell: Cartesian aperture is zero, yet eight basis +restrictions have positive mass. Six of their old h-width dual volumes are zero. +This is evidence for the declared wider basis support, not an aperture/default +extension policy for the earlier finite-difference method. + +The full2Pa pressure-load coefficient is2Pa in every case to native rounding; +this is an affine nodal load discriminator, not PDE pressure recovery. Source +geometry, all positive halfcell pieces, quadrature, basis coefficients, matrices, +physical/grid traces, moments and nodal full/omitted-pressure loads are retained +as65 CSVfiles. No source, fixture, threshold or geometry was changed after data. + +Final frozen source passed10 debug and10 release contracts, strict Clippy, +formatting and locked release build. Earlier pre-driver5d352e0 receipts are +retained separately and were never used for a native campaign. The final driver +continues all immutable cases and retains each refusal before nonzero exit. + +Evidence owner: external `rheon-q2-cut-method-evidence`, including immutable +source archives, exact command/exit/time receipts, binary/source hashes, +prospectively frozen independent analyzer and the single native-v1 corpus. +Archive identity and custody are recorded in evidence-manifest.md. + +Independent exact reconstruction confirms all640 common partition pieces, +all196 active coefficients and all43,724 dense M/B/K/flux entries. Exact pressure +ranks are16/16,13/13,36/36,1/1 in protocol order, with no pressure gauge removed. +Both exact-integral-rounded and native fullmass Cholesky succeed. The largest +independent normalized discrepancy is7.849623728795052e-15 (disk viscous work). +All65 retained native CSV hashes remain unchanged after independent evaluation. + +| Fixture | Full M condition diagnostic | B condition diagnostic | Minimum native M diagonal | +|---|---:|---:|---:| +| rectangle | 4.021710993853908e4 | 4.976132295902294e1 | 1.960419555555552e-6 | +| square-17 | 6.533161483915378e11 | 8.114511387366868e3 | 1.701396215853621e-14 | +| disk-64 | 1.411514371285607e4 | 5.139203430543827e1 | 4.903299629761844e-6 | +| corner-triangle | 1.003311845462681e5 | 1 | 2.228228999999997e-5 | + +The square's conditioning is a material next-gate finding. Conditions were +prospective diagnostics, so no criterion changed after data. A new bounded +conditioning/solver protocol is required before any coupled-step qualification; +CV1 does not supply pressure/velocity recovery, a timestep or convergence proof. + +The frozen analyzer reconstructs all four cases in normal Python/-O/-OO with +byte-identical reports. Its45 subprocess checks include14 prospectively declared +malformed fixtures in all three modes; every mutant refuses intentionally and +creates no success artifact. Inputs are hashed before/after. This tests evaluator +custody only and executes no additional native campaign. + +The primary-source-supported continuum derivation and independent review resolve +the declared basis/support/physical-trace reference gate. They do not establish +the particular shiftedQ1/P0 pair's uniform inf-sup stability or oblique no-slip +lifting. Earlier aligned, geometry, particle and transport failures remain intact. +No new Lean theorem was needed for this builder; the existing diagonal-mass proof +is not relabelled as a full-mass/IEEE implementation proof. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-method/source-review.md b/docs/plans/fluid-accuracy-composition/q2-cut-method/source-review.md new file mode 100644 index 00000000..3bd14a35 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-method/source-review.md @@ -0,0 +1,38 @@ +# Independent pre-execution source review + +Numerical reviewer `/root/p1_numerical_review` inspected checkpoint fee53b2 +without running selected tests, native fixtures or numerical oracle evaluation. +The review found no mathematical blocker in M/B/K factors, symmetric-strain +engineering-shear weighting, stress/pressure signs, common partition, active +basis support, or physical/Cartesian trace ownership. Full consistent mass and +mu weighting of engineering shear were specifically checked. Every cell's B +includes Cartesian flux and physical source-boundary trace. + +The review preserves builder-only scope: no pressure solve, cut-uniform inf-sup, +conditioning, timestep or physical water admission follows from source inspection. +Primary-source research and method/protocol review preceded this implementation; +the actual native and independent deciding evidence remains pending. + +The final source delta uses existing GridGeometry face_counts/face_index/ +face_position directly for X/Y lattice nodes. No native coordinate arithmetic or +active-set criterion changes. The reviewer confirmed the delta against src/geometry.rs: X/Y counts, x-fastest +face IDs and XY positions match the reviewed lattice, with z=0 bookkeeping +unchanged. No source/protocol blocker remains to CV1 source freeze and focused +contracts. This is prospective experiment admission, not numerical acceptance. +Strict Clippy compile-only passes. The fixed campaign waits for oracle freeze. + +The separately authored independent Fraction/polynomial runner is the declared +always-on analyzer. It is retained with the external evidence archive, not an +absent repository script. Its sources must be frozen before the fixed campaign +is inspected/evaluated. The qualification record must name exact source hashes, +command recipes and results for normal Python and -O/-OO. No assert statement +may serve as an acceptance guard. + +Before the first campaign, driver review found that early return could omit +later immutable fixtures. The final driver now retains per-case refusal.txt, +continues all four cases and exits nonzero if any fail. Reviewer caught/corrected +the refusal CSV row to five fields and confirmed the final source. No numerical +operator, fixture or gate changed. Preliminary 5d352e0 contract/build receipts +remain separately retained; no campaign ran from that checkpoint. Final source +freeze and focused checks bind the corrected driver. The prospective analyzer's +summary-success literal was corrected to the native `passed` before any data. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/discovery.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/discovery.md new file mode 100644 index 00000000..cd190730 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/discovery.md @@ -0,0 +1,42 @@ +# CV2 bounded conditioning/coupled-solve discovery + +Explicit delegation authorizes continuing this gate after CV1, with original +fixtures/criteria and independent review. Currentmain718469b fetched safely; +isolated branch implementation/q2-cut-coupled-solve-20261020 at4f8bd22 (PR135). +CV1 observed square cond(M)=6.5331614839e11 remains immutable. It is neither +cond(A=M/dt+K) nor cond(KKT), and supplies no new pass/fail threshold. + +Intended outcome: smallest native static planar Stokes-substep solver reference +with actual solution-error evidence. No production provider, transport, UI, +recording, source-admission, generic inf-sup or PDE-convergence implementation. +No essential user/physical input missing for these prescribed synthetic problems. + +Exact write set BEFORE editing numerical implementation: NEW +examples/grid_cut_coupled_reference.rs, private modules under +examples/grid_cut_coupled_reference/, tests/grid_cut_coupled_reference_contract.rs, +and docs/plans/fluid-accuracy-composition/q2-cut-solve/*. Existing CV1 geometry, +operators, trace/export and all prior evidence are read-only. Parent owns root +plan lifecycle/source admission and all merges; no cleanup/rebase/merge. + +Alternatives compared on the same original finite equations: +A. Existing-style unscaled partial-pivot dense KKT: smallest direct comparator, + no normalized-block conditioning benefit; retain as diagnostic, not fallback. +B. SPD diagonal congruence, velocity Cholesky and scaled pressure HouseholderQR: + selected experiment; the earlier explicit-Gram idea was superseded BEFORE + implementation/data to avoid normal-matrix formation. Positive pivots only, no floors/deletions/gauges; + original-equation compensated residual refinement and back-transformation. +C. Full exact A/Schur whitening: ideal bounded spectrum in exact arithmetic, but + factor/assembly and back-transform errors remain; dense exact work not a + scalable production preconditioner. B supplies these factor actions already. +D. Higher precision alone: useful independent solve oracle, cannot repair rounded + operator/load perturbations. Do not mistake exported-block accuracy for exact + basis-integral or PDE accuracy. + +Native corpus/solver protocol remains prospective until independent review. +Standards0fc92a2: core/router; planning/discovery, implementation/verification/ +oracles/proportionality/commit/build, Rust profile and directly affected API/tooling +routes. Private single experiment owner adds no production composition boundary; +composed-design review is not-applicable. Independent read-only evaluator adds +needed deciding value: residual alone cannot decide actual solution accuracy. +A separate visual agent maintains provisional local method-map.html under the +new research directory; primary mathematical review has separate evidence owner. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/evidence-manifest.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/evidence-manifest.md new file mode 100644 index 00000000..56b4949a --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/evidence-manifest.md @@ -0,0 +1,56 @@ +# CV2 sealed evidence identity + +Draft PR: . +Branch: `implementation/q2-cut-coupled-solve-20261020`. +Dependency/base: CV1 PR135, `4f8bd22669efed62e84c0062ee1baec27393e830`. +Numerical source freeze: `b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. +Qualification/report snapshot: `d8575238464a5b3f2ea0465bf6da2f71d621413d`. +This later documentation-only identity closure is outside the sealed archive; +it changes no numerical source, input, protocol, oracle or campaign result. + +## Archive and retained Library identity + +- Local archive: `/workspace/rheon-q2-cut-solve-b0a9d52.zip`. +- Size: 10,060,236 bytes. +- Archive SHA256: `4c40b60923bac393498388f7702fde0a182a38c09d415d6c41d7d43f43560616`. +- Payload `MANIFEST.sha256` SHA256: `49afc06c449ff85dee378ea378d85262487be662dfe2524258c4110667fd6c50`. +- Library file: `libfile_a0f447ac54d881919df6a29415eeddd2`. +- Retained file: `file_0000000050208230a415327db9f8b5f9`, version 0. +- Library path: `/rheon-q2-cut-solve-b0a9d52.zip`. + +The archive contains 346 regular payloads and records 2,478 derived fixture +symlinks in `symlink-manifest.json`, without duplicating their immutable targets. +It retains all 178 native CSV files, including the 65 byte-identical CV1 operator +files; frozen source, protocol, commands, executable and toolchain receipts; +independent numerical references and all 45 evaluator checks; the unscaled +comparator's six square failures; and final qualification/review snapshots. +Archive CRC and every payload manifest entry were checked before retention. + +## Source and independent review bindings + +- Release executable SHA256: `c1f115f54e2867a2429b6d04305240ab242a1745b4c249e1e18c5512d3babfde`. +- Independent oracle freeze SHA256: `5382622591188efb6d9148077f8940d4269ac7717424631423b18169b47e0705`. +- Independent final review SHA256: `34a437a5018efe908cf49e3fdfe829fb118e290049b13bd9aaf81625d8b6c477`. +- Independent final manifest SHA256: `612781a988a84fe927e0b0dc2b99d3fa3aae2d747071c8cbb3a74a6077b6e4ec`. + +The sole native campaign began at `2026-10-20T04:23:38.329611+00:00` after source +and oracle freezes. All 24 cases passed the fixed `1e-10` gates. The largest +original-coordinate velocity error against independently integrated operators +was `1.861216501617988e-12`; maximum normalized pressure error was +`3.354808230044388e-13`. The original square mass conditioning remains about +`6.53e11`; scaling changes solve coordinates, without changing that mass. + +## Ownership and qualification limits + +The exact new write set is `examples/grid_cut_coupled_reference.rs`, +`examples/grid_cut_coupled_reference/{solver,experiment}.rs`, +`tests/grid_cut_coupled_reference_contract.rs`, and this documentation directory. +CV1, exact geometry and aligned reference dependencies are read-only and retain +their frozen hashes. Production, Session/recording, desktop composition, provider +and source-admission code are unchanged. No merge or branch cleanup is performed. + +This qualifies only the fixed static planar dense numerical reference. Generic +cut stability, PDE convergence, mesh refinement, moving geometry, transport/GCL, +solid Dirichlet lifting and production water remain unqualified. No GPU, native +UI, screenshot or physical-impact verification is claimed. Repository-lead +integration and merge coordination remain separate. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/execution-ledger.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/execution-ledger.md new file mode 100644 index 00000000..76dc11aa --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/execution-ledger.md @@ -0,0 +1,34 @@ +# CV2 execution ledger + +2026-10-20: new explicit delegation authorizes the next numerical conditioning +and coupled-solve gate. Fresh main718469b; isolated branch based on4f8bd22. +Original CV1 fixtures/condM/evidence preserved. Primary Netlib/SPD/QR and saddle +factorization reasoning separates residual, conditioning and forward error. +Independent reviewer admitted diagonal-congruence velocityCholesky + scaled +HouseholderQR pressure solve BEFORE implementation; exactly3original-full-target +compensated residual corrections, no formedGram solver/floors/gauges/fallback. +Full protocol fixed for source review; no selected new numerical tests/probes/ +native or highprecision solves executed yet. Prior CV1 data used only as observed +inputs/method context. Root production/source/UI owners remain disjoint. + +Native private implementation complete and strict compile-onlyClippy passes. +No selected tests/campaign/reference solves run. Raw exports bind originalfullA, +all factor coordinates, baseline/selected iteration0..3, physical work/flux and +source inputs. CSV lower KKT residual is+B*u; correction API takesg=-B*u. +Preexecutionsource review and independent higherprecision oracle preparation +are inprogress. Tiny matrix syntax/lints corrected before any selected execution. + +Independent full/delta source review admitted final finite norm, incremental +flushed-state custody and actual summary status repairs. Source freeze precedes +selected contracts; campaign waits full independent oracle freeze. No new +selected solve/probe/native/reference run has occurred. See source-review.md. + +Frozenb0a9d52 passed15debug/15releasecontracts,strictClippy,fmt,lockedreleasebuild. +Oracle5382622 froze before04:23:38UTC ONEreleaseCPU24solve campaign, exit0, +maxnative1.86129e-12. All65oldCV1operatorCSV byte-identical;178totalCSVretained. +Independent R1/R2/analytic/physical gates all24PASS atfixed1e-10; maxR1v1.0754e-16, +p1.9435e-16, R2v1.86122e-12,p3.35481e-13. Baselinefails6squarevelocitycases +despitepassingresidual. No source,criterion,inputgeometryorselectediterationchange. +All45interpreter/toolingchecksPASS: normal/O/OOcompletebyte-identical,13specific +malformedrefusals×3, residual-consistentwrongsolution×3failsactualaccuracygate. +All178CSVhashesunchanged. CV2boundedreferenceaccepted;noPDE/productionclaim. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/independent-review.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/independent-review.md new file mode 100644 index 00000000..999039bd --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/independent-review.md @@ -0,0 +1,140 @@ +# CV2 independent deciding review + +Disposition: **PASS for the fixed24 frozen-domain, planar CV1 coupled numerical +reference steps.** Both original-coordinate reference comparisons, analytic +patches, physical work/flux/momenta, factors and evaluator-custody gates pass at +the unchanged prospective1e-10 budget. This accepts the bounded CV2 information; +it does not admit a production solver/provider, PDE convergence, cut-uniform +pressure stability, changing free surface, solid boundary lifting, full3D water +or physical impact. No essential user/physical input is missing for this corpus. + +Native numerical source is +`b0a9d52cc266cb651c5e67c07ec5f4f82419db55`; copied release binary SHA256 is +`c1f115f54e2867a2429b6d04305240ab242a1745b4c249e1e18c5512d3babfde`. +The ONE owner-executed native campaign exited0. The independent oracle was +prospectively frozen as SHA256 +`5382622591188efb6d9148077f8940d4269ac7717424631423b18169b47e0705` before +new raw inspection/evaluation. The reviewer executed no native program, selected +pre-freeze numerical probe, fallback solve or candidate source edit. Read-only +source review caught/fixed, through the owner before freeze, nonfinite norm +masking, late-refusal state loss and premature operator-summary pass status. + +The selected method was fixed before data: diagonal velocity congruence, +lower-Cholesky approximate preconditioner, scaled thin Householder-QR pressure +factor, followed by exactly3 compensated original-full-target residual +corrections. Tiny native rounding asymmetry is retained in the actual target; +lower triangles define only approximate factors. No Gram normal matrix is used +for the pressure solve, no pressure gauge is removed and no positive basis +restriction is dropped. Original unscaled partial-pivot elimination is retained +only as a diagnostic comparator, never an automatic fallback. + +Independent Fraction source clipping and analytic polynomial/simplex integration +reconstruct all640 common regions,196 active velocity restrictions and66 +positive pressure rows. Exact B rank remains16/16,13/13,36/36,1/1 in protocol +order. All68 active restrictions with zero old h-width dual area remain present. +Source, geometry, basis/quadrature, moment/trace and operator CSVs match the +previous65-file CV1 corpus byte-for-byte. No volume/mass floor or hidden source +perturbation was introduced. All8 factor blocks and7860 saved baseline/selected +coefficient-state records were checked, including initial and corrections1..3. +All24 scenarios have complete source/input/factor/state/metric custody. + +The independent implementation imports no candidate code and uses neither its +Cholesky nor its QR for numerical truth. Two targets use mpmath1.3.0 LU at80 and +120decimal digits, reusing each factor for its3 scenario RHS: + +- R1 binds the actual represented exported full A/B/RHS values exactly, isolating + solver error for the rounded native system. +- R2 independently integrates the represented source/basis with the exact ratio + of native mu0.1, the same native rounded nodal u*, exact represented gradient + primitives and pressure2Pa before traction products/load/RHS rounding. It + exposes operator/load/RHS arithmetic sensitivity. + +Fresh160digit direct residual checks and80/120 agreement are numerical oracle +quality tests, not interval enclosures or rigorous IEEE forward-error certificates. +Maximum normalized agreement is2.6333569884e-78 (required<=1e-40). Maximum scaled +direct residual is1.1702305555e-80 at80digits and1.4118015997e-120 at120digits +(required<=1e-60). No inverse/interval certificate or additional native higher- +precision backend was introduced. + +| Selected final comparison | Maximum velocity/Uref | Maximum pressure/Pref | +|---|---:|---:| +| R1 exported-f64 numerical target | 1.075398839959988e-16 | 1.943511817682625e-16 | +| R2 independent exact-integral numerical target | 1.861216501617988e-12 | 3.354808230044388e-13 | + +Pressure normalization remains the prospective +rho*Uref*Lref/dt+mu*Uref/Lref, never an observed pressure magnitude. The largest +R1-R2 perturbation gap is1.8612243077e-12 velocity and3.3553711834e-13 pressure. +The final solve error for R1 is near f64 representation error, while the +remaining larger R2 difference is dominated by the retained arithmetic-data +perturbation. Both meet the original fixed component criterion. Separate exact +represented analytic targets have maxima1.8612611452e-12 velocity and +3.3548921217e-13 normalized pressure. The2Pa affine pressure is an actual coupled +patch result here, unlike CV1's projected load coefficient alone; it still is +not general pressure-PDE convergence or physical free-surface acceptance. + +The unscaled comparator fails the fixed component criterion in all6 square +cases (both dt values and all3 scenarios), and none of the other18 cases. Its +worst normalized velocity error is2.5492773239e-9 against R1 and2.5511340212e-9 +against R2. Its pressure maxima remain9.5866185929e-12/9.9221557113e-12. These +negative comparator results remain retained. The separate owner postprocessing +receipt reports its maximum original fixed-scale residual9.92930057184e-12; +that residual passing1e-10 does not make its velocity accurate to1e-10. + +Selected iteration0 already has maximum R1 velocity8.7383612213e-14 and pressure +1.5599417680e-14. Correction1 reaches the final R1 errors above; corrections2/3 +retain them. This is a reported history, not a post-data iteration selection: +all3 corrections remain mandatory under this version. There was no failure- +driven change of solver, precision, scaling, cut support or tolerance. + +For the square at dt.125/1s, raw A condition diagnostics are +5.5613665165e7/5.2426437431e7, scaled-A diagnostics9.8951540982/73.9158427930, +and scaled weighted-divergence Z diagnostics1.3900510251/1.4860568966. +The original full-M diagnostic remains recorded. Preserve its provenance: +previous CV1 reported6.5331614839e11 from exact-integral-rounded M, whereas this +CV2 report evaluates the unchanged native-f64 M and obtains6.5331738715e11. +Those are different rounded arrays/SVD estimates, not changed source, geometry, +support or mass: all65 native CSV hashes are identical. None of these finite +SVD diagnostics is a rigorous condition enclosure or uniform mesh/cut bound. + +Every declared physical and factor gate passes. Independent maximum normalized +momentum-row residual is1.0625028755e-16; continuity6.1824554991e-17; original +closed-cell flux2.4980018054e-16; independently integrated physical closed-cell +flux1.0901687884e-16; direct boundary-power discrepancy1.8041124150e-16; +linear/angular momentum discrepancy1.9258654814e-15. Absolute raw work balance +is<=1.3781414281e-15, residual-/mass-skew-corrected balance<=6.5963090572e-16, +and the absolute pressure/residual-work bound<=3.6783735088e-15. All use the +prospective units/scales and full physical source plus Cartesian traces. No +source-face flux alone was substituted for a cell's full divergence balance. + +All45 frozen evaluator-custody checks pass: + +- Complete normal Python, `-O` and `-OO` reconstructions succeed scientifically + and produce byte-identical full reports. +- 13 malformed fixtures each refuse in all3 modes at their prospectively named + guard, including empty/truncated/duplicate summaries, NaNs, incomplete/duplicate + factors/states/vectors/metrics, and wrong dt. Each has empty stdout and no + numerical success artifact. Generic incidental rejection was insufficient. +- A wrong coefficient is placed at least1e-3 from its R1 target, and ALL associated + original residual fields are updated consistently. Each interpreter still + produces the full24 negative numerical report and rejects the actual R1 + velocity gate (observed0.0009999999999999913), rather than relying on stale + residuals or a malformed record to fail. +- All178 original native CSV path hashes are unchanged before/after, including + the identical65-file prior operator corpus. Prospective Python/oracle hashes + remain unchanged and own acceptance guards have zero Assert AST nodes. + +`evaluation-v1/report.json` binds interpreter/custody outcomes, exact commands, +exits and before/after input hashes. `evaluation-v1/complete-normal-result/analysis.json` +contains all deciding errors, exact ranks, high-precision target coefficients, +iteration/baseline histories, physical fields and factor diagnostics. The other +complete modes are byte-identical. `postprocess.py/json` is explicitly post-run +aggregation of those saved values, not part of the frozen scientific oracle and +not another selected experiment. Changed mutant payloads/logs and original-input +symlink references are retained. `SHA256SUMS-final` binds all regular deliverables. + +The bounded conditioning/coupled-solve question is resolved positively for this +corpus. Next method/verification gates remain pressure approximation/stability +and PDE convergence for the chosen pair, plus any separately selected solid +boundary lifting and moving-interface transport/GCL. Current results authorize +no production promotion or assumption that those remaining gates already pass. +Parent/repository lead retain root lifecycle, source admission and merge custody. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/issues.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/issues.md new file mode 100644 index 00000000..bd77d703 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/issues.md @@ -0,0 +1,19 @@ +# CV2 findings + +- CS-I1: square fullM cond6.533e11 and minMii1.7014e-14 retained. Not equivalent + to A/KKT condition. Independent R1/R2 solution errors decide this gate. +- CS-I2: scaled/backward-stable solve cannot repair rounded-operator/load error. + Both exported-target and exact-integral-target accuracy required; no relabeling. +- CS-I3: explicit Schur Gram squares weighted-divergence conditioning. Before + coding/data select HouseholderQR; no afterdata fallback to QR/highprecision. +- CS-I4: native lowerfactor is only an approximate preconditioner when actualfull + A has rounding asymmetry; exact originalfull residual/refinement/oracle retained. +- CS-I5: pressure/cut stability, oblique wall lifting, transport and PDE accuracy + remain outside this static finite-corpus solver; no essential syntheticinputmissing. + +- CS-I6: observed baseline fails unchangedvelocitycriterion all6squaresteps, max + 2.55e-9 despite backwardresidual9.93e-12 passingbudget. Retainednegativeevidence. + Selectedmethodpasses bothR1/R2all24; no fallback/basis/support/criterion changes. +- CS-I7: selectedR1errors<=1.95e-16; R2v<=1.862e-12,p<=3.355e-13. Assembly/load/ + RHSgapdominatesremainingerror, belowfixed1e-10 here. Futurefinergrids/loads need + newconditioning/approximation evidence; currentresultisnotuniversalerrorenvelope. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/method.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/method.md new file mode 100644 index 00000000..7e6b53e8 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/method.md @@ -0,0 +1,57 @@ +# CV2 proposed algebraic method and primary reasoning + +The continuum/basis operators stay CV1. For dt>0 use +A=M/dt+K, C=[A,-B^T;-B,0], f=M u*/dt+F; solve A u-B^T p=f, B u=g=0. +Exact M SPD and full rowrank B imply an invertible saddle problem. Pressure is +absolute on the prescribed traction boundary. No closed-box gauge is introduced. + +Proposed selected bounded method B (binary64): +Dii=1/sqrt(Aii); lower Cholesky of DAD gives L. +Y=L^-1 D B^T, Ecc=1/||Y_col_c||_2; +thin Householder QR of Z=Y E gives upper R. H=Y^T Y is diagnostic only, +never formed or factored to compute the solution. These are invertible coordinate/factor operations, +not a mass/volume floor or modified boundary condition. Solve +v=L^-1 D f; p=E R^-1 R^-T E(g-Y^T v); +u=D L^-T(v+Yp). Thus the pressure sign follows the original saddle equations. +Three fixed refinement corrections use the original full A/B and RHS, with +compensated original residuals, the same factors and g_delta=-B u. + +Native M/K may have tiny rounding asymmetry. Lower triangles define the factor +preconditioner; the ORIGINAL full exported A remains the solve target/residual. +Do not silently symmetrize it or claim its exact equivalence to the ideal SPD +matrix. All factor entries/scales and iteration0..3 states are exported. Refuse +nonpositive/nonfinite Cholesky pivots/scales, zero/nonfinite QR pivots or arithmetic; no absolute tiny-pivot cutoff, +regularization, support removal, field clipping or success based on residual only. + +For exact ideal blocks, full A/Schur Riesz congruence produces [I,-Q^T;-Q,0] +with QQ^T=I. Its spectrum is1 and(1±sqrt5)/2; this is a finite-dimensional exact +algebra statement, not an IEEE condition guarantee or cut-uniform PDE theorem. +The observed unscaled mass condition remains recorded; report distinct A/KKT, +scaled A/Schur and factor diagnostics. Back-transformation can amplify errors. + +Primary sources read: +- Netlib LAPACK DPOSVX, https://www.netlib.org/lapack/double/dposvx.f: + SPD diagonal equilibration, Cholesky, refinement and original-coordinate output. +- Netlib LAPACK Users' Guide, https://www.netlib.org/lapack/lug/node80.html and + https://www.netlib.org/lapack/lug/node81.html: forward error vs backward error, + componentwise sensitivity and the scope of equilibrated condition estimates. +- Southworth/Oliver2020, https://arxiv.org/pdf/2001.00711, propositions1.1–1.3: + exact Schur factorization/invertibility and exact-arithmetic block-preconditioner + results. No claim those iteration bounds apply to this floating factor code. +No author source code is copied. Native factors use basic separately written +finite dense Cholesky/Householder QR/triangular solves, no new dependency or external backend. + +Mandatory independent comparisons distinguish: +1 actual native solution vs high-precision solution of EXPORTED rounded A/B/f; +2 native solution vs high-precision INDEPENDENT exact represented-source M/B/K/F; +3 difference between those references (assembly/load/RHS perturbation); +4 analytic rigid/affine patch and physical work/flux/momentum conditions. +All required solution gates retain1e-10; changing scale/basis does not excuse a +failed original-coordinate criterion. Negative findings return to method selection. + +Before implementation, independent review admitted the QR version. A formed +Schur normal matrix would square Y conditioning; QR supplies its triangular +factor without that formation. Netlib DGELS primary source +https://www.netlib.org/lapack/double/dgels.f documents QR/LQ-based fullrank solves. +QR signs are arbitrary: negative R diagonals are valid, zero/nonfinite refuse. +For a KKT residual correction [r_u;r_p], this method takes g=-r_p. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/plan.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/plan.md new file mode 100644 index 00000000..0c3b8499 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/plan.md @@ -0,0 +1,42 @@ +# CV2 conditioning and coupled-solve accuracy + +Status: Accepted bounded CV2 reference. Implementation authority: explicit +2026-10-20delegation continuing CV1. Rootcanonicalplan/sourceadmission owned by +parent, not rewritten here. Objective: qualify one static planar native coupled +solve against independent solution accuracy and physical work/boundary checks. +No production/UI/transport or generic PDE-convergence promise. + +Binding method: method.md QR variant, prospectively independently admitted. +Acceptance: protocol.md fixed24case CPU corpus, R1/R2 highprecision targets, +original-coordinate1e-10 solution/physical gates. Current acceptance: CV2 fixed24cases accepted; broader production accuracy +remains partial. Current phase: qualification complete. Next slice: none. +The completed slice is the diagonal/QR factored coupled solver, unscaled +diagnostic comparator and source-bound fixed physical/accuracy evidence. +Writeset: discovery.md; all files new. Read-only reuse CV1 operators and archives. + +Composed-design review: not-applicable. One private fixture executable owns one +immutable numerical problem and its solve experiment; it adds no production +module/interface/provider, persistence, deployed mechanism or lifecycle. Internal +solver details do not change D1 architecture or earlier numerical owners. The +separate independent oracle supplies deciding accuracy evidence not available +from residuals; no new permanent verifier framework is introduced. + +| Milestone | Criterion | Evidence kind/environment/mode | State | +|---|---|---|---| +| method | Primary-source supported unchanged-equation QR factor decision | independent review / not-applicable / manual | accepted for experiment | +| native | Focused contracts, factors, actual fixed solve campaign | focused/integration / CPU / automated | accepted CV2 | +| accuracy | R1/R2/analytic original-coordinate accuracy and physical work | independent exact/highprecision / CPU / automated | accepted CV2 | +| custody | Frozen source/oracle, all refusals, archive and draft PR | source-bound artifact / CPU / automated | accepted CV2 | + +No essential physical/user input missing for synthetic fixtures. Observed square +mass conditioning6.53e11 is preserved and not reinterpreted as A/KKT condition. +Replan on loss of positive factor/rank, original-coordinate solution error, +physical work/flux failure or source perturbation sensitivity. Do not adapt the +fixed criteria, basis, support, physical load or solver fallback after data. +Further mesh/cut regimes, PDE convergence and production remain unqualified. +See method.md, protocol.md, discovery.md, execution-ledger.md and issues.md. + +qualification.md records finalnative/R1/R2errors,45toolingchecks, unchanged178CSV +inputs, retainedbaseline6square failures andconditioning distinction. Selected +methodpasses everyfixed1e-10 gate. No source/threshold/fixture change after data. +Further PDE/transport/production stages require their own prospective admission. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/protocol.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/protocol.md new file mode 100644 index 00000000..81572b22 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/protocol.md @@ -0,0 +1,95 @@ +# CV2 prospective solver/reference protocol v1 + +Method selection: method.md, independently admitted QR variant before coding. +Original four CV1 source polygons, grids, all support/pressure rows, rho1 and +mu f64(.1) remain unchanged. Native in-process CV1 builder/traces/export reused +read-only; preserve all prior native-v1 evidence. No floors, clipping, gauges, +regularization or automatic fallback. Exactly one fresh release CPU campaign. +Source/protocol independent review and source/oracle freeze precede selected +contracts/campaign. No selected new numerical probe has run during discovery. + +Fixed24solves: protocol's four fixtures × dt(.125,1)s × three scenarios: +- unforced: nodal u*=CV1 work-vector b (its exact dyadic polynomial at MAC nodes), + g_traction=0, body force0; +- rigid: nodal u*=(.3-y,-.2+x)m/s, traction0; +- affine: nodal u*=CV1 affine(.25x+.75y+.1,-.2x-.25y-.3)m/s, + physical σn, σ=-2I+mu(Agrad+Agrad^T), on original polygon boundary. +No RHS is manufactured as KKT action on a desired answer. Full boundary load is +integrated using CV1 physical trace, not from KU-B^Tp. Affine omissions/reversed +pressure are detectable via retained entrywise CV1 load checks. + +Lref=Href=1m,Uref=1m/s; rho=1kg/m³. Pressure reference for every selected step is +Pref=rho*Uref*Lref/dt+mu*Uref/Lref, numerically1/dt+.1Pa; never measured from p. +All primitive f64 material, geometry, dt, gradient/c, actual rounded nodal u* +and generated σ coefficients are exported with the actual assembled A and f. +No confusion between Fraction(1,10) and Fraction.from_float(.1) is permitted. + +TargetR1: high-precision solve of exact represented values of the actual native +exported full A, B and RHS f. The zero pressure block and constraints are exact; +no gauge. Includes native A/RHS construction rounding by definition. +TargetR2: independently reconstructed exact represented-source basis integrals, +using exact represented MU=.1f64, dt, SAME native rounded nodal u*, exact analytic +σ from represented MU/gradient and2Pa before multiplication/integration rounding. +Compute exact M/dt+K and M u*/dt+F before high-precision conversion. Native σ/load/ +RHS rounding belongs to the R1/R2 perturbation gap. These are two discretizations +of arithmetic, not two physical models. Independently compare native coefficients +against BOTH targets; a precise solve of rounded blocks does not qualify R2. +Both high-precision targets solve at80 and120decimal digits and must agree +within1e-40 in Uref/Pref. Both highprecision direct scaled residuals must be<=1e-60. These are numerical +reference checks, not interval enclosures or rigorously certified forward-error +bounds. No separate approximate-inverse/interval proof is claimed. +Use independent LU (not native Cholesky/QR implementation). Exact CV1 support, +rank and fulloperator reconstruction remains required; native operator CSVs must +also match the original CV1 corpus byte-for-byte (same frozen implementation). + +Native selected method B: diagonal velocity congruence and lowerCholesky, +scaled thinHouseholder QR of weighted B^T; no explicit Gram in the solve. +Exactly3 compensated original-full-target residual refinements. Export initial +and all3corrected coefficient/residual states; never choose an iteration after +observing reference errors. Unscaled partial-pivot KKT method A is a diagnostic +comparator only. All its results/refusals are retained; no fallback selection. +Use original full matrices for all residuals, energy/work and solution oracles. + +Required finite fixed1e-10 gates for selected B, all24solves: +1 every velocity coefficient error/Uref and every pressure error/Pref vsR1 andR2; + rigid/affine velocity and absolutepressure analytic targets also<=1e-10. +2 actual row momentum residual r=M(u-u*)/dt+Ku-B^Tp-F divided by + sum_j|Mij|Uref/dt+sum_j|Kij|Uref+sum_c|Bci|Pref+|Fi| <=1e-10; + cell continuity |Bu|/(sum_i|Bci|Uref)<=1e-10. Also independently compare actual + closed-cell Cartesian+physical trace flux with Bu in h*Href*Uref scales. +3 E=.5u^T M u; Echar=.5sum_ijMij Uref²>0. Require raw + raw=E-Eold+.5delta^TMdelta+dt*u^TKu-dt*u^TF and residual-corrected + defect=raw-dt*p^TBu-dt*u^Tr, each ABSOLUTE VALUE/Echar<=1e-10. + Record massskew=.5u^T(M-M^T)u*; also require the absolute defect after + subtracting this explicit skew term/Echar<=1e-10 (no symmetrization). Plus + dt*(sum|p_c(Bu)c|+sum|u_i r_i|)/Echar<=1e-10. Unforced/rigid energy + <=Eold+1e-10Echar; dissipation>=-1e-10*mu*Uref²*Href. +4 physical boundary work direct trace integration vsu^TF /1W<=1e-10; + physical linear/angular momentum change minusdt*actual boundary resultant + <=1e-10 in rho*Lref³Uref and rho*Lref4Uref scales. Reconstruct these with + independent physical basis integrals and original source edge loads. +5 all native and reference values finite, every original active/pressure row + retained; independent exactrank full, factor identities/scales/source shape + consistent within fixed1e-10 norms: ||L L^T-lowersymmetric(DAD)||inf/ + ||lowersymmetric(DAD)||inf, ||Q R-Z||inf/||Z||inf, ||Q^T Q-I||inf. + Here Q=Z R^-1 reconstructed by triangular solves; no unstated scale floor. + Also require relative∞ identities scaled_A=DAD, LY=DB^T and Z=YE + (denominators respective exact right-side∞norms) and max-entry diagonal + normalization |Dii²Aii-1|, |Ecc*||Ycol||2-1| <=1e-10. No residual-only accuracy claim. + +Report separately originalM, A, KKT and equilibratedA/Z/Schur condition diagnostics, +iteration histories, baselineA/R1/R2 errors and R1-R2 gaps. No conditioning number +threshold is inferred from data. Preserve squarecondM6.5331614839e11 and minMii +1.7013962159e-14. Failure vsR2 is assembly/method sensitivity evidence even if +R1/residual pass. Stop admission/return to method selection with all failures. +No different scaling/QR/highprecision fallback or changed fixture after data. + +Focused debug/release contracts: positive/singular/nonfinite Cholesky; QR with +negative valid diagonals, exact rankdeficiency refusal, orthogonality/factor +identity; coupled nonzero-g sign and rowshape validation; invaliddt; compensated +residual cancellation. StrictClippy/format/lockedreleasebuild. Source/binary/ +command/outputs hash-bound. Independent always-on analyzer normal/-O/-OO with +small malformed/wrongsolution corpus whose guard reason identifies intended +failure; freeze before rawinspection/evaluation. No fullsuite for private-only +addition unless new production/dependency changes arise. No Lean proof reused +as a full-mass/IEEE solver claim. No PDE/hydrostatic/3D/production admission. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md new file mode 100644 index 00000000..91cfbe9f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md @@ -0,0 +1,84 @@ +# CV2 deciding qualification + +Disposition: CV2 fixed24case static coupled-solve reference ACCEPTED. All native, +independent R1/R2/analytic/physical and45interpreter/tooling checks pass. No production/PDE/evolving-surface admission. +No essential physical/user input is missing for the synthetic problems. + +Numerical source b0a9d52cc266cb651c5e67c07ec5f4f82419db55. +Binary SHA256 c1f115f54e2867a2429b6d04305240ab242a1745b4c249e1e18c5512d3babfde. +Prospective independent oracle freeze SHA256: +5382622591188efb6d9148077f8940d4269ac7717424631423b18169b47e0705. +The ONE fresh release CPU campaign started04:23:38UTC, exited0, and retained +all24steps and all baseline/selected0..3states. No solver fallback/iteration +selection or criteria/source change followed data. Existing CV1 builder/export +modules were reused read-only; all65 operator CSV files match prior evidence +byte-for-byte. The complete native corpus has178CSVfiles. + +| Fixture | Six native solves (dt.125/1 × unforced/rigid/affine) | Maximum fixed discrepancy | +|---|---|---:| +| rectangle | all pass | 2.109423746787797e-15 | +| square-17 | all pass | 1.861288900784075e-12 | +| disk-64 | all pass | 1.121325254871408e-14 | +| corner-triangle | all pass | 1.992850329202156e-13 | + +Native fixed budget1e-10. Operator/factor shapes, original momentum/continuity, +physical closed-cell flux, raw/corrected/skew work, residual-work bound, +unforced dissipation/energy, boundary work, physical linear/angular momentum, +rigid and absolute2Pa affine coefficients all pass. These native checks alone +do not establish original-coordinate solution accuracy versus either reference. +All15debug/15release contracts, strictClippy, formatting, lockedreleasebuild pass. + +The square's original fullmass condition6.5331614839e11 is unchanged, with no +basis/support/pressure removal or mass floor. It must be distinguished from A, +KKT and transformed factor conditioning. Independent exact-integral R2 and +exported-target R1 use80/120digit LU,160digit fresh residual checks and fixed +agreement/residual requirements. They are numerical references, not certified +interval enclosures. Sealed custody and Library identity are recorded in evidence-manifest.md. + +Independent complete reconstruction in normal Python/-O/-OO: every selected-final coefficient passes +both original-coordinate references. Max normalized errors: + +| Reference | Velocity/Uref | Pressure/Pref | +|---|---:|---:| +| R1 exact exported f64 target | 1.075398839959988e-16 | 1.943511817682625e-16 | +| R2 independent exact integral target | 1.861216501617988e-12 | 3.354808230044388e-13 | + +The R1/R2 perturbation gaps are1.861224307747211e-12 velocity and +3.355371183394384e-13 pressure. The remaining error is principally assembly/load/ +RHS representation, not linear-solver arithmetic. All are within the fixed1e-10 +gates, without changing basis, coefficients, pressure rows or physical inputs. + +The unscaled comparator fails velocity accuracy on all six square cases. Its +worst R1 velocity error is2.549277323943581e-9 (R2:2.551134021238696e-9), while +its fixed-scale original-equation residual is only9.92930057184e-12 and passes +the residual budget. This is retained negative evidence, not a fallback method. +Selected iteration0 already has R1 velocity error<=8.738361221325274e-14; +correction1 reaches final R1 roundoff. All3corrections remain mandatory; the +protocol did not choose an iteration after observing reference accuracy. + +For square dt.125/1, unscaled A condition is5.5613665e7/5.2426437e7 and scaledA +condition9.8951541/73.9158428; weighted-divergence Z condition1.3900510/1.4860569. +These are finite SVD diagnostics, not rigorous enclosures or universal cut bounds. +The preserved CV1 condM6.533161484e11 came from exact-integral-rounded M; the +current nativef64M diagnostic is6.533173871e11. The65 native operator CSV files +are identical: this difference does not indicate changed geometry/support/mass. + +Reference80/120digit agreement<=2.634e-78 and direct residual<=1.171e-80 at80digits +(<=1.412e-120 at120digits), far within prospective1e-40/1e-60 requirements. +No numerical-reference certificate or PDE-convergence inference is made. + +All45 frozen independent tooling checks pass: complete normal/-O/-OO reports +are byte-identical and all24scientific cases pass;13malformed fixtures in each +mode refuse at their specifically declared guard. One deliberately wrong final +velocity coefficient with UPDATED internally consistent residuals is tested in +each mode; all three runs retain full24case analyses and fail actual R1 velocity +accuracy. Thus neither parser consistency nor a reported residual substitutes +for solution accuracy. All178native CSV hashes remain unchanged after evaluation. + +CV2 demonstrates an accurate bounded dense solve for these fixed source geometries, +dt values, physical loads and fields, with actual absolute-pressure patch recovery +and fullmass work/momentum/flux consistency. It does not establish generic cut +inf-sup/conditioning, finer-mesh accuracy, hydrostatics/MMS convergence, moving +geometry/transport/GCL, solid Dirichlet lifting or production water. No essential +synthetic input remains unresolved. Root source admission/integration is owned +by the repository lead; this artifact authorizes no merge or cleanup. diff --git a/docs/plans/fluid-accuracy-composition/q2-cut-solve/source-review.md b/docs/plans/fluid-accuracy-composition/q2-cut-solve/source-review.md new file mode 100644 index 00000000..88e9f844 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-cut-solve/source-review.md @@ -0,0 +1,28 @@ +# CV2 prospective independent review + +Reviewer /root/p1_numerical_review admitted the diagonal-congruence/lowerCholesky/ +pressureHouseholderQR method before implementation. The unscaled KKT baseline +is diagnostic only. R1/R2 primitive binding, fixed1e-10 component/work/physical +criteria and80/120digit numerical-reference checks were reviewed before data. +No rigorousinterval/IEEE reference certificate is claimed; extra inverseinterval +machinery was considered and notselected because the claim is a bounded +independent numerical comparison, not a formal forward-error enclosure. + +Full sourcec67b127 review confirmed equations, QR/pressure signs and correction +g=-Bu. It found/corrected two prefreeze blockers: nonfinite matrix norm entries +or overflowing row sums could hide undermax; late correction errors could lose +prior states when history was accumulated before export. Final source checks +each entry/row sum, exports every successful state via a flushing observer and +retains earlier observations on later refusal. Focused contracts cover both. +Operator summary status now follows actual gate comparison. The exported full KKT residual b-Cz is(f-Au+B^Tp,+Bu); correctiong=-Bu +is explicit. +No selected test, campaign or highprecision solve preceded these corrections. + +Protocol now states absolute raw/corrected work defects and mass-skew term, fixed +relative∞factor/scale identities, and no posthociterationselection. Independent +analyzer retains legitimate numerical-failure diagnostics and distinguishes +malformed input, so a source perturbation failure is preserved rather than hidden +behind parsing. Source/oracle freeze and actual deciding evidence follow review. + +Independent final delta review found no remaining source/method blocker. Freeze +and focused contracts are admitted; the campaign waits fulloraclefreeze. diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/admission.md b/docs/plans/fluid-accuracy-composition/q2-exact/admission.md new file mode 100644 index 00000000..5c1a991e --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/admission.md @@ -0,0 +1,45 @@ +# Q2 exact represented-source face boundary — admission + +User directs bounded remediation of five positive apertures on mathematically +zero-measure represented-source faces, then the next dependency-ready Q2 slice. +Preserve PR126/127/130 and their exact-source archives, all P1 failures, Q1 n64 +quadrature exhaustion and three Full-control refusals. No arbitrary area/volume +floor or tolerance relaxation. Independent mathematical/source review before +selected numerical evaluation; retain any failure and stop at correctness gates. + +Isolated branch implementation/q2-exact-face-boundary-20261020, /workspace/Rheon-q2-exact, +basec2fbbea (PR130). Fresh origin/main bc2f472. Exact exclusive source write set: +Cargo.toml/Cargo.lock development-only rational requirements; existing private +examples/grid_geometry_reference.rs and examples/grid_geometry_reference/{geometry, +diagnostics}.rs; new examples/grid_geometry_reference/exact.rs; focused tests +through the existing private example adapter; this new q2-exact/ owner. No Session, +recording/composition/UI/provider/production operator, shared canonical lifecycle, +old q1/q2/P1 report/evidence, proof or unrelated source changes. Shared Cargo write +notice supplied to parent before editing; lead01a13f94-5c63-7243-abfc-f5474da1902d +owns source-admission inventory/dependency/CI integration through parent. Separate +draft dependent PR, no unilateral merge/rebase/cleanup. + +Standards0fc92a2 core/router and prior numerical/implementation/verification/Rust/ +architecture/contracts/docs/commit apply; newly routed Dependencies, Rust Dependency +and Build were read. No AGENTS.md found. This remains a private CPU reference, +not a third production family or general mesh-water admission. + +Dependency decision: exact rational predicates/constructions on finite represented +binary64 inputs require arbitrary integers/rationals, not rounded intersection +endpoints. Compare (a) in-house expansion/BigInt arithmetic, needing a maintained +exact conversion/overflow/underflow/rounding surface; (b) CGAL exact kernel, suitable +semantics but C++/FFI/native build/deployment surface unnecessary for this Rust +reference; (c) pinned num-rational0.4.2 BigRational plus num-traits0.2.19 for numeric +conversion. Select(c), dev-only native example/test ownership, Apache2/MIT compatible +upstream licensing, rustc>=1.60 compatible with pinned1.92. Cargo resolves only this +missing requirement and locks checksums; production dependencies unchanged. Exact +rational unit/independent Fraction tests prove consumed capability, not mere import. +No independent security/performance or supported-WASM claim follows. Owner updates/ +removes these requirements with this reference; future production adoption needs +its own dependency/resource/target admission. + +Primary grounding (read2026-10-20): +- https://doc.cgal.org/latest/Kernel_23/classCGAL_1_1Exact__predicates__exact__constructions__kernel.html +- https://docs.rs/num-rational/0.4.2/num_rational/type.BigRational.html +- https://github.com/rust-num/num-rational/blob/num-rational-0.4.2/README.md +- https://github.com/rust-num/num-rational/blob/num-rational-0.4.2/src/lib.rs diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/analyze.py b/docs/plans/fluid-accuracy-composition/q2-exact/analyze.py new file mode 100644 index 00000000..0da50f12 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/analyze.py @@ -0,0 +1,74 @@ +"""Always-on structural/corpus gates; independent exact arithmetic is separate.""" +import csv +import json +import math +import pathlib +import struct +import subprocess +import sys + +def require(condition, message): + if not condition: + raise SystemExit('v3 input/gate refused: ' + message) + +def rows(path): + with path.open() as stream: + return list(csv.DictReader(stream)) + +def number(bits): + return struct.unpack('>d', struct.pack('>Q', int(bits)))[0] + +root = pathlib.Path(sys.argv[1]) +old = pathlib.Path(sys.argv[2]) +finite = json.loads(subprocess.check_output([sys.executable, str(pathlib.Path(__file__).parent.parent/'q2/analyze.py'), str(root)])) +require(finite['native_geometry_candidate'], 'retained finite integration gates') +counts = dict(faces=0, regions=0, positive_faces=0) +regressions = [('disk',32,1,143), ('disk',64,0,2088), ('disk',128,0,8272), ('disk',128,1,2111), ('disk',128,1,14400)] +regression_results = [] +for case in ['disk','square-0','square-17','square-31']: + for n in ([32,64,128] if case == 'disk' else [16,32,64]): + tag = f'{case}-n{n}' + require((root/f'inputs-{tag}.csv').read_bytes() == (old/f'inputs-{tag}.csv').read_bytes(), tag+' unchanged represented inputs') + a,b = [root/f'{tag}-mu{mu}' for mu in ['0.1','0.001002']] + for filename in ['source.csv','moments.csv','faces.csv','topology.csv','domains.csv']: + require((a/filename).read_bytes()==(b/filename).read_bytes(),tag+' mu-independent '+filename) + moments = rows(a/'moments.csv'); domains=rows(a/'domains.csv'); topology=rows(a/'topology.csv'); faces=rows(a/'faces.csv') + expected = {(kind,i) for kind,size in [('cell',n*n),('dual-x',n*(n+1)),('dual-y',n*(n+1)),('shear',(n+1)**2)] for i in range(size)} + def keyed(data): + result={(r['kind'],int(r['index'])):r for r in data} + require(len(result)==len(data) and set(result)==expected,tag+' region association cardinality') + return result + mm,dd=keyed(moments),keyed(domains) + for key,d in dd.items(): + value=number(d['volume_bits']) + require(math.isfinite(value) and value>=0 and value==float(mm[key]['volume']),tag+' moment/domain volume identity') + for axis in ['x','y']: + lo,hi=[number(d[f'{bound}_{axis}_bits']) for bound in ['lo','hi']] + require(math.isfinite(lo) and math.isfinite(hi) and lo0 if positive else length==0),tag+' represented face length') + dual=number(dd[('dual-x' if axis==0 else 'dual-y',index)]['volume_bits']) + require(dual==float(t['dual_volume']),tag+' dual identity') + if positive: + require(length==float(ff[(axis,index)]['area']) and dual>0,tag+' positive face/dual') + normal,tangent=(index%(n+1),index//(n+1)) if axis==0 else (index//n,index%n) + require(00 for i in adjacent),tag+' positive face needs positive adjacent regions') + if (case,n,axis,index) in regressions: + require(not positive,tag+' retained artifact corrected') + regression_results.append(dict(case=case,n=n,axis=axis,index=index,status=t['status'],length=length)) + counts['faces']+=len(tt);counts['regions']+=len(dd);counts['positive_faces']+=len(ff) +require(counts['faces']==76384 and counts['regions']==152780, 'complete fixed corpus') +require(len(regression_results)==5, 'all retained artifacts') +print(json.dumps(dict(native_structural_gate=True,counts=counts,regressions=regression_results,finite=finite,independent_exact_face_and_region_gate='REQUIRED',production_topology_or_coupled_water_admitted=False),indent=2,allow_nan=False)) diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/independent-review.md b/docs/plans/fluid-accuracy-composition/q2-exact/independent-review.md new file mode 100644 index 00000000..5e15a97d --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/independent-review.md @@ -0,0 +1,27 @@ +# Independent Q2 geometry v3 disposition + +PASS for the declared fixed-corpus private geometry prerequisite, source `0f4e7e0944a7e0302690a0f71c08c21fe345cc89`. No remaining blocker to a separately reviewed tiny aligned coupled-algebra reference. This is not general cut-topology, velocity-extension, coupled PDE or production-water admission. + +Prospective source/math review preceded selected computation. Native exact face construction uses rational source-edge crossings; the independent exact oracle instead restricts source halfplanes to each represented coordinate line. Both consume exact binary64 input values, not rationals of decimal strings. The region oracle clips by actual represented horizontal slab bounds, then uses strict X-projection overlap; full-dimensional convexity justifies the positive-area equivalence. The actual clipping bounds and numerical area are owned together and exported as bits. Native source admission still includes conservative floating rejection before exact convexity validation. A truly positive exact face that cannot become a finite positive represented segment is refused, rather than deleted. + +The independent oracle sources were hashed prospectively in `oracle-freeze.json`, before evaluation of the new raw data. Both frozen programs completed once with exit 0 and empty stderr. They import/execute no candidate, native executable or numerical evaluator. The separate native CPU campaign was performed by the implementation owner; this review neither reran it nor changed source or data. Reviewer source hashes remain unchanged. + +Exact results across twelve represented polygons, with byte-identical geometry exports at both viscosity scales: + +- All 76,384 unique face queries and exact rational endpoint witnesses agree: 54,050 empty, 18 point, 22,316 positive. No mismatch. +- All 152,780 owned boxes agree in positive-area presence: 37,632 primal cells, 38,192 X duals, 38,192 Y duals, 38,764 shear regions. No mismatch. Positive counts are respectively 11,455, 11,538, 11,510 and 11,523. +- All positive faces have positive adjacent primal cells and velocity duals; no containing-grid boundary aperture is positive in this corpus. +- All five historical artifacts are exact point contacts with zero represented length and no segment: disk32 Y143; disk64 X2088; disk128 X8272/Y2111/Y14400. Their rational point witnesses equal the preserved exact source-bound audit. +- All twelve input coordinate files equal preserved v2 bytes. A separate read-only comparison confirms all twelve source and twelve moment tables are byte-identical to v2. The only face-presence changes are removal of the five historical spurious segments; no positive face was added. + +The separate finite reconstruction retains the prior positive vertical-slice integration of polygon moments and independent polynomial segment/ledger formulas. It reads actual owned domain bounds rather than substituting ideal-grid boxes. All twelve geometries and twenty-four viscosity cases pass the original finite budgets. Maximum moment discrepancy normalized by h² is `7.882583474838611e-15`; maximum face endpoint/interval discrepancy normalized by h is `7.105427357601002e-15`, both below `1e-10`. All 5,930 physical-boundary rows and 75,264 cell-ledger rows are reconstructed with original source-edge IDs, orientations, pressure, full traction and omitted-pressure control. Maximum scaled field/summary reconstruction discrepancy is `1.28882759914001e-12`; the pressure negative-control identity discrepancy is `1.2647823081112785e-12`. These remain below the fixed `1e-10` budgets. Nine floating interval-oracle tangency ambiguities are resolved by exact arithmetic; none is a native classification defect. + +Recorded native maxima also remain below the unchanged `1e-10` criteria: normal closure `7.105427357601002e-15`, first-moment closure `3.1441516057384433e-13`, cubic flux `1.1945999744966684e-13`, solenoidal flux `5.329070518200751e-13`, full traction `6.293750243191454e-13`, face mismatch `1.765254609153999e-14`, dual-volume defect `1.884820452646334e-15`. Disk finest area relative error is `6.27491367310995e-6`; radial second-moment error is `1.2549780005421951e-5`; cubic-flux error is `1.254978010034602e-5`. Both force components/viscosities remain within approximately `6.274915e-6` relative error. Pair orders remain approximately 2, satisfying unchanged finest `1e-4` and order `1.8..2.2` criteria. This is polygon approximation/integration evidence, not velocity/pressure MMS convergence. + +There remain 732 zero-aperture/positive-dual observations: 381 X and 351 Y. Their geometry is consistent with the exact oracle; assigning active velocities or extensions to these regions remains a separate decision. Region positivity does not certify arbitrary polygon boundary-piece topology, robust general continuum geometry, 3D mesh handling, small-cut conditioning, exterior obstacles or free surfaces. The bounded successful source has no arbitrary volume floor, tolerance relaxation, mass repair or threshold change. Native rational dependencies remain private development requirements, with no production-target or performance qualification inferred here. + +Prior negative findings remain authoritative: stopped P1 production promotion, Q1 n64 source-quadrature exhaustion and three Full-control refusals, Q2 v1 construction refusal and the preserved v2 artifacts. This v3 result repairs the stated fixed-corpus face defect; it does not rewrite earlier archives or make Q1 transport pass. + +Proceed only to the announced separate tiny aligned M/B/S/W reference with its own prospective source/protocol review and independent block/direct-solution/work reconstruction. Existing `AlignedStrain`/`StaticObstacleGeometry` provide a bounded aligned owner. The old `aligned_stokes` split viscosity/projection step is not the unified coupled solve. General cut/free-surface DOFs and MMS/hydrostatic qualification remain unresolved and must stop dependent progression when reached. Parent/repository lead owns integration and merges. + +Evidence: `exact-results/summary.json`, `finite-results/summary.json`, `execution-and-counts.json`, `preserved-comparison.json`, both frozen sources, captured logs, and `SHA256SUMS`. Scripts accept explicit input/output paths for replay without modifying the preserved inputs. All raw CSV input hashes are retained in the oracle reports. diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/manifest.json b/docs/plans/fluid-accuracy-composition/q2-exact/manifest.json new file mode 100644 index 00000000..e49e426e --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/manifest.json @@ -0,0 +1,30 @@ +{ + "numerical_source_commit": "0f4e7e0944a7e0302690a0f71c08c21fe345cc89", + "binary_sha256": "336842c96979bcf38fa825410b3f19eb8f67cf428141cbaef1e4c8f6476e5473", + "source_archive_sha256": "388d0a5be1b57c28bdc03d0eecaf80e51d7eceff130f8fd1906a72e3f80034da", + "native_exit_code": 0, + "cases": 24, + "selected_debug_tests": 9, + "selected_release_tests": 9, + "independent_scripts": { + "reconstruct_finite.py": "b0d6b21983274a50577ce718d24fa83b8fc46e7d3d389c58ee9b1a9eee936bda", + "exact_oracle.py": "23b50794379fa0abfbd358e5d036f8feba014b5651169043c1c00de43dc9cc9b" + }, + "independent_results": { + "independent/exact-results/summary.json": "ec4b8923c1332c53e779fb9de72dedcbd2b7a902d76562925c9ab65f8d008d4d", + "independent/finite-results/summary.json": "8ac1f66d8188cb6dc0cde3a320a5f40c6a19bf59c4599797319ccbcb684c9b60" + }, + "evaluator_sha256": "6c0920751843469fbc7657b5f8339540fa2e5ec0f98992591426a8360bdb295c", + "custody": "Archive created once, CRC checked, saved privately to Library; local identity persisted successfully.", + "archive": { + "path": "/workspace/rheon-q2-exact-geometry-0f4e7e0.zip", + "bytes": 15077327, + "sha256": "e0bb0e691ca27feec7991abe980f94013260ad12cda93daf904ba7c7fa9ecc4d", + "library": { + "library_file_id": "libfile_b04abe9965fc8191843341e158250f25", + "file_id": "file_0000000076548230a06e1715a89afc64", + "path": "/rheon-q2-exact-geometry-0f4e7e0.zip" + } + }, + "independent_review_sha256": "fb77647e717bc30cdafdd9a6446f731474c707e1aa94457028870033105a0ed5" +} diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/mathematics.md b/docs/plans/fluid-accuracy-composition/q2-exact/mathematics.md new file mode 100644 index 00000000..bee5ea33 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/mathematics.md @@ -0,0 +1,49 @@ +# Reference v3: exact face dimension for represented sources + +Scope is the finite binary64 input polygon, not an ideal trigonometric disk or an +arbitrary continuum boundary. Map each coordinate to its exact dyadic rational. +For a full-dimensional, convex CCW polygon P, its intersection with a coordinate +line is empty, one point, or a closed interval. Every extremum is a source vertex +on the line or a strict edge crossing. Construct those crossings in rational +arithmetic and take minimum/maximum tangential coordinates; intersect this line +section with the exact represented face span. Strict ordering distinguishes +positive length from zero measure. No magnitude threshold is needed. + +The native construction enumerates edge crossings; independent verification uses +all source halfplanes restricted to the line. These are equivalent for an +accepted convex CCW source, with different arithmetic paths. Rational endpoint +witnesses are exported without decimal rounding. Segment endpoints used for +floating integration are converted only after positive exact length is established. +If two endpoints collapse or cannot form a positive finite binary64 length, refuse +construction rather than discard the positive interval. This is a conservative +representation refusal, not a zero-measure classification. The old floating +source orientation/moment checks still precede exact convexity validation and may +conservatively refuse an otherwise valid represented source. No generic exact +source-admission or arbitrary topology claim follows. + +For the independent region positivity check, let R=[lx,ux]x[ly,uy] be the actual +represented nondegenerate clipping box. A full-dimensional convex P intersects +its open horizontal slab with nonempty interior iff +max(ly,min_y(P)) < min(uy,max_y(P)). Clip P exactly by the two closed horizontal +halfplanes to obtain Y. Subject to the strict Y overlap, area(P intersect R)>0 iff +max(lx,min_x(Y)) < min(ux,max_x(Y)). For a convex set with interior, the projection +of its interior is the interior of its projection. Both strict tests are necessary; +a point or line contact has zero area. Cache the exact slab X bounds per actual Y +bounds. This certifies only positivity, not the numerical first/second moments. +Those retain the prior independent positive vertical-integration oracle and fixed +finite budgets. Export box bounds alongside their moments as an owned Region; +do not reconstruct rounded dual centers using ideal rational grid coordinates. + +Positive interior-face intervals must have two positive adjacent primal regions +and a positive velocity dual in this contained, noncoincident fixed corpus. +Boundary faces must have no positive aperture. These are corpus consistency +checks; they do not select active DOFs, velocity extensions, nullspaces or coupled +operators. A zero aperture can still have a positive dual region. + +Primary dependency sources: num-rational 0.4.2's official `from_float` implementation +uses integer mantissa/exponent decoding, and BigRational uses arbitrary precision +integers. https://github.com/rust-num/num-rational/blob/num-rational-0.4.2/src/lib.rs +https://docs.rs/num-rational/0.4.2/num_rational/type.BigRational.html +CGAL's exact-constructions kernel is an established alternative, but its C++/FFI +integration is outside this bounded private Rust reference. +https://doc.cgal.org/latest/Kernel_23/classCGAL_1_1Exact__predicates__exact__constructions__kernel.html diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/protocol.md b/docs/plans/fluid-accuracy-composition/q2-exact/protocol.md new file mode 100644 index 00000000..1532361b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/protocol.md @@ -0,0 +1,53 @@ +# Prospective reference v3 qualification + +Freeze source and this protocol after independent review, before selected tests +or native execution. One native release CPU campaign in a fresh output directory. +No changes to Q1 n64 exhaustion/three Full refusals, Q2 v1 refusal/v2 results, +PR126/127/130, their evaluators, source manifests, or archives. No tolerance +relaxation. Failure returns to method selection with retained outputs. + +Use all 24 prior Q2 v2 cases: disk n32/64/128 and shifted square 0/17/31 degrees +n16/32/64, each mu=.1/.001002. Source input binary64 coordinates must equal v2 +bitwise for all twelve geometries. Retain input exports before source admission. +Geometry, moments, physical boundary, fixed 1e-10 integration budgets, SI scales, +pressure negative control and 1e-4 disk finest/1.8..2.2 order gates in q2/protocol.md +remain unchanged. Use PR130's always-on evaluator with its exact predicates. + +Additional gates, all mandatory, zero mismatch: +1. Check all 76,384 unique face queries (both mu exports identical). Independent + Python Fraction from exact float/as_integer_ratio, never Fraction(decimal text), + source-halfplane line intersection and span clipping. Native status AND rational + endpoint witnesses must equal the oracle. Query bits must equal actual face + coordinates/span. Empty and point records have no floating positive segment; + positive exact records must have finite positive segments with the retained + finite endpoint/flux budget. Do not infer exactness from a small error norm. +2. All five retained v2 artifacts (disk32 Y143; disk64 X2088; disk128 X8272, + Y2111,Y14400) must be point/empty, with no positive segment. Retain their old + native positive lengths and independent source-bound classifications unchanged. +3. All 152,780 unique cell/Xdual/Ydual/shear associations must match independent + exact source/actual-box positive-area masks; numerical volume positive iff + exact area positive. Export actual box and volume binary64 bits. Check indexing, + counts and one-to-one moment/domain records; both mu exports identical. +4. Every positive interior face has two positive adjacent primal regions and a + positive velocity-dual region. No positive containing-grid boundary face. + This does not admit a DOF/velocity-extension policy or production topology. +5. Retain/reconstruct all prior source moments, numerical intervals, physical + source-edge ledgers, flux, stress and pressure-control gates. General oblique + zero-area construction and arbitrary continuum geometry remain unsupported. + +Prospective tests: existing four focused contracts, five-artifact regression, +exact binary64 conversion, tangent/adjacent nextafter distinctions and orientation, +unrepresentable-positive interval refusal, and exact source-convexity/repeat +refusals. Run focused debug/release tests and strict Clippy. Check locked release +production library build and dependency tree: new rational dependencies are +private development dependencies only. Do not claim vulnerability, WASM, GPU, +native UI, physical water, performance, Lean or full coupled PDE qualification. + +Native export/evaluator changes are covered by independent read-only source and +math review before freeze and source-bound independent reconstruction afterward. +Evaluate repaired tooling in normal/-O/-OO modes with identical results. No new +assert-only input guards. Archive native sources/binary/logs/raw data, lock and +versions, evaluator/reviewer sources and reports with hashes and durable custody. +Only if every mandatory geometry gate passes, proceed to a separate dependent +DRAFT for an aligned tiny coupled algebra reference; unresolved geometry blocks +DOF/operator progression. Parent/repository lead owns merges/source inventory. diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/qualification.md b/docs/plans/fluid-accuracy-composition/q2-exact/qualification.md new file mode 100644 index 00000000..c23bbe95 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/qualification.md @@ -0,0 +1,22 @@ +# Admission boundary + +PASS: source-bound private CPU geometry v3 for the twelve fixed represented +convex polygons, two viscosity scales, actual boxes and query coordinates in +protocol.md. Independent exact face and region positivity gates have zero +mismatches; unchanged finite moments/flux/stress/convergence budgets pass. This +removes the five known zero-measure aperture artifacts without changing their +preserved v2 evidence. Independent review before freeze and reconstruction after +execution both completed. No selected scientific rerun or source mutation. + +PERMITTED NEXT: separate tiny aligned coupled M/B/S/W algebra reference using +already admitted AlignedStrain/StaticObstacleGeometry, with new prospective +source review and independent block/direct-solution/work oracle. The old split +viscous/projection experiment stays a named comparator. Do not select arbitrary +cut/free-surface velocity extensions from positive dual volume alone. + +PENDING: cut-face active spaces/extensions, coupled geometry/traction boundary +lift, component/gauge/conditioning policy on general cuts, disk/annulus MMS and +oblique water hydrostatics, continuum/native/IEEE correspondence beyond bounded +corpus, physical validation. Existing plan StokesWork exact-real proof is reused +only when actual M/B/S/W assembly meets its hypotheses; no new proof claim here. +No negative result or canonical criterion replaced. Parent owns lifecycle/merge. diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/results.md b/docs/plans/fluid-accuracy-composition/q2-exact/results.md new file mode 100644 index 00000000..4039be3a --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/results.md @@ -0,0 +1,32 @@ +# Frozen v3 result + +Source0f4e7e0944a7e0302690a0f71c08c21fe345cc89; native binary SHA256 +336842c96979bcf38fa825410b3f19eb8f67cf428141cbaef1e4c8f6476e5473. One native +release CPU campaign, exit0, all24 cases. Nine focused contracts pass in debug and +release; strict Clippy and locked release production-library check pass. New +num-rational/num-bigint/num-integer absent from normal production dependency tree. +Frozen structural evaluator gives byte-identical normal/-O/-OO results. + +Independent Fraction halfplane audit: all76,384 unique face queries agree in exact +dimension AND rational endpoint witnesses:54,050 empty,18 point,22,316 positive. +All152,780 actual represented-box region positivity masks agree with native +positive-volume presence. Both viscosity copies have identical geometry and all +12 source coordinate files are byte-identical to preserved v2 inputs. All five +historical artifacts are exact point contacts with zero numerical length, no +segment. No epsilon, volume floor, mass repair or budget change. + +Independent positive vertical integration checks all moments; maximum scaled +|Δm|/h²=7.882583474838611e-15, face endpoint/interval |Δx|/h=7.105427357601002e-15. +All5,930 physical-boundary rows and75,264 cell ledgers reconstructed. Largest +native closure/flux/stress defect6.293750243191454e-13 vs fixed1e-10 budget; +face mismatch1.765254609153999e-14, dual relative defect1.884820452646334e-15. +Disk finest area/force relative error approximately6.274915e-6, radial/cubic-flux1.254978e-5, +pair orders approximately2, unchanged finest1e-4/order1.8..2.2 gates pass. +Minimum positive represented volume1.279626616501019e-7 remains retained. + +732 zero-aperture/positive-dual associations remain (381X,351Y). They are valid +geometric observations, not a velocity-extension or active-DOF decision. Only +fixed-corpus face dimension/region positivity and finite integration qualify. +No general continuum/oblique topology, coupled free-surface pressure/stress, +annulus, hydrostatic obstacle, production mesh-water, physical impact or UI claim. +Q1 n64 exhaustion and three Full refusals remain independent and unresolved. diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/review.md b/docs/plans/fluid-accuracy-composition/q2-exact/review.md new file mode 100644 index 00000000..1ff0e4eb --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/review.md @@ -0,0 +1,26 @@ +# Independent review, before selected execution + +Reviewer: existing user-authorized `/root/p1_numerical_review`, read-only source +and mathematical review, 2026-10-20. No native/test execution before this review. + +The reviewer confirms exact finite binary64 rational conversion, convex-source +edge crossing/minimum/maximum construction, cached coordinate-line sections, +strict empty/point/positive classification and conservative positive-interval +representation refusal. Immutable source vertices and cached rational coordinates +share one owner. Region owns actual clipping bounds with moments; diagnostic +association/indexing follows native x-fastest GridGeometry. Exact source-coordinate +arithmetic is unchanged from v2. The positivity-mask theorem in mathematics.md +is valid under its explicit full-dimensional convex/nondegenerate-box assumptions. + +Two prospective defects were corrected before freeze: explicit checked flushing +of domains.csv, and rejection of positive-face export IDs outside the topology +ID set. Neither correction changes scientific criteria. The old floating source +orientation/moment filters can conservatively reject valid represented input; +that limitation is explicitly retained and documented. All admitted sources +additionally receive exact convexity/positive-area validation. + +No remaining prefreeze source/math blocker identified. This review admits only +execution of protocol.md: source review is not actual-data qualification. All +76,384 exact face witnesses, 152,780 exact positivity associations and retained +finite moment/flux/stress budgets require subsequent independent reconstruction. +Any unresolved correctness gate stops DOF/operator progression. diff --git a/docs/plans/fluid-accuracy-composition/q2-exact/route-handoff.md b/docs/plans/fluid-accuracy-composition/q2-exact/route-handoff.md new file mode 100644 index 00000000..24d7d608 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-exact/route-handoff.md @@ -0,0 +1,21 @@ +# Repository-lead source inventory through parent + +DRAFT PR132 on fix/numerical-evaluator-inputs-20261020 (PR130), frozen numerical +source0f4e7e0944a7e0302690a0f71c08c21fe345cc89. No rebases/merges/cleanup. +New exact write set vs c2fbbea: Cargo.toml/Cargo.lock dev dependencies, private +examples/grid_geometry_reference.rs, its geometry.rs/diagnostics.rs/new exact.rs, +and this new q2-exact owner. Existing test adapter unchanged. No production source, +lib exports, Session, UI, recording, composition, shared canonical lifecycle or +proof changes. Existing Q1 production LiquidVolume changes belong to PR126. + +Fresh origin/main now718469beedb9a949f4bb6f3299c7b880b4c47e47 (audit119 andplan120 +merged at unchanged heads); this branch remains qualified at its frozen source. +No combined-main or C1/G1 source-admission claim. Lead owns final Cargo/CI/source +inventory reconciliation and exact integration qualification. Preserved PR126, +PR127 andPR130 heads remain dfcc693/7d7306a/c2fbbea. Six earlier numerical/tooling +archives match their recorded hashes. Q1 n64/Full findings remain separate. + +Next exclusive proposed owner: examples/grid_coupled_reference.rs and optional +private submodules; tests/grid_coupled_reference_contract.rs; q2-coupled/*. No +Cargo changes or existing production/Session/provider/geometry-owner modifications. +Aligned algebra reference is not an oblique/free-surface extension/DOF admission. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/SHA256SUMS-preparation b/docs/plans/fluid-accuracy-composition/q2-static-mms/SHA256SUMS-preparation new file mode 100644 index 00000000..f0e68698 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/SHA256SUMS-preparation @@ -0,0 +1,54 @@ +e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f Cargo.lock +fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409 Cargo.toml +8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208 docs/plans/fluid-accuracy-composition/q2-static-mms/admitted-contract.md +cece8bc5cefeea53096cbad355dc6b25004ff52fa88adbbf68d9ee5d66d0b2e3 docs/plans/fluid-accuracy-composition/q2-static-mms/commands.json +3f022099705fd7b1aa1afabf4f115455f451d3c570321de3e9d004195d561adc docs/plans/fluid-accuracy-composition/q2-static-mms/execution-ledger.md +5028086daef4f13fc9895a3896efe275798d2228bd01c39b78def315ff392083 docs/plans/fluid-accuracy-composition/q2-static-mms/issues.md +2961ac10ae69b860f3fd9bb71d93b6cb88536c4492b64081cb989648b56697da docs/plans/fluid-accuracy-composition/q2-static-mms/mathematics.md +dc254ae280d4d4593e57c4da958b7b6eee7ab7db8034c103bfbe46f4f42d75b7 docs/plans/fluid-accuracy-composition/q2-static-mms/method-map.html +9f15a0a0a738224342ba0715a6cbc1267c4c377c6c032a88ca2c1e6d90b81383 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/README.md +043345393a6a418aa2b9be99ca4c74452be218972e314ad91c63001af701cdbe docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/SHA256SUMS-preparation +1c6a8784237bf38c308269606fb8dbdbb06476f6c0ed80de62012863d44eb88a docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/analyze.py +63d4b0dd31456f06f908a442bf196d57382f170fa79303b66fc768341ad768a1 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/audit_native.py +062d1d7e96febcdf52941fded8e7182f512344858b7bcabe28cc8c16229cf7f1 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/bounded_norms.py +c9c654a5e46382c8205aa1cc1b85dbae87f74c775ad9fb32f10b7822c0a7b27e docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/check_oracle.py +470e45b82682a761e7c24c3b70b7c22e27a05648aad86817f17420137b623b8d docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/continuum.py +518bab289d43458f6b3c2212912d5636faf8682c1275c6358552dbe1710af392 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/cross_phase.py +6757ab8f7546174f121b7851f7d3738a9a22c4375ab629dcdda440b52d31f5bc docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/exact_operators.py +4fe9c518beaa691ee6a1c5c5ab12ecf6cdfba79c83f93c482e988b203f7cf464 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/exact_polynomial.py +5ceefbe59f64dcab129dc6b03013a4731b0556ef19c38017e29a4852f19caf45 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/native_csv.py +fd0bbc17b68798610c690b864e886c92ba3c60b9d74a0c60a9df92e7aa9dc2c3 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/physical_norms.py +2313acbff2fa6e8f822f92dcc9a55d8e447e63505596bbe7f38c62948ad6f093 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/preparation-proposal.md +52dcbeaf33d9312d50754820697b3352017032d082fb04d32dc71261de6171ed docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/preparation-receipt.json +80a760ea5f6febe2b8dde472e9e097fe2893f1fa802914fe5eb126f0cc9f1961 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/readiness-review.md +ee9dc4e868720cae14da6e8d08e2be64136102e20c8355d50d395a70431f6409 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/spectrum.py +4f063735962382a815097e9ac82a2e479dbbcf57cbbe29527c43aeeb34711752 docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/validated.py +96b92b193ccbd26bd3726d143516bc4af72b07cbbf75c4b22c1788ee2eb164e4 docs/plans/fluid-accuracy-composition/q2-static-mms/plan.md +47a6bd71d0c6a3fd864ded75dc97fddc03dcc6ba3fdb20cf4e1fef126e7af7c7 docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/compile-only-checks.json +34783475778fe858891489ab9426b8158b09d499b59fd81ae18d39889f7ebece docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/final-source-inspection.json +c2c508d9d2af5cd92f64b0d782bd6c514bf651ca915a09ab487298e4c8987167 docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/release-build.log +778dc5d55174e3ea623593d5c4c9eef9a0b617e8304ab17c55f27499d8fb0a80 docs/plans/fluid-accuracy-composition/q2-static-mms/protocol.md +e1a68ee650d09b4a5f56b039ebcef5479d75da2a74e333fcdabc7ea9f43dade9 docs/plans/fluid-accuracy-composition/q2-static-mms/replan.md +4d742c04931e246baddc21dd77254ce78364540c3a719a0721b58259f0eb560b docs/plans/fluid-accuracy-composition/q2-static-mms/resource_supervisor.py +89082c76e2c4e07ffb36325e8c246c429f69245629ee808fca94ceae4c010762 docs/plans/fluid-accuracy-composition/q2-static-mms/resources.md +20bc38740bdbe9df427bac2247f7b4f3932122d8668a5acb7a7291709a252599 docs/plans/fluid-accuracy-composition/q2-static-mms/run_native.py +619aa9b3ee35dfe7c6f271c1c781f2c207b1581a905dea691084e97b02fdbb2a docs/plans/fluid-accuracy-composition/q2-static-mms/source-review/review.md +a74a2dd962582a2bd38cbb7575bd170c09a0f5dbcadae806fa30ffeae8a70645 docs/plans/fluid-accuracy-composition/q2-static-mms/source-review/source-manifest.json +60264a5f5877377df467b2aa950b89ba02016096e120bac707c327999da91962 examples/grid_cut_coupled_reference/experiment.rs +09656e1f1f7baca393e4c4119cc1e0b7d09a1464f6bfd5f6ee6df113b6200116 examples/grid_cut_coupled_reference/solver.rs +99b833914669019e2d19398a696ea4426be297b71ad116678f0952188e20e8cd examples/grid_cut_variational_reference/assembly.rs +eda120b04a35726d8b77c4ac9671f601b3b647479d47bf7dd582eadd954ae6eb examples/grid_cut_variational_reference/basis.rs +c7b688bf56300078c2d81c64fdbadd45d36c8492f33b10391470dedeb18a70b4 examples/grid_cut_variational_reference/clip.rs +e7cb49d4d868ab6a95097d57d1078af246d23fd615815d6392b82b5db542b0c7 examples/grid_cut_variational_reference/export.rs +8fa6a15fe1a894fca20a0bf57526f80710b662ad8f2649af28e0a4479efc60df examples/grid_cut_variational_reference/observe.rs +1d7b76b36a7cf2e7bcdfe8be0557567c8945411016a27aa946d360db8be39153 examples/grid_cut_variational_reference/trace.rs +16abcc4a2c2fe97bb7c36b9e37f8a2dce0e65f146a2eab8cb6c553fef4b5f4c3 examples/grid_geometry_reference/diagnostics.rs +9e1ecc2cfdf4d3473eb6ba39eec94854c8c45ca90cb51d2722c23fd029b106d2 examples/grid_geometry_reference/exact.rs +2f4f4f119e5a848558f92231d17e418c5898164c5bc5d24075e9a3f812297056 examples/grid_geometry_reference/geometry.rs +0dc27434dfe4db52519d676a0a0bd04cbd761b7d01574f7b6b99416ba287d3c1 examples/grid_static_mms_reference/cases.rs +68fa852963907bbb05613520295d648258d6b5f25de046bc75ecb79dc32ad53d examples/grid_static_mms_reference/experiment.rs +450a601bd2af115fbbfafc4f5ecb4cafd24b2183e86234861c36332fecd2f8ea examples/grid_static_mms_reference/field.rs +62ba68bf93586c3ce465f9484f6de6a51a4dece5fc7350be100ef8e9347ad00f examples/grid_static_mms_reference/loads.rs +f11ea9047c926b1f91cb1fb3abaeb255aee781763dec694382eaab71f9efa177 examples/grid_static_mms_reference.rs +09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800 rust-toolchain.toml +71b1e309a7379a060d001c81e0e45ff9195049bfdc4568323db611707988c1eb tests/grid_static_mms_reference_contract.rs diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/admitted-contract.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/admitted-contract.md new file mode 100644 index 00000000..a897beae --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/admitted-contract.md @@ -0,0 +1,178 @@ +# CV3-A admission: static polygon manufactured-solution pilot + +**Admitted next numerical milestone; no evaluation or acceptance yet.** The +parent's 2026-10-20 continuation asks the lead to select the next grid-first slice +after bounded CV2. Resume the existing numerical owner; do not create a duplicate +solver worker. First commit the discovered source/write set, resource plan, +prospective protocol and independent oracle/review, then perform one bounded +private-reference campaign. This admission changes no production capability. + +Dependency: final [PR139](https://github.com/MrScripty/Rheon/pull/139), head +`902f6092de6044419d028f92dabd8e59ae7a87ba`, numerical source +`b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. Its +[sealed custody manifest](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/evidence-manifest.md) +retains all 24 static cases, independent references, six unscaled square +velocity-accuracy failures and unchanged original mass conditioning. CV2 resolves +that fixed solve question; it establishes neither approximation order nor generic +cut stability. Its actual source and evidence remain immutable. + +## Decision and alternatives + +| Route | Disposition and reason | +| --- | --- | +| Repeat CV2 conditioning fixtures | Retain existing results; another same-corpus solve does not test approximation of a field outside the discrete spaces. | +| Full published free-surface disk now | Retain as the canonical later gate. Exact curved geometry, nonpolynomial forcing/integration and feasible 32/64/128 solution/reference machinery need separate preparation. A fixed polygon must not be called the zero-traction circular problem. | +| Static, exact-source polygon MMS with nonrepresentable fields | **Selected CV3-A.** It isolates field/pressure approximation and physical trace errors using existing static geometry and solve owners before expanding geometry or production state. | +| Add guessed stabilization, delete small supports or change pressure rows | Not admitted. Such changes require a distinct method decision and unchanged physical gates; passing residuals or a few positive spectra is insufficient. | + +The [Larionov–Batty–Bridson supplement, section 1 and equations 5–15](https://cs.uwaterloo.ca/~c2batty/papers/Larionov2017/supplemental.pdf) +uses analytic velocity/pressure and total traction to test coupled Stokes. Its +free-surface disk has nonzero interface pressure and zero **total** traction. +Here the exact polygon receives its own analytic prescribed traction; this is +not that circular free-surface test. [Burman–Claus–Massing's abstract](https://arxiv.org/abs/1408.5165v2) +attributes cut-independent stability to their particular stabilized formulation. +It supplies no theorem for Rheon's unstabilized staggered-Q1/P0 reference. + +## Fixed pilot problem + +Use the exact represented-source rectangle and square-17 polygons from CV1, +preserving their physical coordinates, source bytes, orientation and extrusion. +Set rho=1 kg/m³, mu=the represented binary64(.1) Pa s, dt=1 s, +extrusion=1 m, L_ref=1 m and U_ref=1 m/s. Export exact primitive bit identities; +R2 reconstructs those represented primitives before arithmetic rounding. Derive +coefficients symbolically from them rather than substituting rational 1/10 or +independently rounded decimal coefficients. R1 solves actual exported rounded data. +Define X=x/L_ref, Y=y/L_ref and +tau_ref=max(mu*U_ref/L_ref, rho*U_ref*L_ref/dt)=1 Pa. The chosen continuum fields +are deliberately outside the staggered bilinear/P0 spaces: + +```text +psi = U_ref * L_ref * (X^2*Y + X*Y^2) +u = (d_y psi, -d_x psi) +p = tau_ref * (1 + X + 2*Y + X*Y) +sigma = -p I + mu (grad u + grad u^T) +u_star = 0 +f = (rho/dt) u - div sigma +g = sigma n_outward +``` + +Independently derive and dimension-check f, g and div(u)=0 before source freeze. +Integrate these **continuum** body/traction loads. Do not construct a manufactured +discrete RHS from A*u_h and B-transpose*p_h: that would test the solver again. +Include both body and boundary loads in momentum, torque and work/resultant +checks, with each contribution reported separately. The forced problem does not +inherit an unforced nonincreasing-energy inequality. Pressure remains absolute +under the prescribed natural-traction problem; do not +remove a constant pressure row or introduce a gauge by analogy with closed walls. +This is a single time-discrete static verification problem, not temporal-order +or evolving-interface acceptance. + +Freeze nine scenarios before execution: rectangle n=4/8/16 at its existing grid +origin, and square-17 n=4/8/16 at that origin and a grid-origin shift +(.25h,.25h). Source polygons stay fixed in world coordinates. Freeze bounding-box +coverage and all staggered knots/support rules explicitly. Each scenario identity +includes source geometry hash, grid/phase, units/material/dt, field/load version, +basis/reconstruction version and exact command. No phase, case or finest level +may be dropped after seeing outputs. + +## Bounded implementation and ownership + +Use a fresh branch on the exact PR139 dependency, suggested name +`implementation/q2-static-mms-pilot-20261020`. The numerical owner owns only the +private experiment, test adapter, oracle and new q2-static-mms protocol/results +directory. Reuse CV1 M/B/K/physical basis and the CV2 selected solver. No Session, +PressureProvider, worker, SQLite, desktop, source-admission, Cargo or production +owner change is admitted. Composition work remains independently owned. + +Two explicit private-reference prerequisites are admitted for prospective review: + +- CV1 Layout currently refuses n outside 2..=8. Extend only its declared private + ceiling to 16, with allocation/overflow and above-16 refusal controls. Preserve + formulas, support admission, geometry semantics and all old-case behavior. + Record the exact helper/test write set before editing; do not silently coarsen + the pilot to avoid the ceiling. +- The old constant-stress trace rule uses two Gauss points. Quadratic pressure + times a bilinear basis trace can have degree four on an oblique segment. + Freeze a separately reviewed degree-at-least-four-exact load/traction rule + (for example three-point Gauss after **all** staggered-knot and P0 splits), + checked against independent exact polynomial moments. Verify volume-load and + squared-error degree requirements too. This is a new reference integration + contract, not retroactive qualification of old quadrature for new loads. + +Any broader helper, discretization, boundary policy, sparse backend, stabilization +or support/pressure elimination need requires a recorded bounded replan before +expansion. Preserve CV1/CV2 frozen sources, campaign receipts and negative data; +old scientific campaigns are not repeated or relabelled as CV3 evidence. + +## Deciding verification and resource gate + +Keep the canonical [grid verification criteria](verification.md#grid-stokes-transport-and-traction) +unchanged. The pilot uses the same 5% finest relative velocity/pressure and +characteristic-stress-scaled physical traction budgets, and L1/L2 observed order +at least .9 on the declared finest refinement pairs. Freeze component/vector +norms, pressure weighting, cross-phase comparisons and pairwise order formulas +before evaluation. Report L-infinity without assuming second order at cut faces. +Use actual field reconstruction on the exact polygons, not coefficient errors, +cell counts or nominal full-cell weights as substitutes. + +Retain original-coordinate normalized momentum/continuity and work/residual-work +budgets at 1e-10. Distinguish algebraic weak boundary satisfaction from independent +physical traction error; the former cannot establish the latter. Prescribed g +must be subtracted in the physical traction comparison. The separate canonical +zero-traction enforcement target remains 1e-8 of the same positive stress scale. + +The independent reference must integrate continuum polynomial body/traction +loads and reconstructed L2 **squared** errors independently of native assembly. +L1 absolute norms are not globally polynomial; freeze separate bounded integration +and propagate its uncertainty. Independent exported-target solution checks must +quantify original-coordinate algebraic uncertainty below a predeclared numerical +error budget, propagated into every deciding physical norm and refinement +difference. Require at most 1% of each reported discretization error and +refinement difference; apply 5%/.9 decisions conservatively to the resulting +error intervals. Agreement of 80/120-digit references alone is a numerical estimate, +not a certified forward-error bound. Before launch, freeze either a validated +solve/residual-plus-verified-inverse enclosure or an explicitly estimated budget; +an estimated budget cannot satisfy a claimed guaranteed-bound requirement. A +resource or uncertainty failure stops the campaign; a small native residual alone cannot do this, as CV2's retained +unscaled failures demonstrate. Exact-integral reference and rounded exported +target errors stay separate. Unresolved reference/quadrature uncertainty cannot +be labelled pass or used to infer order. + +Record exact B rank, pressure modes and a dimensionally declared velocity-H1 / +pressure-L2 scaled spectral diagnostic across grids/phases, including the fixed +alternating-cell pressure pattern. Keep physical constant-pressure semantics. +Freeze the full consistent velocity H1 Riesz matrix +Gv=integral(grad(phi_i):grad(phi_j)+L_ref^-2 phi_i*phi_j), pressure L2 mass +Qp=diag(positive cell volumes), and the spectrum of Qp^-1/2 B Gv^-1 B^T Qp^-1/2. +Keep every pressure row, including the constant mode. Freeze scaling, exact +rank algorithm, reference precision and spectral uncertainty first. CV2 A/Schur +equilibration spectra are different diagnostics and do not replace these norms. These are finite-instance diagnostics with no invented +beta cutoff, generic inf-sup theorem or automatic stabilization policy. + +Before any selected solve, derive matrix sizes, dense storage/factor/reference +costs and available resources for **all nine** cases. At n16, conservative +full-grid bounds are 544 velocity coefficients, 256 pressure rows and 800 KKT +rows; exact rank/high-precision cost can dominate binary64 matrix storage. Freeze hard RAM, scratch, +CPU-worker and wall-time caps, along with source/oracle hashes and actual commands. +If n16 or an independent reference cannot fit, stop and report the feasibility +blocker for a separately reviewed backend/protocol decision. Do not begin a +partial campaign and call whichever finest level completed the deciding result. +After independent protocol/source review, run one serialized source-bound campaign +into new external output, retain every failure and validate evaluator guards in +normal/-O/-OO modes with malformed and residual-consistent wrong-solution controls. + +## Handoff and remaining boundaries + +The existing numerical worker may resume discovery/protocol/oracle preparation +under this admission, then implement and evaluate only after the prospective +independent/resource gates above are satisfied. No further user confirmation is +needed for that bounded authorized scope. Root retains shared plan/ledger, +complete-source admission, dependency order, hosted checks and publication. +Fresh source qualification and exact-head hosted gates remain separate from +the numerical experiment and from any public merge. + +CV3-A has no result yet. Even a passing pilot would be a static prescribed-traction +polygon envelope only. The full Larionov disk 32/64/128, annulus/no-slip lifting, +water hydrostatics/oblique obstacles, generic cut stability, evolving geometry/ +transport/GCL, 3D and production acceptance remain unqualified. The grid-first, +then particle/output-surface, then later Lagrangian roadmap remains unchanged. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/commands.json b/docs/plans/fluid-accuracy-composition/q2-static-mms/commands.json new file mode 100644 index 00000000..2153e123 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/commands.json @@ -0,0 +1,244 @@ +{ + "cases": [ + { + "case": "rectangle-origin-n4", + "counts_are": "exact source-inequality counts", + "extent": 1, + "kkt_upper_bound": 56, + "n": 4, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/rectangle-origin-n4", + "rectangle-origin-n4" + ], + "origin_rule": "zero", + "phase": "origin", + "pressure_upper_bound": 16, + "source_unchanged": true, + "velocity_upper_bound": 40 + }, + { + "case": "rectangle-origin-n8", + "counts_are": "exact source-inequality counts", + "extent": 1, + "kkt_upper_bound": 134, + "n": 8, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/rectangle-origin-n8", + "rectangle-origin-n8" + ], + "origin_rule": "zero", + "phase": "origin", + "pressure_upper_bound": 36, + "source_unchanged": true, + "velocity_upper_bound": 98 + }, + { + "case": "rectangle-origin-n16", + "counts_are": "exact source-inequality counts", + "extent": 1, + "kkt_upper_bound": 395, + "n": 16, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/rectangle-origin-n16", + "rectangle-origin-n16" + ], + "origin_rule": "zero", + "phase": "origin", + "pressure_upper_bound": 120, + "source_unchanged": true, + "velocity_upper_bound": 275 + }, + { + "case": "square-17-origin-n4", + "counts_are": "bounding-box upper bounds", + "extent": 1, + "kkt_upper_bound": 41, + "n": 4, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/square-17-origin-n4", + "square-17-origin-n4" + ], + "origin_rule": "zero", + "phase": "origin", + "pressure_upper_bound": 9, + "source_unchanged": true, + "velocity_upper_bound": 32 + }, + { + "case": "square-17-origin-n8", + "counts_are": "bounding-box upper bounds", + "extent": 1, + "kkt_upper_bound": 66, + "n": 8, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/square-17-origin-n8", + "square-17-origin-n8" + ], + "origin_rule": "zero", + "phase": "origin", + "pressure_upper_bound": 16, + "source_unchanged": true, + "velocity_upper_bound": 50 + }, + { + "case": "square-17-origin-n16", + "counts_are": "bounding-box upper bounds", + "extent": 1, + "kkt_upper_bound": 177, + "n": 16, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/square-17-origin-n16", + "square-17-origin-n16" + ], + "origin_rule": "zero", + "phase": "origin", + "pressure_upper_bound": 49, + "source_unchanged": true, + "velocity_upper_bound": 128 + }, + { + "case": "square-17-quarter-n4", + "counts_are": "bounding-box upper bounds", + "extent": 1, + "kkt_upper_bound": 41, + "n": 4, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/square-17-quarter-n4", + "square-17-quarter-n4" + ], + "origin_rule": "h/4 in both coordinates", + "phase": "quarter", + "pressure_upper_bound": 9, + "source_unchanged": true, + "velocity_upper_bound": 32 + }, + { + "case": "square-17-quarter-n8", + "counts_are": "bounding-box upper bounds", + "extent": 1, + "kkt_upper_bound": 66, + "n": 8, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/square-17-quarter-n8", + "square-17-quarter-n8" + ], + "origin_rule": "h/4 in both coordinates", + "phase": "quarter", + "pressure_upper_bound": 16, + "source_unchanged": true, + "velocity_upper_bound": 50 + }, + { + "case": "square-17-quarter-n16", + "counts_are": "bounding-box upper bounds", + "extent": 1, + "kkt_upper_bound": 177, + "n": 16, + "native_argv": [ + "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "/workspace/rheon-q2-static-mms-evidence/native-v1/square-17-quarter-n16", + "square-17-quarter-n16" + ], + "origin_rule": "h/4 in both coordinates", + "phase": "quarter", + "pressure_upper_bound": 49, + "source_unchanged": true, + "velocity_upper_bound": 128 + } + ], + "contract_pr141_head": "38c40ca7b4b2401e0ac802f12c647f7229072f52", + "control_caps": { + "address_bytes": 8589934592, + "output_bytes": 2147483648, + "subprocess_cpu_seconds": 1800, + "subprocess_wall_seconds": 1800, + "total_wall_seconds": 10800, + "workers": 1 + }, + "dependency_pr139_head": "902f6092de6044419d028f92dabd8e59ae7a87ba", + "execution_order": [ + "verify committed preparation snapshot and manifest hash from preparation-freeze.md", + "native driver completes all nine fresh case directories", + "complete oracle harness executes all three full case/aggregate modes then all targeted controls", + "retain all results/refusals; tooling pass does not imply physics pass" + ], + "native_binary_sha256": "72f4245bf56a56da6e8a8c223c2a7a56220fc914491cf6997416c269945f9ad4", + "native_caps": { + "address_bytes": 4294967296, + "case_cpu_seconds": 120, + "case_wall_seconds": 120, + "output_bytes": 2147483648, + "total_wall_seconds": 900, + "workers": 1 + }, + "native_preparation_checkpoint": "b9ec50c779122587a5da30318b29b42e1825ec10", + "prelaunch_source_check": [ + "sha256sum", + "--check", + "/workspace/Rheon-q2-static-mms/docs/plans/fluid-accuracy-composition/q2-static-mms/SHA256SUMS-preparation" + ], + "prospective_subprocess_counts": { + "full_case_and_aggregate": 30, + "targeted_controls": 42, + "total": 72 + }, + "python": { + "packages_metadata_only": { + "mpmath": "1.3.0", + "numpy": "2.3.5", + "scipy": "1.17.0", + "sympy": "1.14.0" + }, + "path": "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "sha256": "fa67443527ed9647f760d807e2a38f26340757123e643c4639cf273ed15d5ea7", + "version": "3.12.14 (main, Aug 25 2026, 14:00:49) [Clang 22.1.3 ]" + }, + "reference_caps": { + "address_bytes": 8589934592, + "case_cpu_seconds": 1800, + "case_wall_seconds": 1800, + "modes": [ + "normal", + "-O", + "-OO" + ], + "output_bytes_all_modes": 8589934592, + "total_wall_seconds_all_modes": 32400, + "total_wall_seconds_per_mode": 10800, + "workers": 1 + }, + "rust_contract_disposition": "three compiled contracts remain ignored/unrun; this command requires later resource-bound execution disposition and does not run implicitly with the native driver", + "scope": "preparation complete for lead review; no automatic launch from this file; no extra user confirmation requested", + "serialized_complete_oracle_and_controls_argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "/workspace/Rheon-q2-static-mms/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/check_oracle.py", + "/workspace/rheon-q2-static-mms-evidence/native-v1", + "/workspace/rheon-q2-static-mms-evidence/oracle-checks-v1" + ], + "serialized_native_driver_argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "/workspace/Rheon-q2-static-mms/docs/plans/fluid-accuracy-composition/q2-static-mms/run_native.py", + "/workspace/rheon-q2-static-mms-evidence/native-v1" + ], + "source_hash_manifest": "/workspace/Rheon-q2-static-mms/docs/plans/fluid-accuracy-composition/q2-static-mms/SHA256SUMS-preparation", + "status": "frozen prospective commands only; UNRUN; current handoff preparation only", + "unrun_rust_contract_command": [ + "cargo", + "test", + "--locked", + "--no-default-features", + "--test", + "grid_static_mms_reference_contract", + "--", + "--ignored" + ], + "working_directory": "/workspace/Rheon-q2-static-mms" +} diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/execution-ledger.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/execution-ledger.md new file mode 100644 index 00000000..5ae24b77 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/execution-ledger.md @@ -0,0 +1,66 @@ +# CV3-A preparation ledger + +2026-10-20: received preparation-only continuation from parent after PR141 +admission review. Freshly fetched main718469b and PR14138c40ca. Required +dependency PR139902f609 matches the clean preserved CV2 worktree. Created +isolated branch/worktree from that exact dependency; no merges or cleanup. +Lead-local handoff path is absent here; published exact contract was read and +retained instead. Personal Context was unavailable; no inferred prior CV3 +state is used. No prior local CV3 branch or selected numerical output exists. + +Read actual CV1 basis/assembly/trace/export and CV2 solver/experiment plus +published admission/recommendation/review. Additional assembly and solver256 +guards prevent the n16 rectangle's275 support coefficients, beyond the stated +Layout8 ceiling. Recorded proposed exact write set and dimension-only bounded +replan before editing source; separate reviewer is evaluating that disposition. +No selected native tests, builds, solves, reference calculations or scientific +probes have run. Read-only filesystem/toolchain/package/resource inspection +and metadata hashing/float-bit extraction are preparation custody only. + +Standards source0fc92a24279f3a4574c80af0a2f31ea347a21597: Core/Router, +planning/discovery, implementation, verification/oracles, proportionality, +Rust profile and commit workflow read. No applicable AGENTS.md found in the +worktree or workspace-owned instruction roots. Existing reviewer and visual +owners reused; no duplicate solver instance created. + +After the recorded bc82e92 checkpoint, the independent reviewer accepted the +dimension-only replan for preparation. Published draft PR143 on that checkpoint +before editing shared helpers. Implemented bounded Layout/active/pressure/solver +guards and checked allocations, plus the new source-pinned continuum/load/H1 +experiment. The selected solver arithmetic and three corrections are unchanged. +Source inspection and an independent full native-source review found coherent +force/work/trace formulas; one above-cap test shape was corrected prospectively. + +Compile-only cargo check and strict Clippy pass. An initial adapter compile +failure revealed the old CV2 experiment's implicit fixture-dependent test path; +the new wrapper now imports only the shared solver and owns factor export. +Iterator lint failures were repaired before any numerical execution. Formatting +passed. No test was run. The three new numerical contracts are explicitly +ignored in ordinary CI pending separate resource-bound execution admission. +This is a preparation boundary, not a numerical acceptance or waived test. + +The candidate-free reviewer selected guaranteed exact rational inverse-defect +certificates, exact represented target/load construction, bounded Bernstein L1 +and verified H1 spectrum; its implementation remains in progress. A prospective +resource supervisor has source-level review, including final-deadline and +accounted-log corrections. All-nine driver/evaluator controls and runtime/RSS +feasibility remain pending; no scientific launch is admitted. + +Final preparation: independent oracle completed twelve Python modules for exact +operators/loads, R1/R2 certificates, physical norms/uncertainty, H1 spectrum/rank, +cross-phase reconstruction and normal/-O/-OO plus targeted controls. Independent +source reviews and complete source/commands are retained with the freeze. Root +read final sources and used AST-only syntax inspection, without module imports. +The native binary was built and hash-bound at b9ec50c, never executed. No new +Rust source changed after that checkpoint. Supervisor/driver handle process-group +cancellation, creation-window signal ownership, final deadlines and retained +receipts; a child exiting during cancellation does not bypass wait/reap. + +The initial interpretation requiring a measured runtime feasibility demonstration +before closing preparation was corrected against the contract: prospective +all-case costs and enforced hard caps close the resource-design gate. Runtime +remains unmeasured risk, with retained stop/replan at a cap. No known mathematical +or technical preparation blocker remains. No campaign was started; all numeric +contracts, certificates, physical metrics, spectra and72 prospective evaluator +checks remain unrun. The current handoff remains preparation only. Root retains +the worktree and publishes draft PR143 for lead coordination; no merge/cleanup. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/issues.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/issues.md new file mode 100644 index 00000000..6f33f091 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/issues.md @@ -0,0 +1,28 @@ +# CV3-A preparation issues + +- DIM-1: Layout8 is not the only n16 obstruction. Assembly and selected solver + independently cap velocity rows256; rectangle needs275. Proposed dimension-only + bounded replan was recorded before edits and subsequently accepted by the + independent numerical reviewer for preparation. The declared guards are now + implemented in this child; frozen parent sources remain unchanged. +- UNC-1: Original-coordinate certified numerical bounds must propagate through + physical norms and refinement differences. CV2 highprecision agreement is + insufficient. The prospective guaranteed-bound method and complete source are + independently reviewed and frozen; actual certificates/decisions remain unrun. +- EXEC-1: Current continuation is preparation only. No CV3 selected numerical + execution, result, PDE/production qualification or merge is admitted here. +- SRC-1: Initial compile-only check exposed a fixture-coupled cfg(test) + dependency when importing the old CV2 experiment wrapper. The MMS source now + imports only the actual shared solver and owns its factor CSV exporter. + Strict compile-only Clippy and formatting pass after iterator lint repairs. +- TEST-1: Three new numerical contracts are explicitly ignored by default + pending source/oracle/resource execution admission, so publishing preparation + does not cause ordinary CI to execute them prematurely. They remain unrun; + an eventual resource-bound command must select them explicitly with --ignored. + +- RES-1: Closed for preparation: all-nine source bounds, exact algorithms, fixed + commands and enforceable resource owners reviewed before numerical output. + Completion time and actual bit growth remain unmeasured risks under hard stops. +- FREEZE-1: Complete source/command custody is recorded in preparation-freeze.md. + Lead execution disposition is outside this preparation-only continuation; no + technical preparation blocker or approval denial remains. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/mathematics.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/mathematics.md new file mode 100644 index 00000000..8c2cbc21 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/mathematics.md @@ -0,0 +1,94 @@ +# CV3-A continuum and integration contract v1 + +This is a prospective derivation, without selected numerical execution. All +primitive constants and geometry coordinates are exact represented binary64 +values before R2 arithmetic. In SI units rho=1 kg/m3, dt=1 s, mu=binary64(.1) +Pa s, L=1 m, U=1 m/s and extrusion H=1 m. The characteristic stress is +max(mu U/L,rho U L/dt)=1 Pa. Native loads derive from these primitives, not +independently rounded .2/.4 coefficients. u_star is identically zero. + +With X=x/L, Y=y/L and psi=UL(X^2Y+XY^2), u=(d_y psi,-d_x psi) has units m/s +and equals U(X^2+2XY,-2XY-Y^2). Its gradient is +(U/L)[[2X+2Y,2X],[-2Y,-2X-2Y]], with identically zero divergence. +p=tau(1+X+2Y+XY) has units Pa. Thus + +``` +sigma_xx = -p + 4 mu U/L (X+Y) +sigma_xy = 2 mu U/L (X-Y) +sigma_yy = -p - 4 mu U/L (X+Y) +div sigma = (2 mu U/L^2 - tau/L (1+Y), + -2 mu U/L^2 - tau/L (2+X)) +f = (rho/dt) u - div sigma +g = sigma n_outward +``` + +f has units N/m3 and g N/m2. Their integrals times extrusion have units N; +moments have N m and contraction with velocity has W. Pressure is absolute +under total natural traction: no constant row removal, mean subtraction or +closed-wall gauge is selected. Integrate actual f and g, independently of any +desired discrete solution. The equations are A U-B^T P=F_body+F_boundary, +B U=0, A=M/dt+K, with full consistent M and original full rounded A preserved. + +## Forced work and momentum + +For u_star=0, multiply the first equation by U. Using the full stored operators, + +``` +U^T M U/dt + U^T K U - P^T B U + - U^T F_body - U^T F_boundary = U^T r +``` + +where r=A U-B^T P-F. Export both load vectors, direct physical body/boundary +power, resultants and torques separately. Kinetic energy E=.5 U^T M U has +the forced step identity 2E+dt U^T K U-dt(bodypower+boundarypower) + =dt P^T B U+dt U^T r. There is no unforced energy-decrease requirement. +Rigid virtual fields (1,0),(0,1),(-y,x) have zero symmetric strain and divergence. +Their momentum/moment contractions compare inertia with both continuum loads. + +## Reference integration degree + +Every common half-cell patch carries scalar Q1 polynomials of total degree2; +their derivatives degree1. f and sigma have degree2, so body phi*f and oblique +edge phi*(sigma n) have degree at most4. Split edges at ALL half-cell component +knots (which also contain primal pressure-cell planes). Each resulting edge has +one local derivative and liquid-side pressure polynomial; use its midpoint only +to identify the patch, never to average pressure or stress. + +New boundary loads use positive three-point Gauss-Legendre on each segment, +degree5-exact in real arithmetic. CV1's original two-point constant-stress trace +maps remain unchanged and cannot qualify the new quadratic traction. +For body loads, the existing3x3Duffy triangle rule maps a degree4 polynomial to +degrees at most5 in r (including the r Jacobian) and4 in s. It is sufficient in +real arithmetic, while R2 exact moments measure all native rounding separately. + +Velocity/P0-pressure L2 squared errors have degree<=4 on common volume patches. +Stress-traction L2 squared errors have degree<=4 on common edge pieces. Exact +rational polynomial moments followed by outward-enclosed square roots supply +independent squared integrals, without reusing native quadrature points. +L1 Euclidean-vector magnitudes involve square roots and are not polynomial. +They require independently bounded subdivision/integration and a retained +uncertainty interval; quadrature sampling alone is not a bound. + +## Reference bound selected for prospective review + +For a represented/exact rational KKT target C and rational approximate inverse R, +compute E=I-RC and delta=||E||_infinity EXACTLY. If delta<1, C is invertible and +for rational candidate z, r=b-Cz gives + +``` +||z_exact-z||_infinity <= ||R r||_infinity/(1-delta). +``` + +This follows by the Neumann series for (I-E)^-1. R may be generated by +highprecision LU but its accuracy is not assumed; only the exact defect check +supports the bound. Apply separately to native rounded-target R1 and exact +integral R2. No guaranteed-bound claim is made until the actual checks execute +successfully within hard resources. Propagate the resulting coefficient bounds +through Q1 basis/derivative and P0 stress reconstruction into every deciding +norm/refinement interval. A failed defect or unresolved L1/error budget refuses. + +Primary references: [NIST DLMF Gauss quadrature](https://dlmf.nist.gov/3.5#v) +for quadrature order, and [Rump2010, Theorem1.1 and equation10.9](https://www.tuhh.de/ti3/paper/rump/Ru10.pdf) +for verified inverse-defect/residual bounds. The precise rational implementation +and resource feasibility require independent prospective review; citing a theorem +alone does not supply an executed certificate. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/method-map.html b/docs/plans/fluid-accuracy-composition/q2-static-mms/method-map.html new file mode 100644 index 00000000..90076829 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/method-map.html @@ -0,0 +1,143 @@ + + + + + +Rheon CV3-A — preparation map + + +
+
+

Rheon · grid reference research · CV3-A

+

Before the first nonlinear-field campaign

+

Preparation for a static polygon manufactured-solution pilot. Nine fixed cases will ask whether the existing staggered-Q1/P0 reference approximates a continuum field outside its discrete spaces. Native, independent oracle and resource preparation sources are reviewed and complete for the bounded attempt, subject to the root’s final source/command freeze. No selected numerical execution has occurred.

+
+PREPARATION ONLY · SELECTED NUMERICAL CAMPAIGN NOT RUN +

CV3-A is the admitted next milestone; execution remains gated. This local discussion map follows PR141 at 38c40ca7b4b2401e0ac802f12c647f7229072f52 and the numerical owner's current preparation-only handoff. The handoff does not authorize the selected campaign. No CV3-A solve, accuracy result or acceptance is represented here.

+
+
+ +
+

01 · SOURCE

SOURCE REVIEW COMPLETE · ROOT FREEZE PENDING

Bounded capacity changes are explicit

The independently accepted preparation replan is implemented: Layout n≤16, active/solver velocity≤544, pressure≤256. Source/protocol formulas and corrected supervisor controls are coherent by read-only inspection; final custody and launch gates remain pending.

The three new numerical contracts are explicitly ignored pending separate execution admission and remain unrun. Basis/support/M/B/K formulas, pressure semantics and three solver corrections are preserved.

+

02 · INDEPENDENT ORACLE

ORACLE SOURCE COMPLETE · UNRUN

Separate field error from numerical error

Prepared independent exact polynomial loads and squared L2 errors, bounded Bernstein L1 integration, R1/R2 inverse certificates and propagated uncertainty for norms/orders. The final preparation snapshot is sealed; no certificate or physical metric has been evaluated.

High-precision agreement and a small native residual alone cannot establish a guaranteed forward-error bound.

+

03 · RESOURCES

RESOURCE DESIGN REVIEWED · UNRUN

Bound the attempt and retain any stop

All-nine source-derived sizes, reference algorithms and fixed RAM/scratch/CPU/wall limits are reviewed. Unmeasured runtime remains a risk under those hard caps; it does not require another benchmark or user approval.

A later cap or certificate/integration failure retains the exact stage and stops without retry or fallback. A partial coarse-grid campaign cannot decide the fixed pilot.

+
+ +
+FIXED PILOT DESIGN · NO MEASURED RESULTS +

One physical problem, three refinement families

+

The rectangle and exact represented-source square-17 stay fixed in world coordinates. Grid phase moves only the sampling lattice; the physical geometry and continuum fields stay fixed. Every family includes n=4, 8 and 16.

+ +Illustrative fixed polygons and changing grid phase +Three schematic panels show a rectangle, a rotated square, and the same rotated square over a shifted grid. The two square outlines occupy identical local positions. Geometry is illustrative, not a mesh, telemetry or measured result. + + + + +Rectangle · origin (0, 0) +Square-17 · origin (0, 0) +Same square · origin (h/4, h/4) + +

Illustrative geometry and grid sketch only. It is not the actual cut mesh, measured support or campaign telemetry. Exact polygon bytes and component lattice hulls must be frozen by the protocol.

+
+ + + +
FamilySource and phaseFixed levelsCases
RectangleCV1 polygon (.17,.23)–(.83,.79); origin (0,0)4 → 8 → 163
Square-17 / baseCV1 represented vertices; origin (0,0)4 → 8 → 163
Square-17 / shiftedIdentical source bytes; origin (h/4,h/4), h=1/n4 → 8 → 163
+

Extent=1 m; extrusion=1 m; ρ=1 kg/m³; μ=represented binary64(.1) Pa s; dt=1 s; Lref=1 m; Uref=1 m/s; τref=1 Pa. Primitive bit identities, bounding-box coverage, staggered knots and support rules belong to each frozen case identity. No phase or finest level may be dropped after evaluation.

+
+ +
+
+

Forcing comes from the continuum

+

Quadratic velocity and nonconstant pressure deliberately leave the componentwise bilinear velocity and cellwise constant pressure spaces.

+
X=x/Lref, Y=y/Lref
ψ=Uref Lref (X²Y+XY²)
u=(∂yψ, −∂xψ), div u=0
p=τref(1+X+2Y+XY)
σ=−pI+μ(∇u+∇uᵀ)
u*=0; f=(ρ/dt)u−div σ
g=σ n_outward
+

Body force f and total traction g are symbolically derived and dimension-checked in the reviewed source. Their native integration and independent mathematical guards remain unrun.

+
Absolute pressure remains observable.

Prescribed natural traction supplies the boundary problem. No pressure gauge, removed constant row, added stabilization or support floor is admitted.

+
+
+

Reuse the operators and solve owner

+
A=M/dt+K
A U−BᵀP=F; B U=0
Fᵢ=∫Ω φᵢ·f + ∫Γ φᵢ·g
+

Reuse CV1's full consistent M, B, K and single physical reconstruction, with the CV2 diagonal scaling, Cholesky, thin Householder QR and exactly three original-residual corrections.

+

The RHS must not be manufactured by applying A and Bᵀ to desired discrete coefficients. That would repeat a solver test rather than expose approximation of the continuum fields.

+
Forced work is different.

Report body and boundary loads, work, resultant and torque separately and together. The forced problem does not inherit an unforced nonincreasing-energy inequality. Physical traction error compares reconstructed σh n against prescribed g.

+
+
+ +
+NEW SOURCE INSPECTION · NOT A SELECTED CAMPAIGN RESULT +

Why the bounded capacity replan was necessary

+
+
275 required velocity coefficients > 256 previous caps

The numerical owner's preparation inspection identifies 275 active velocity coefficients for the n16 rectangle. Previous assembly admission and CV2 matrix validation / thin-QR dimensions capped velocity size at 256. The admitted preparation candidate now raises those private velocity caps to 544 and bounds pressure rows at 256.

Extending Layout alone was insufficient. The recorded bounded replan received independent preparation acceptance before source changes. Native tests, solves and scientific probes remain unrun; source inspection is not all-case feasibility.

+
+ + + +
Current private helperCandidate guardDisposition
CV1 Layout::newn in 2..=16Implemented with checked node allocation and above-cap refusal.
CV1 assembly active basis1..=544Implemented under accepted bounded preparation replan.
CV2 validate + thin QRvelocity ≤544; pressure ≤256Dimension guards only; solver arithmetic unchanged.
+
+
No silent mathematical workaround.

No coarsening, omitted case, support deletion, matrix floor, gauge, stabilization or formula change. The candidate adds above-ceiling refusal and checked allocations; old-corpus preservation remains a required source-bound control. No source change is made by this visual.

+

Conservative n16 full-grid bounds from the admission are 544 velocity coefficients, 256 pressure rows and 800 KKT rows. These are planning bounds, not actual active counts for each fixture. Dense storage alone does not establish feasibility of exact rank, validated inverse or high-precision reference work.

+
+ +
+

Independent errors need their own uncertainty budget

+
+
CONTINUUM POLYNOMIALSPhysical target

Fixed represented source, analytic u/p/f/g. Independently integrate exact polynomial moments for loads and reconstructed L2 squared errors.

+ +
DISCRETE REFERENCESTwo data targets

R2 uses independently integrated represented-source operators and loads. R1 uses the actual rounded exported full blocks and RHS. Keep their difference visible.

+ +
CERTIFICATE SOURCE PREPARED · UNRUNDeciding intervals

Bound solve/assembly/reference/integration uncertainty in original coordinates and propagate it to physical norms and refinement differences.

+
+
+

L2 and L1 need different integration contracts

Squared L2 errors are piecewise polynomial after all basis/P0/geometry splits. L1 absolute norms are not globally polynomial: the prepared bounded integration source propagates its uncertainty. Use actual reconstructed fields over exact polygons and physical source-edge pieces.

The old two-point constant-stress edge rule is insufficient for the new degree-four oblique-edge load product. The reviewed source uses a separate three-point rule after all required splits; independent polynomial-moment guards cover its degree requirements. Native rounding and those guards remain unexecuted.

+

Validated accuracy is required for decisions

Require numerical uncertainty at most 1% of each deciding discretization error and refinement difference. A validated solve or residual plus verified-inverse enclosure must support any guaranteed-bound claim. An explicitly estimated budget must remain labelled an estimate and cannot satisfy that guarantee.

CV2 retained six unscaled square velocity failures despite passing residuals. Neither that residual check nor 80/120-digit agreement substitutes for an original-coordinate forward-error enclosure here.

+
+
+ +
+FINAL PREPARATION SNAPSHOT · SOURCE CUSTODY ONLY +

One native campaign, then three full scientific modes

+

The independent source manifest is 043345393a6a418aa2b9be99ca4c74452be218972e314ad91c63001af701cdbe. All 16 listed hashes were checked as metadata. Source review is complete; numerical correctness, runtime, certificates and physical results remain unmeasured.

+
+ + + +
StageFixed resourcesProspective evidence
Native campaign1 worker · 4GiB AS · 2GiB output · 120s/case · 900s totalNine fixed cases; pinned binary; stop receipts/logs in accounted raw root.
Full reference modes1 worker · 8GiB AS · 8GiB shared output · 1800s/child · 10800s/mode · 32400s total27 full case calculations + three aggregates; compare complete normal/−O/−OO reports byte for byte, retaining scientific failures.
Evaluator controls1 worker · 8GiB AS · 2GiB output · 1800s/child · 10800s total10 mathematical + four malformed fixtures × three modes; 42 exact-guard checks. All 72 total subprocess calls remain unrun.
+

Raw/reference/control caps total 12GiB; reserve 2GiB for archive and 2GiB headroom against about 22GiB inspected free disk. Caps are stop limits, not measured use or a guarantee of completion. SIGTERM/creation-race cleanup is source-reviewed; no cancellation test or SIGKILL recovery is claimed.

+
+ +
+
+

Freeze what will decide the pilot

+
Physical errors and finest-pair order

Freeze vector/component L1/L2, pressure weighting, phase comparisons and order formulas. Keep 5% finest relative velocity/pressure and characteristic-stress-scaled physical traction budgets, with L1/L2 order ≥.9 on declared finest pairs. Apply decisions conservatively to error intervals. Report L∞ without assuming cut-face second order.

+
Algebraic and physical boundary checks stay separate

Original-coordinate momentum, continuity and work/residual-work budgets remain 1e−10. Weak boundary-load satisfaction cannot establish physical traction accuracy. Subtract prescribed g; the canonical zero-total-traction target remains a separate gate.

+
Finite-instance stability diagnostics

Exact B rank, all pressure rows including the constant mode, alternating-cell pattern and the declared full consistent velocity-H1 / pressure-L2 Riesz spectrum across every grid/phase. No invented β cutoff or generic inf-sup theorem follows from positive spectra.

+
+
+

Root freeze precedes any selected execution

+
1 · Prospective source and protocol review

Exact helper/test scope and bounded preparation replan are recorded. Native source and protocol are coherent by independent inspection, including corrected Cholesky refusal-test shape, final wall deadlines and accounted child logs. Freeze source, load rule, reconstruction, primitive identities and all nine commands before execution.

+
2 · Oracle/resource source prepared

Final oracle source includes independent integration, exact inverse-defect bounds, rank/spectral enclosures, all-nine aggregation and 14 targeted controls. Fixed resource design is reviewed; root binds the completed source and exact commands before execution. No timing result is assumed.

+
3 · One source-bound campaign, later

Only after the gates close: serialized external output, all failures retained, always-on normal/−O/−OO evaluator controls. Include wrong load/phase/trace/quadrature and residual-consistent wrong-field controls that fail their intended scientific guards.

+

Current status: native, independent oracle and resource source preparation is complete and reviewed, subject to final root source/command custody freeze. Three new numerical contracts remain ignored and unrun. Selected execution is outside this preparation-only handoff and has not run.

+
+
+ +
+

What a later passing pilot could establish

+
BOUNDED INTENT

A fixed nine-case, static, prescribed-traction polygon envelope for continuum-field approximation, pressure response, independent physical stress trace and grid-phase sensitivity.

This is one time-discrete problem per case. It does not test temporal order.

REMAINS UNQUALIFIED

Literal Larionov disk 32/64/128; annulus / oblique no-slip lifting; water hydrostatics and obstacles; generic cut stability; moving geometry, transport and GCL; 3D; production admission.

Prescribed polygon traction is a distinct problem from the published disk's zero total traction with nonzero interface pressure.

+
+ + +
diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/README.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/README.md new file mode 100644 index 00000000..5cb0a3ce --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/README.md @@ -0,0 +1,58 @@ +# CV3-A independent preparation source + +Status: prospective source complete for review; **no selected numerical execution +has occurred**. No module here has been imported, numerically evaluated, tested +or benchmarked. A standard-library AST-only syntax parse is source inspection. +No campaign/result or oracle launch freeze is claimed. + +Read [preparation-proposal.md](preparation-proposal.md) for authority, exact source +hashes and mathematics, and [readiness-review.md](readiness-review.md) for the +source-review disposition. `SHA256SUMS-preparation` hashes this preparation +snapshot; it does not authorize execution. This owner writes only this external +directory. Parent owns Rust/shared helpers/repository documents. Old evidence +and numerical sources are read-only. + +| Source | Prospective purpose | +| --- | --- | +| exact_polynomial.py | Own immutable CV2 exact polynomial moments, clipping and rational rank primitives | +| exact_operators.py | Independent M/B/K/H1 and physical/cartesian trace reconstruction; n16/cap544 new identity | +| continuum.py | Symbolic MMS, separate exact continuum loads and liquid-side Q1/P0 stress reconstruction | +| validated.py | Fixed120dps generator, exact inverse/residual certificate, bounded codec and outward sqrt/log intervals | +| bounded_norms.py | Exact L2 moments and Euclidean Bernstein L1/supremum enclosures with fixed resources | +| physical_norms.py | Relative volume and physical traction norms, normal/tangent L1/L2, per-edge sup, separate U/P radius propagation | +| spectrum.py | Verified H1/L2 spectrum, constant/alternating Qp patterns/Rayleigh and generator-mode diagnostics | +| native_csv.py | Complete nine-case source/grid/bit/schema/cardinality/dense/state custody | +| audit_native.py | Exact geometry, degree4 integration, loads/factors/original residual and full physical ledgers | +| cross_phase.py | Same-polygon origin/quarter reconstruction on the exact union partition | +| analyze.py | Full case/audit/aggregate pipeline, retained generators, both references and conservative uncertainty/error/order decisions | +| check_oracle.py | Separate reviewer-owned prospective normal/-O/-OO full report identity and14 targeted controls; planned72 subprocesses, not executed | + +Future commands, **after** parent final review and source/protocol/resource freeze: + +``` +python analyze.py audit NATIVE_CASE FRESH_OUTPUT +python analyze.py case NATIVE_CASE FRESH_OUTPUT +python analyze.py aggregate NATIVE_ROOT CASE_REPORT_ROOT FRESH_OUTPUT +python check_oracle.py NATIVE_ROOT FRESH_OUTPUT +``` + +NATIVE_ROOT has exactly rectangle-origin, square-17-origin and square-17-quarter +at n4/8/16, nine declared basenames. Preserve basename in copied controls. +Outputs must be fresh/outside raw. Audit omits inverse/norm/spectrum generation; +case continues full reference comparisons after numerical audit failures, while +malformed/reference/resource/integration refusals stop and retain receipts. +Aggregate binds all nine full reports and computes cross-phase diagnostics. +Each writes deterministic analysis.json. Numerical failures are retained results. + +Actual R1/R2 inverse/center and H1 inverse/eigensystem generators are persisted +as exact finite rationals with SHA binding; their accuracy is not assumed. +Report integers are capped at3,000,000 bits/1,000,000 decimal digits. Display-only +logarithm arguments are outward dyadic2^-256 before the fixed64-term series; +endpoints are outward2^-128. Physical decisions stay exact. + +Unmeasured runtime is a retained risk under enforced caps, not an external blocker +or an extra user-approval/benchmark ritual. Complete source/resource review must +precede a bounded attempt; a cap or failed certificate stops without fallback. +Three full scientific reference modes evaluate the same ONE native campaign: +one worker,8GiB,1800s child,10800s/mode,32400s total,8GiB output. Controls have a +separate10800s/2GiB output budget. Parent serializes work and freezes commands. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/SHA256SUMS-preparation b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/SHA256SUMS-preparation new file mode 100644 index 00000000..3a6ee614 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/SHA256SUMS-preparation @@ -0,0 +1,16 @@ +1c6a8784237bf38c308269606fb8dbdbb06476f6c0ed80de62012863d44eb88a analyze.py +63d4b0dd31456f06f908a442bf196d57382f170fa79303b66fc768341ad768a1 audit_native.py +062d1d7e96febcdf52941fded8e7182f512344858b7bcabe28cc8c16229cf7f1 bounded_norms.py +c9c654a5e46382c8205aa1cc1b85dbae87f74c775ad9fb32f10b7822c0a7b27e check_oracle.py +470e45b82682a761e7c24c3b70b7c22e27a05648aad86817f17420137b623b8d continuum.py +518bab289d43458f6b3c2212912d5636faf8682c1275c6358552dbe1710af392 cross_phase.py +6757ab8f7546174f121b7851f7d3738a9a22c4375ab629dcdda440b52d31f5bc exact_operators.py +4fe9c518beaa691ee6a1c5c5ab12ecf6cdfba79c83f93c482e988b203f7cf464 exact_polynomial.py +5ceefbe59f64dcab129dc6b03013a4731b0556ef19c38017e29a4852f19caf45 native_csv.py +fd0bbc17b68798610c690b864e886c92ba3c60b9d74a0c60a9df92e7aa9dc2c3 physical_norms.py +ee9dc4e868720cae14da6e8d08e2be64136102e20c8355d50d395a70431f6409 spectrum.py +4f063735962382a815097e9ac82a2e479dbbcf57cbbe29527c43aeeb34711752 validated.py +9f15a0a0a738224342ba0715a6cbc1267c4c377c6c032a88ca2c1e6d90b81383 README.md +2313acbff2fa6e8f822f92dcc9a55d8e447e63505596bbe7f38c62948ad6f093 preparation-proposal.md +80a760ea5f6febe2b8dde472e9e097fe2893f1fa802914fe5eb126f0cc9f1961 readiness-review.md +52dcbeaf33d9312d50754820697b3352017032d082fb04d32dc71261de6171ed preparation-receipt.json diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/analyze.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/analyze.py new file mode 100644 index 00000000..7f34ef8f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/analyze.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python3 +"""Prospective CV3-A independent analyzer. No selected work on import. + +analyze.py audit NATIVE_CASE FRESH_OUTPUT +analyze.py case NATIVE_CASE FRESH_OUTPUT +analyze.py aggregate NATIVE_ROOT CASE_REPORT_ROOT FRESH_OUTPUT + +Execution requires the parent's separate source/protocol/resource freeze. Each +expensive case invocation belongs under the frozen external resource supervisor. +""" +from fractions import Fraction as F +import hashlib +import json +from pathlib import Path +import sys +import exact_operators as eo +from native_csv import read_case, require, hashes, cases, GATE +from audit_native import audit, Gates +from validated import (Budget, solve_certified, json_exact, finest_gate, order_gate, + observed_order_interval) +from bounded_norms import Subdivision +from continuum import fields +from physical_norms import norm_metrics, normalized_algebraic_radii, deciding_intervals +from spectrum import certified_spectrum +from cross_phase import compare + + +def write_json(path, value): + Path(path).write_text(json.dumps(json_exact(value),sort_keys=True,separators=(',',':'))+'\n') + + +def parse_exact(value): + if isinstance(value,dict): + if set(value) == {'numerator','denominator'}: + require(all(isinstance(value[k],str) and len(value[k]) <= 1000000 for k in value), 'bounded exact report decimal strings') + n,d = int(value['numerator']),int(value['denominator']) + require(d > 0 and str(n) == value['numerator'] and str(d) == value['denominator'], 'canonical exact report rational') + require(n.bit_length() <= 3000000 and d.bit_length() <= 3000000, 'bounded exact report integer bits') + return F(n,d) + return {k:parse_exact(v) for k,v in value.items()} + if isinstance(value,list): + return [parse_exact(v) for v in value] + return value + + +def read_json(path): + def unique(pairs): + result = {} + for k,v in pairs: + require(k not in result, 'duplicate JSON report key'); result[k] = v + return result + return parse_exact(json.loads(Path(path).read_text(),object_pairs_hook=unique, + parse_constant=lambda s:(_ for _ in ()).throw(RuntimeError('CV3 input guard: nonfinite report')))) + + +def fresh(path, raw): + path,raw = Path(path),Path(raw) + require(not path.exists() and not path.resolve().is_relative_to(raw.resolve()), 'fresh independent output outside native tree') + path.mkdir(parents=True) + return path + + +def persist_generator(out, target, certificate): + generator = certificate.pop('inverse_generator') + payload = {'target':target,'precision_digits':120,'encoding':'exact rational finite binary mpf values', + 'inverse':generator,'center':certificate['center']} + path = out/(target+'-generator.json'); write_json(path,payload) + certificate['generator_sha256'] = hashlib.sha256(path.read_bytes()).hexdigest() + certificate['generator_filename'] = path.name + + +def reference_gate(gates, target, native, certificate, nv): + center,eta = certificate['center'],certificate['eta'] + u_error = max((abs(a-b) for a,b in zip(native[:nv],center[:nv])),default=F(0))+eta + p_error = max((abs(a-b) for a,b in zip(native[nv:],center[nv:])),default=F(0))+eta + gates.record('solution-'+target+'-velocity',u_error) + gates.record('solution-'+target+'-pressure',p_error/(1+F.from_float(.1))) + return {'velocity':u_error,'pressure':p_error} + + +def case_report(raw,out,mode): + budget = Budget(1800); data = read_case(raw) + if 'native_refused' in data: + report = {'mode':mode,'case':data['name'],'status':'native-refused', + 'gates':{'native-completion':{'value':F(1),'limit':GATE,'pass':False}}, + 'native_refusal':data['native_refused'],'input_sha256':data['input_sha256'], + 'all_required_gates_pass':False} + write_json(out/'analysis.json',report); return False + op,loads,gates,observations = audit(data,budget) + report = {'mode':mode,'case':data['name'],'input_sha256':data['input_sha256'], + 'gates':gates.values,'physical_observations':observations, + 'exact_rank':op['rank'],'rank_pivots':op['rank_pivots'], + 'velocity_coefficients':data['nv'],'pressure_rows':data['nc']} + write_json(out/'progress.json',dict(report,stage='exact native audit completed')) + if mode == 'case': + nv,nc = data['nv'],data['nc']; a,b = data['factors']['A'],data['native']['B'] + c1 = [a[i]+[-b[c][i] for c in range(nc)] for i in range(nv)]+[[-x for x in row]+[F(0)]*nc for row in b] + rhs1 = data['loads']['rhs']+[F(0)]*nc + native = [data['states'][3,'u'][i][0] for i in range(nv)]+[data['states'][3,'p'][i][0] for i in range(nc)] + references = {}; radii = {} + for target,c,rhs in (('R1',c1,rhs1),('R2',eo.system(op,F(1)),loads['rhs'])): + certificate = solve_certified(c,rhs,budget) + radii[target] = reference_gate(gates,target,native,certificate,nv) + persist_generator(out,target,certificate) + references[target] = certificate + write_json(out/'progress.json',dict(report,stage=target+' exact certificate completed',references=references)) + c1center,c2center = references['R1']['center'],references['R2']['center'] + reference_radius = references['R1']['eta']+references['R2']['eta'] + gap_u = max(abs(a-b) for a,b in zip(c1center[:nv],c2center[:nv])) + gap_p = max(abs(a-b) for a,b in zip(c1center[nv:],c2center[nv:])) + pref = 1+F.from_float(.1) + target_gap = {'velocity':(max(F(0),gap_u-reference_radius),gap_u+reference_radius), + 'pressure':(max(F(0),gap_p-reference_radius)/pref,(gap_p+reference_radius)/pref), + 'meaning':'original-coordinate rounded-export versus exact-integral solution gap; pressure scaled by physical Pref'} + iteration_errors = {} + for target,certificate in references.items(): + iteration_errors[target] = {} + for it in range(4): + values = [data['states'][it,'u'][i][0] for i in range(nv)]+[data['states'][it,'p'][i][0] for i in range(nc)] + du = max(abs(a-b) for a,b in zip(values[:nv],certificate['center'][:nv])) + dp = max(abs(a-b) for a,b in zip(values[nv:],certificate['center'][nv:])) + eta = certificate['eta'] + iteration_errors[target][str(it)] = {'velocity':(max(F(0),du-eta),du+eta), + 'pressure':(max(F(0),dp-eta)/pref,(dp+eta)/pref)} + ledger = Subdivision(budget) + measured = norm_metrics(op,native[:nv],native[nv:],loads['fields'],ledger) + measured.pop('reconstructed') + algebraic_radii = normalized_algebraic_radii(op,radii['R2'],measured) + intervals = deciding_intervals(measured,algebraic_radii) + uncertainty = {} + for field in ('velocity','pressure','traction'): + uncertainty[field] = {} + for norm in ('L1','L2'): + base = measured['metrics'][field][norm] + # Full integration interval width, not zero or merely printed + # precision; algebraic/assembly target radius also propagated. + total = base[1]-base[0]+algebraic_radii[field][norm] + passed = intervals[field][norm][0] > 0 and total <= intervals[field][norm][0]/100 + uncertainty[field][norm] = {'radius':total,'pass':passed} + gates.record('one-percent-error-'+field+'-'+norm, + total/intervals[field][norm][0] if intervals[field][norm][0] > 0 else F(1),F(1,100)) + spectrum = certified_spectrum(op,budget) + generator = {'inverse':spectrum.pop('inverse_generator'), + 'eigenvalues':spectrum.pop('spectral_generator_values'), + 'eigenvectors':spectrum.pop('spectral_generator_vectors'), + 'precision_digits':120,'encoding':'exact rational mpf/f64 generator values'} + spath = out/'H1-spectral-generator.json'; write_json(spath,generator) + spectrum['generator_sha256'] = hashlib.sha256(spath.read_bytes()).hexdigest() + spectrum['generator_filename'] = spath.name + report.update(references=references,physical_norms=measured,deciding_intervals=intervals, + rounded_vs_integral_solution_gap=target_gap,iteration_solution_errors=iteration_errors, + total_error_uncertainty=uncertainty,algebraic_norm_radii=algebraic_radii, + coefficient_reference_radii=radii, + h1_spectrum=spectrum,native_solution={'u':native[:nv],'p':native[nv:]}) + require(hashes(raw) == data['input_sha256'], 'native input bytes changed during independent analysis') + report.update(status='numerical-pass' if gates.passed() else 'numerical-fail', + gates=gates.values,all_required_gates_pass=gates.passed()) + write_json(out/'analysis.json',report) + return gates.passed() + + +def aggregate(raw,reports,out): + budget = Budget(1800); raw,reports = Path(raw),Path(reports) + expected = cases(); require({p.name for p in raw.iterdir() if p.is_dir()} == set(expected), 'complete nine-case native corpus') + require({p.name for p in reports.iterdir() if p.is_dir()} == set(expected), 'complete nine-case report corpus') + all_rows = {}; all_ok = True + for name in expected: + row = read_json(reports/name/'analysis.json') + require(row.get('mode') == 'case' and row.get('case') == name, 'bound full scientific case report') + require(isinstance(row.get('all_required_gates_pass'),bool) and isinstance(row.get('gates'),dict) and row['gates'], 'complete typed case acceptance gates') + for gate in row['gates'].values(): + require(set(gate) == {'value','limit','pass'} and isinstance(gate['value'],F) and isinstance(gate['limit'],F) + and isinstance(gate['pass'],bool) and gate['value'] >= 0 and gate['limit'] > 0 + and gate['pass'] == (gate['value'] <= gate['limit']), 'exact case gate predicate') + require(row['all_required_gates_pass'] == all(gate['pass'] for gate in row['gates'].values()), 'case required-gate consistency') + require(row.get('input_sha256') == hashes(raw/name), 'bound report native input hashes') + if row.get('status') == 'native-refused': + all_ok = False + else: + require('deciding_intervals' in row and 'h1_spectrum' in row and set(row['references']) == {'R1','R2'}, 'complete scientific case report') + for target,certificate in row['references'].items(): + filename = target+'-generator.json' + require(certificate['generator_filename'] == filename and hashlib.sha256((reports/name/filename).read_bytes()).hexdigest() == certificate['generator_sha256'], 'bound retained inverse generator') + spectrum = row['h1_spectrum']; filename = 'H1-spectral-generator.json' + require(spectrum['generator_filename'] == filename and hashlib.sha256((reports/name/filename).read_bytes()).hexdigest() == spectrum['generator_sha256'], 'bound retained spectral generator') + all_ok = bool(row['all_required_gates_pass']) and all_ok + all_rows[name] = row + decisions = {}; gaps = {}; phase = {}; summary_gates = Gates() + for name,row in all_rows.items(): + require(isinstance(row['all_required_gates_pass'],bool), 'boolean case acceptance') + summary_gates.record('case-required:'+name,F(0) if row['all_required_gates_pass'] else F(1)) + for family in ('rectangle-origin','square-17-origin','square-17-quarter'): + decisions[family] = {}; gaps[family] = {} + for field in ('velocity','pressure','traction'): + for norm in ('L1','L2'): + key = field+'-'+norm; rows = [all_rows[f'{family}-n{n}'] for n in (4,8,16)] + if any('deciding_intervals' not in row for row in rows): + decisions[family][key] = {'pass':False,'reason':'incomplete/refused scientific levels'} + summary_gates.record('complete-levels:'+family+':'+key,F(1)); all_ok = False; continue + intervals = [row['deciding_intervals'][field][norm] for row in rows] + family_gaps = [] + for k in (0,1): + coarse,fine = intervals[k],intervals[k+1] + lo,hi = coarse[0]-fine[1],coarse[1]-fine[0] + radius = rows[k]['total_error_uncertainty'][field][norm]['radius']+rows[k+1]['total_error_uncertainty'][field][norm]['radius'] + distance = lo if lo > 0 else -hi if hi < 0 else F(0) + gap_ok = distance > 0 and radius <= distance/100 + family_gaps.append({'difference_interval':(lo,hi),'total_uncertainty':radius, + 'one_percent_pass':gap_ok,'order_at_least_point9':order_gate(coarse,fine), + 'observed_order_enclosure':observed_order_interval(coarse,fine)}) + summary_gates.record('gap-uncertainty:'+family+':'+key+':'+('4-8' if k == 0 else '8-16'), + radius/distance if distance > 0 else F(1),F(1,100)) + finest_ok = finest_gate(intervals[2]); order_ok = family_gaps[1]['order_at_least_point9']; gap_ok = family_gaps[1]['one_percent_pass'] + decision = finest_ok and order_ok and gap_ok and family_gaps[0]['one_percent_pass'] + decisions[family][key] = {'finest_5percent_pass':finest_ok,'order_8_16_pass':order_ok, + 'gap_4_8_uncertainty_pass':family_gaps[0]['one_percent_pass'], + 'gap_8_16_uncertainty_pass':gap_ok,'pass':decision} + summary_gates.record('finest-five-percent:'+family+':'+key,intervals[2][1],F(1,20)) + summary_gates.record('order-eight-sixteen:'+family+':'+key,F(0) if order_ok else F(1)) + gaps[family][key] = family_gaps; all_ok = decision and all_ok + for n in (4,8,16): + names = [f'square-17-{p}-n{n}' for p in ('origin','quarter')] + if any('native_solution' not in all_rows[name] for name in names): + phase[str(n)] = {'status':'unavailable after retained refusal'}; all_ok = False; continue + data = [read_case(raw/name) for name in names] + ops = [eo.build(d['source'],d['n'],d['origin'],F(1),F(1),F.from_float(.1)) for d in data] + solutions = [all_rows[name]['native_solution'] for name in names] + phase[str(n)] = compare(ops[0],solutions[0]['u'],solutions[0]['p'],ops[1],solutions[1]['u'],solutions[1]['p'], + fields(F.from_float(.1)),Subdivision(budget)) + combined_radius = {kind:sum((all_rows[name]['coefficient_reference_radii']['R2'][kind] for name in names),F(0)) + for kind in ('velocity','pressure')} + radii = normalized_algebraic_radii(ops[0],combined_radius,phase[str(n)]) + phase[str(n)]['propagated_R2_norm_radii'] = radii + phase[str(n)]['propagated_difference_intervals'] = deciding_intervals(phase[str(n)],radii) + require(all_ok == summary_gates.passed(), 'aggregate required-gate consistency') + report = {'mode':'aggregate','status':'numerical-pass' if all_ok else 'numerical-fail', + 'corpus':list(expected),'gates':summary_gates.values,'case_reports':all_rows, + 'refinement_decisions':decisions,'refinement_differences':gaps, + 'cross_phase':phase,'all_required_gates_pass':all_ok, + 'claim':'bounded static prescribed-traction polygon MMS only; no production or uniform stability admission'} + write_json(out/'analysis.json',report) + return all_ok + + +def main(argv=None): + # Scoped process policy, not import-time mutation and never unlimited. + sys.set_int_max_str_digits(1000000) + argv = sys.argv[1:] if argv is None else argv + require(len(argv) in (3,4), 'usage audit/case INPUT OUTPUT or aggregate INPUT REPORTS OUTPUT') + mode = argv[0] + require((mode in ('audit','case') and len(argv) == 3) or (mode == 'aggregate' and len(argv) == 4), 'declared analyzer command') + out = fresh(argv[-1],argv[1]) + try: + passed = aggregate(argv[1],argv[2],out) if mode == 'aggregate' else case_report(Path(argv[1]),out,mode) + except BaseException as error: + write_json(out/'refusal.json',{'mode':mode,'status':'refused','reason':str(error),'all_required_gates_pass':False}) + raise + return 0 if passed else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/audit_native.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/audit_native.py new file mode 100644 index 00000000..b953d3a0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/audit_native.py @@ -0,0 +1,255 @@ +"""Prospective candidate-free native geometry/load/factor/physical audit.""" +from collections import defaultdict +from fractions import Fraction as F +import exact_polynomial as ep +import exact_operators as eo +from continuum import fields, exact_loads +from native_csv import require, integer, fraction, from_bits, GATE +from validated import action, dot, multiply, transpose, norm_inf + + +class Gates: + def __init__(self): + self.values = {} + + def record(self, name, value, limit=GATE): + value,limit = F(value),F(limit) + require(value >= 0 and limit > 0, 'finite nonnegative gate '+name) + old = self.values.get(name) + value = max(value,old['value']) if old else value + self.values[name] = {'value':value,'limit':limit,'pass':value <= limit} + + def diff(self, name, got, expected, scale): + scale = F(scale); require(scale > 0, 'positive fixed scale '+name) + self.record(name,abs(F(got)-F(expected))/scale) + + def matrix(self, name, got, expected): + require(len(got) == len(expected) and all(len(a) == len(b) for a,b in zip(got,expected)), 'matching matrix '+name) + scale = norm_inf(expected); require(scale > 0, 'positive matrix scale '+name) + self.record(name,norm_inf([[a-b for a,b in zip(ar,br)] for ar,br in zip(got,expected)])/scale) + + def passed(self): + return bool(self.values) and all(row['pass'] for row in self.values.values()) + + +def structure(data, op, gates, budget): + n,h = op['n'],op['h']; nv,nc = len(op['active']),len(op['cells']) + require((nv,nc) == (data['nv'],data['nc']), 'exact positive support/pressure dimensions') + amap = {g:i for i,g in enumerate(op['active'])}; cmap = {c:i for i,c in enumerate(op['cells'])} + for g,node in enumerate(op['nodes']): + r = data['nodes'][g] + require(all(integer(r[k]) == node[k] for k in ('global','axis','face','i','j')), 'native MAC association') + require((fraction(r['x']),fraction(r['y'])) == node['point'], 'phase-identity') + require(r['active'] == (str(amap[g]) if g in amap else ''), 'exact positive support mask') + for c,r in data['cells'].items(): + require(r['pressure'] == (str(cmap[c]) if c in cmap else ''), 'pressure-trace-binding') + gates.diff('cell-volume',fraction(r['volume']),op['volumes'][c],h*h) + patches = data['rows']['patches.csv'] + require(len(patches) == 4*n*n, 'complete common halfcell geometry') + vertices = defaultdict(dict) + for row in data['rows']['vertices.csv']: + p,i = integer(row['patch']),integer(row['index']) + require(p < len(patches) and i not in vertices[p], 'exact vertex association/duplicate') + xn,xd,yn,yd = (int(row[k]) for k in ('x_num','x_den','y_num','y_den')) + require(xd > 0 and yd > 0, 'positive rational geometry denominator') + vertices[p][i] = F(xn,xd),F(yn,yd) + for k,(row,patch) in enumerate(zip(patches,op['patches'])): + budget.check() + require(integer(row['patch']) == k and all(integer(row[d]) == patch[d] for d in ('i','j','cell')), 'common patch identity') + require(tuple(from_bits(integer(row[key])) for key in ('lo_x_bits','lo_y_bits')) == patch['lo'] + and tuple(from_bits(integer(row[key])) for key in ('hi_x_bits','hi_y_bits')) == patch['hi'], 'exact common knot bit identity') + count = integer(row['vertices']); require(set(vertices[k]) == set(range(count)), 'complete exact patch vertices') + poly = [vertices[k][i] for i in range(count)] + area = F(int(row['area_num']),int(row['area_den'])) + require(area == patch['area'] == ep.signed_twice_area(poly)/2, 'exact positive cut area') + for point in poly: + require(all(patch['lo'][d] <= point[d] <= patch['hi'][d] for d in range(2)), 'exact vertex clipping box') + require(all(ep.cross((b[0]-a[0],b[1]-a[1]),(point[0]-a[0],point[1]-a[1])) >= 0 + for a,b in zip(op['source'],op['source'][1:]+op['source'][:1])), 'exact vertex source containment') + for name,expected in (('M',op['M']),('K',op['K']),('B',op['B']),('grid_flux',op['grid_flux']),('physical_flux',op['physical_flux'])): + gates.matrix('exact-'+name,data['native'][name],expected) + gates.matrix('exact-consistent-H1',data['h1'],op['H1']) + maps = data['rows']['maps.csv']; require(len(maps) == nv, 'complete derivative/moment maps') + for i,row in enumerate(maps): + require(integer(row['active']) == i, 'map active identity') + for d,key in enumerate(('bulk_xx','bulk_xy','bulk_yy')): + gates.diff('exact-gradient-map',fraction(row[key]),op['gradient'][i][d],h) + for d,key in enumerate(('trace_xx','trace_xy','trace_yy')): + gates.diff('exact-physical-gradient-map',fraction(row[key]),op['trace_gradient'][i][d],h) + for d,key in enumerate(('moment_px','moment_py','moment_lz')): + gates.diff('exact-moment-map',fraction(row[key]),op['moment'][i][d],h*h) + + +def quadrature_and_traction(data, op, gates, budget): + nv = len(op['active']); amap = {g:i for i,g in enumerate(op['active'])}; h = op['h'] + qr = data['rows']['quadrature.csv']; require(qr, 'nonempty native positive quadrature') + qmap = {} + for expected,row in enumerate(qr): + require(integer(row['q']) == expected, 'complete quadrature indices') + patch = integer(row['patch']); require(patch < len(op['patches']), 'quadrature patch range') + p = op['patches'][patch]; require(p['area'] > 0 and integer(row['cell']) == p['cell'], 'quadrature positive patch association') + point = fraction(row['x']),fraction(row['y']); weight = fraction(row['weight']) + require(weight > 0 and all(p['lo'][d] < point[d] < p['hi'][d] for d in range(2)), 'positive interior native quadrature') + qmap[expected] = point,weight,p + bulk = defaultdict(dict) + for row in data['rows']['bulk-basis.csv']: + q,g = integer(row['q']),integer(row['global']); require(q in qmap and g not in bulk[q], 'bulk point/basis association duplicate') + require(g in amap and integer(row['active']) == amap[g] and integer(row['axis']) == op['nodes'][g]['axis'], 'bulk basis native association') + bulk[q][g] = row + moments = defaultdict(lambda:defaultdict(F)) + for q,(point,weight,patch) in qmap.items(): + budget.check(); require(set(bulk[q]) == {node['global'] for node,phi,dx,dy in patch['local']}, 'complete eight local bulk bases') + for node,phi,dx,dy in patch['local']: + r = bulk[q][node['global']] + for key,p,scale in (('phi',phi,F(1)),('dx',dx,1/h),('dy',dy,1/h)): + gates.diff('native-bulk-reconstruction',fraction(r[key]),ep.evaluate(p,point),scale) + for power in patch['moments']: + moments[patch['i'],patch['j']][power] += weight*point[0]**power[0]*point[1]**power[1] + for patch in op['patches']: + if patch['area']: + for power,expected in patch['moments'].items(): + gates.diff('native-degree4-volume-moments',moments[patch['i'],patch['j']][power],expected,h*h) + segments = data['rows']['segments.csv']; require(len(segments) == len(op['segments']), 'complete split trace records') + for i,(row,s) in enumerate(zip(segments,op['segments'])): + require(integer(row['segment']) == i and row['kind'] == s['kind'] and integer(row['owner']) == s['owner'] + and integer(row['axis']) == s['axis'] and row['edge'] == (str(s['edge']) if s['edge'] is not None else ''), 'physical/cartesian trace association') + for key,v in zip(('ax','ay','bx','by'),s['a']+s['b']): + gates.diff('native-trace-endpoints',fraction(row[key]),v,h) + # New three-point traction rule, independently check moments through degree5. + tr = data['top']['traction-points.csv']; grouped = defaultdict(list); points = {} + f = fields(op['mu']); native_boundary = [F(0)]*nv + for i,row in enumerate(tr): + require(integer(row['q']) == i, 'complete new traction point indices') + record = integer(row['record']); require(record < len(segments) and segments[record]['kind'] == 'global', 'physical traction source record') + s = segments[record]; a = fraction(s['ax']),fraction(s['ay']); b = fraction(s['bx']),fraction(s['by']) + point = fraction(row['x']),fraction(row['y']); normal = b[1]-a[1],a[0]-b[0] + axis = max(range(2),key=lambda d:abs(normal[d])); require(normal[axis] != 0, 'nonzero source segment') + normal_weight = fraction(row['nx_weight']),fraction(row['ny_weight']) + w = normal_weight[axis]/normal[axis]; require(w > 0, 'positive traction weight') + tangent_axis = 1-axis; t = (point[tangent_axis]-a[tangent_axis])/(b[tangent_axis]-a[tangent_axis]) + require(0 < t < 1, 'interior traction parameter') + for d in range(2): + gates.diff('physical-traction-source-line',point[d],a[d]+t*(b[d]-a[d]),h) + gates.diff('physical-traction-outward-normal',normal_weight[d],normal[d]*w,max(map(abs,normal))) + grouped[record].append((t,w)); points[i] = point,normal_weight,row + sx,sy,sz = (ep.evaluate(p,point) for p in f['sigma']) + expected = (sx*normal_weight[0]+sy*normal_weight[1],sy*normal_weight[0]+sz*normal_weight[1]) + for key,value in zip(('gx_weight','gy_weight'),expected): + gates.diff('exact-pressure-traction',fraction(row[key]),value,max(map(abs,normal_weight))) + expected_records = {i for i,s in enumerate(segments) if s['kind'] == 'global'} + require(set(grouped) == expected_records and all(len(v) == 3 for v in grouped.values()), 'complete three-point split traction rule') + for group in grouped.values(): + for k in range(6): + gates.diff('traction-degree4-moments',sum((w*t**k for t,w in group),F(0)),F(1,k+1),1) + basis = defaultdict(dict) + for row in data['top']['traction-basis.csv']: + q,i = integer(row['q']),integer(row['index']); require(q in points and i < nv and i not in basis[q], 'traction basis association duplicate') + basis[q][i] = fraction(row['phi']) + for q,(point,nw,row) in points.items(): + expected = {i:ep.evaluate(eo.hat(op['nodes'][g],point,h),point) for i,g in enumerate(op['active'])} + expected = {i:v for i,v in expected.items() if v} + require(set(basis[q]) == set(expected), 'complete positive traction basis support') + for i,value in expected.items(): + gates.diff('native-traction-basis',basis[q][i],value,1) + axis = op['nodes'][op['active'][i]]['axis'] + native_boundary[i] += basis[q][i]*fraction(row['gx_weight' if axis == 0 else 'gy_weight']) + for i,v in enumerate(native_boundary): + gates.diff('physical-point-to-nodal-traction',v,data['loads']['boundary'][i],h) + + +def factors(data, op, gates, budget): + f = data['factors']; nv,nc = data['nv'],data['nc'] + d = [r[0] for r in f['D']]; e = [r[0] for r in f['E']] + require(all(v > 0 for v in d+e) and all(f['L'][i][i] > 0 for i in range(nv)), 'positive selected factor scales/pivots') + require(all(f['R'][i][i] != 0 for i in range(nc)), 'nonzero QR pivots without floor') + require(all(f['L'][i][j] == 0 for i in range(nv) for j in range(i+1,nv)) + and all(f['R'][i][j] == 0 for i in range(nc) for j in range(i)), 'actual triangular factors') + expected_a = [[F.from_float(float(m)+float(k)) for m,k in zip(mr,kr)] for mr,kr in zip(data['native']['M'],data['native']['K'])] + require(f['A'] == expected_a, 'original full rounded target A binding') + scaled = [[d[i]*f['A'][i][j]*d[j] for j in range(nv)] for i in range(nv)] + gates.matrix('factor-diagonal-congruence',f['scaled_A'],scaled) + lower_symmetric = [[f['scaled_A'][max(i,j)][min(i,j)] for j in range(nv)] for i in range(nv)] + gates.matrix('factor-Cholesky-lower-symmetric-target',multiply(f['L'],transpose(f['L']),budget),lower_symmetric) + dbt = [[d[i]*data['native']['B'][c][i] for c in range(nc)] for i in range(nv)] + gates.matrix('factor-Y',multiply(f['L'],f['Y'],budget),dbt) + z = [[f['Y'][i][c]*e[c] for c in range(nc)] for i in range(nv)] + gates.matrix('factor-pressure-congruence',f['Z'],z) + gates.matrix('factor-QR',multiply(f['Q'],f['R'],budget),f['Z']) + identity = [[F(i == j) for j in range(nc)] for i in range(nc)] + gates.matrix('factor-orthogonality',multiply(transpose(f['Q']),f['Q'],budget),identity) + + +def physical(data, op, loads, gates): + a,b = data['factors']['A'],data['native']['B']; nv,nc = data['nv'],data['nc']; volume = sum(op['volumes'],F(0)) + body,boundary,rhs = (data['loads'][k] for k in ('body','boundary','rhs')) + for i in range(nv): + require(rhs[i] == F.from_float(float(body[i])+float(boundary[i])), 'original rounded RHS binding') + for it in range(4): + u = [data['states'][it,'u'][i][0] for i in range(nv)]; p = [data['states'][it,'p'][i][0] for i in range(nc)] + au,bu = action(a,u),action(b,u) + ru = [rhs[i]-au[i]+sum((b[c][i]*p[c] for c in range(nc)),F(0)) for i in range(nv)] + for i in range(nv): + scale = sum(map(abs,a[i]),F(0))+sum((abs(b[c][i]) for c in range(nc)),F(0))+abs(rhs[i]) + require(scale > 0, 'positive momentum row scale') + gates.diff('recorded-original-residual',data['states'][it,'u'][i][1],ru[i],scale) + if it == 3: + gates.record('original-momentum-rows',abs(ru[i])/scale) + for c in range(nc): + scale = sum(map(abs,b[c]),F(0)); require(scale > 0, 'positive continuity row scale') + gates.diff('recorded-original-residual',data['states'][it,'p'][c][1],bu[c],scale) + if it == 3: + gates.record('original-continuity-rows',abs(bu[c])/scale) + u = [data['states'][3,'u'][i][0] for i in range(nv)]; p = [data['states'][3,'p'][i][0] for i in range(nc)] + bu = action(b,u); ru = [x-y for x,y in zip(rhs,action(a,u))] + ru = [ru[i]+sum((b[c][i]*p[c] for c in range(nc)),F(0)) for i in range(nv)] + gf,pf = action(data['native']['grid_flux'],u),action(data['native']['physical_flux'],u) + for c in range(nc): + gates.diff('physical-closed-cell-flux',gf[c]+pf[c],0,op['h']) + gates.diff('physical-flux-bridge',gf[c]+pf[c],bu[c],op['h']) + mu,ku = action(data['native']['M'],u),action(data['native']['K'],u) + energy = dot(u,mu)/2; viscous = dot(u,ku); pb,pt = dot(u,body),dot(u,boundary) + raw = 2*energy+viscous-pb-pt; pressure_work = dot(p,bu); residual_work = -dot(u,ru) + gates.diff('forced-raw-work',raw,0,volume) + gates.diff('forced-corrected-work',raw-pressure_work-residual_work,0,volume) + gates.record('absolute-residual-work',(sum((abs(x*y) for x,y in zip(p,bu)),F(0))+sum((abs(x*y) for x,y in zip(u,ru)),F(0)))/volume) + gates.diff('physical-body-power',pb,dot(u,loads['body']),volume) + gates.diff('physical-boundary-power',pt,dot(u,loads['boundary']),volume) + gates.record('negative-viscous-dissipation',max(F(0),-viscous)/(op['mu']*volume)) + observations = {'energy':energy,'dissipation':viscous,'body_power':pb,'boundary_power':pt, + 'direct_body_power':dot(u,loads['body']),'direct_boundary_power':dot(u,loads['boundary']), + 'pressure_work':pressure_work,'residual_work':residual_work,'raw_work':raw} + for d,label in enumerate(('x','y','torque')): + virtual = [] + for g in op['active']: + node = op['nodes'][g]; axis = node['axis']; x,y = node['point'] + virtual.append(F(axis == d) if d < 2 else -y if axis == 0 else x) + inertia = sum((op['moment'][i][d]*u[i] for i in range(nv)),F(0)) + direct_body,direct_boundary = dot(virtual,loads['body']),dot(virtual,loads['boundary']) + gates.diff('physical-momentum-'+label,inertia,direct_body+direct_boundary,volume) + for prefix,value,expected in (('body_nodal',dot(virtual,body),direct_body),('boundary_nodal',dot(virtual,boundary),direct_boundary)): + gates.diff('physical-'+prefix+'-'+label,value,expected,volume) + observations.update({f'inertia_{label}':inertia,f'body_direct_{label}':direct_body,f'boundary_direct_{label}':direct_boundary, + f'body_nodal_{label}':dot(virtual,body),f'boundary_nodal_{label}':dot(virtual,boundary)}) + for name,(kind,value) in data['metrics'].items(): + if kind == 'gate': + require(value >= 0, 'nonnegative reported native gate') + gates.record('reported-native:'+name,value) + else: + require(name in observations, 'independently reconstructed observation '+name) + scale = volume*op['mu'] if name == 'dissipation' else volume + gates.diff('reported-physical-observation:'+name,value,observations[name],scale) + return observations + + +def audit(data, budget): + op = eo.build(data['source'],data['n'],data['origin'],F(1),F(1),F.from_float(.1)) + gates = Gates(); structure(data,op,gates,budget) + quadrature_and_traction(data,op,gates,budget) + loads = exact_loads(op) + for key,guard in (('body','exact-body-load'),('boundary','exact-total-traction-load')): + scale = max(map(abs,loads[key])); require(scale > 0, 'positive continuum load scale') + for a,b in zip(data['loads'][key],loads[key]): + gates.diff(guard,a,b,scale) + factors(data,op,gates,budget) + observations = physical(data,op,loads,gates) + return op,loads,gates,observations diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/bounded_norms.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/bounded_norms.py new file mode 100644 index 00000000..2e712af7 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/bounded_norms.py @@ -0,0 +1,157 @@ +"""Prospective exact-moment L2 / enclosing Bernstein Euclidean L1. + +No quadrature samples or candidate imports. Nothing executes on import. +""" +from fractions import Fraction as F +from heapq import heappush, heappop +import exact_polynomial as ep +from validated import require, dot, norm_interval, sqrt_interval + + +def vector_value(polynomials, point): + return tuple(ep.evaluate(p, point) for p in polynomials) + + +def add_vector(a, b): + require(len(a) == len(b), 'vector polynomial dimensions') + return tuple(ep.add(x, y) for x, y in zip(a, b)) + + +def triangle_area(triangle): + a, b, c = triangle + area = ep.cross((b[0]-a[0], b[1]-a[1]), (c[0]-a[0], c[1]-a[1]))/2 + require(area > 0, 'positive exact norm triangle') + return area + + +def midpoint(a, b): + return tuple((x+y)/2 for x, y in zip(a, b)) + + +def triangle_bernstein(polynomials, triangle): + # Degree2 Bernstein coefficients: vertices plus three mixed coefficients. + require(all(i+j <= 2 for p in polynomials for i, j in p), 'quadratic vector reconstruction') + vertices = [vector_value(polynomials, p) for p in triangle] + mixed = [] + for i, j in ((0, 1), (1, 2), (2, 0)): + v = vector_value(polynomials, midpoint(triangle[i], triangle[j])) + mixed.append(tuple(2*x-(a+b)/2 for x, a, b in zip(v, vertices[i], vertices[j]))) + return vertices+mixed + + +def triangle_l1_bounds(polynomials, triangle): + area = triangle_area(triangle) + coefficients = triangle_bernstein(polynomials, triangle) + integral = tuple(area*sum((b[d] for b in coefficients), F(0))/6 for d in range(len(polynomials))) + lower = norm_interval(integral)[0] + upper = area*sum((norm_interval(b)[1] for b in coefficients), F(0))/6 + require(0 <= lower <= upper, 'enclosing triangle norm') + return lower, upper + + +def segment_bernstein(polynomials, a, b): + require(all(i+j <= 2 for p in polynomials for i, j in p), 'quadratic segment reconstruction') + va, vb, vm = vector_value(polynomials, a), vector_value(polynomials, b), vector_value(polynomials, midpoint(a, b)) + mixed = tuple(2*x-(y+z)/2 for x, y, z in zip(vm, va, vb)) + return va, mixed, vb + + +def segment_l1_bounds(polynomials, a, b, weight): + # weight is a rational measure independent of source-edge norm. For traction + # q=delta_sigma*dperp, source parameter dt is exactly this measure. + require(weight > 0, 'positive parameter measure') + coefficients = segment_bernstein(polynomials, a, b) + integral = tuple(weight*sum((c[d] for c in coefficients), F(0))/3 for d in range(len(polynomials))) + lower = norm_interval(integral)[0] + upper = weight*sum((norm_interval(c)[1] for c in coefficients), F(0))/3 + require(0 <= lower <= upper, 'enclosing segment norm') + return lower, upper + + +def triangle_children(triangle): + pairs = ((0, 1, 2), (1, 2, 0), (2, 0, 1)) + lengths = [sum(((triangle[j][d]-triangle[i][d])**2 for d in range(2)), F(0)) for i, j, k in pairs] + selected = max(range(3), key=lambda i: (lengths[i], -i)) + i, j, k = pairs[selected]; a, b, c = triangle[i], triangle[j], triangle[k] + m = midpoint(a, b) + return (a, m, c), (m, b, c) + + +class Subdivision: + """A case-wide resource ledger shared by every norm and denominator.""" + def __init__(self, budget): + self.budget = budget + self.created = 0 + self.maximum_depth = 0 + + def allocate(self, depth): + self.budget.check() + require(depth <= 24, 'bounded L1 depth24 refusal') + self.created += 1 + self.maximum_depth = max(self.maximum_depth, depth) + require(self.created <= 2000000, 'bounded L1 two-million-piece resource refusal') + + +def l1_enclosure(items, tolerance, ledger): + """items: ('triangle',polys,triangle) or ('segment',polys,(a,b,weight)).""" + require(F(0) < tolerance, 'positive frozen integral width') + heap = []; sequence = 0; lower = F(0); upper = F(0) + def push(kind, p, geometry, depth): + nonlocal sequence, lower, upper + ledger.allocate(depth) + bounds = triangle_l1_bounds(p, geometry) if kind == 'triangle' else segment_l1_bounds(p, *geometry) + lo, hi = bounds; lower += lo; upper += hi + heappush(heap, (-(hi-lo), sequence, kind, p, geometry, depth, lo, hi)); sequence += 1 + for kind, p, geometry in items: + require(kind in ('triangle', 'segment') and len(p) in (1, 2), 'declared L1 piece schema') + push(kind, p, geometry, 0) + require(heap, 'nonempty physical norm domain') + while upper-lower > tolerance: + ledger.budget.check() + width, seq, kind, p, geometry, depth, lo, hi = heappop(heap) + require(width < 0, 'positive unresolved L1 width') + lower -= lo; upper -= hi + if kind == 'triangle': + for child in triangle_children(geometry): + push(kind, p, child, depth+1) + else: + a, b, weight = geometry; m = midpoint(a, b) + push(kind, p, (a, m, weight/2), depth+1) + push(kind, p, (m, b, weight/2), depth+1) + return lower, upper + + +def fan(poly): + out = [] + for i in range(1, len(poly)-1): + tri = poly[0], poly[i], poly[i+1] + determinant = ep.cross((tri[1][0]-tri[0][0], tri[1][1]-tri[0][1]), (tri[2][0]-tri[0][0], tri[2][1]-tri[0][1])) + require(determinant >= 0, 'CCW norm fan') + if determinant: + out.append(tri) + return out + + +def square_polynomial(vector): + return ep.add(*(ep.multiply(p, p) for p in vector)) + + +def volume_l2_squared(items): + return sum((ep.triangle_integral(square_polynomial(p), tri) for p, tri in items), F(0)) + + +def supremum_bounds(items): + """Enclosing upper bound plus sampled lower, not an exact attained max.""" + lower = F(0); upper = F(0) + for kind, p, geometry in items: + if kind == 'triangle': + coefficients = triangle_bernstein(p, geometry) + samples = [vector_value(p, v) for v in geometry] + else: + a, b, weight = geometry + coefficients = segment_bernstein(p, a, b) + samples = [vector_value(p, v) for v in (a, midpoint(a, b), b)] + lower = max(lower, max((norm_interval(v)[0] for v in samples), default=F(0))) + upper = max(upper, max((norm_interval(v)[1] for v in coefficients), default=F(0))) + require(lower <= upper, 'supremum enclosure') + return lower, upper diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/check_oracle.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/check_oracle.py new file mode 100644 index 00000000..bc28aa0b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/check_oracle.py @@ -0,0 +1,631 @@ +#!/usr/bin/env python3 +"""Prospective CV3-A evaluator checks; NO science is run by importing this file. + +Future separately admitted command: python check_oracle.py NATIVE_ROOT FRESH_OUTPUT +Runs the frozen independent analyzer, never the native executable. All selected +case/reference/mutation calls are behind main(). Source preparation is not launch +authority. Fixed resource limits are prospective, unmeasured hard-stop limits. + +Adapter contract coordinated with the independent owner: + analyze.py case CASE FRESH_OUTPUT + analyze.py audit CASE FRESH_OUTPUT + analyze.py aggregate NATIVE_ROOT CASE_REPORT_ROOT FRESH_OUTPUT +Successful/negative numerical outputs are deterministic analysis.json files; +gates[NAME] contains value, limit and pass; all_required_gates_pass summarizes +the mathematical disposition. Early identity refusals use exactly +"CV3 input guard: NAME" (optionally a RuntimeError traceback prefix). +""" +import csv +from fractions import Fraction as F +import hashlib +import io +import json +import math +import os +from pathlib import Path +import resource +import shutil +import signal +import subprocess +import sys +import time + + +CASES = tuple(f'{family}-n{n}' for family in ( + 'rectangle-origin', 'square-17-origin', 'square-17-quarter') for n in (4, 8, 16)) +MUTANT_CASE = 'square-17-origin-n4' +MODES = (('normal', ()), ('O', ('-O',)), ('OO', ('-OO',))) +CHILD_SECONDS = 1800 +MODE_SECONDS = 10800 +COMPLETE_SECONDS = 32400 +CONTROL_SECONDS = 10800 +ADDRESS_BYTES = 8 << 30 +COMPLETE_OUTPUT_BYTES = 8 << 30 +CONTROL_OUTPUT_BYTES = 2 << 30 +INTEGER_DECIMAL_CHAR_LIMIT = 1_000_000 +INTEGER_BIT_LIMIT = 3_000_000 + + +def require(condition, message): + if not condition: + raise RuntimeError('CV3 harness guard: ' + message) + + +def digest(path): + with Path(path).open('rb') as stream: + return hashlib.file_digest(stream, 'sha256').hexdigest() + + +def identical_files(left, right): + with left.open('rb') as a, right.open('rb') as b: + while True: + x, y = a.read(1 << 20), b.read(1 << 20) + if x != y: + return False + if not x: + return True + + +def inventory(root): + require(root.is_dir() and not root.is_symlink(), 'owned ordinary corpus directory') + result = {} + for path in sorted(root.rglob('*')): + require(not path.is_symlink(), 'no corpus symlinks') + if path.is_file(): + result[str(path.relative_to(root))] = digest(path) + else: + require(path.is_dir(), 'ordinary corpus entries only') + require(result, 'nonempty corpus') + return result + + +def output_size(root): + total = 0 + for path in root.rglob('*'): + require(not path.is_symlink(), 'no output symlinks') + if path.is_file(): + total += path.stat().st_size + return total + + +def child_cpu(): + used = resource.getrusage(resource.RUSAGE_CHILDREN) + return used.ru_utime + used.ru_stime + + +def observed_rss(pid): + try: + lines = Path(f'/proc/{pid}/status').read_text().splitlines() + except FileNotFoundError: + return 0 + for line in lines: + if line.startswith('VmRSS:'): + return int(line.split()[1]) * 1024 + return 0 + + +def check_budget(root, deadline, limit=CONTROL_OUTPUT_BYTES): + require(time.monotonic() < deadline, 'fixed total wall limit') + require(output_size(root) <= limit, 'fixed aggregate scratch limit') + + +def load_csv(path): + with path.open(newline='') as stream: + reader = csv.DictReader(stream) + fields = reader.fieldnames + require(fields is not None, 'mutation requires existing CSV header') + rows = list(reader) + require(rows and all(None not in r for r in rows), 'mutation requires complete source rows') + return fields, rows + + +def save_csv(path, fields, rows): + require(path.is_file() and not path.is_symlink(), 'rewrite only copied ordinary file') + text = io.StringIO() + writer = csv.DictWriter(text, fieldnames=fields, lineterminator='\n') + writer.writeheader() + writer.writerows(rows) + path.write_text(text.getvalue()) + + +def number(text): + value = float(text) + require(math.isfinite(value), 'finite source mutation primitive') + return value + + +def represented(text): + return F.from_float(number(text)) + + +def render(value): + value = float(value) + require(math.isfinite(value), 'finite mutated value') + return format(value, '.17e') + + +def input_rows(case): + fields, rows = load_csv(case / 'input.csv') + values = {r['key']: r['value'] for r in rows} + require(len(values) == len(rows), 'source input keys unique') + return fields, rows, values + + +def copied_case(raw, out, tag, deadline): + """Independent fresh bytes, never symlinks or writes into the source corpus.""" + parent = out / ('fixture-' + tag) + parent.mkdir() + target = parent / MUTANT_CASE + target.mkdir() + source = raw / MUTANT_CASE + for path in sorted(source.rglob('*')): + dest = target / path.relative_to(source) + require(not path.is_symlink(), 'mutation source symlink refused') + if path.is_dir(): + dest.mkdir() + elif path.is_file(): + check_budget(out, deadline) + require(output_size(out) + path.stat().st_size <= CONTROL_OUTPUT_BYTES, + 'fixture copy fits fixed aggregate scratch limit') + shutil.copyfile(path, dest) + else: + require(False, 'ordinary mutation source entry') + return target + + +def rewrite_residuals(case): + """Recompute b-Cz for EVERY retained state from actual full exported blocks. + + KKT is [A,-B^T;-B,0], b=[rhs,0]. Lower b-Cz is +Bu; + it is not the correction API's desired constraint -Bu. + """ + fields, rows = load_csv(case / 'states.csv') + _, loads = load_csv(case / 'loads.csv') + rhs = [represented(r['rhs']) for r in sorted(loads, key=lambda r: int(r['index']))] + nv = len(rhs) + _, factors = load_csv(case / 'factors.csv') + _, matrices = load_csv(case / 'operators' / 'matrices.csv') + b_rows = [r for r in matrices if r['block'] == 'B'] + nc = 1 + max(int(r['row']) for r in b_rows) + a = [[F(0)] * nv for _ in range(nv)] + b = [[F(0)] * nv for _ in range(nc)] + for r in factors: + if r['block'] == 'A': + a[int(r['row'])][int(r['column'])] = represented(r['value']) + for r in b_rows: + b[int(r['row'])][int(r['column'])] = represented(r['value']) + for iteration in range(4): + state = [r for r in rows if r['method'] == 'selected' and int(r['iteration']) == iteration] + u = {int(r['index']): represented(r['value']) for r in state if r['kind'] == 'u'} + p = {int(r['index']): represented(r['value']) for r in state if r['kind'] == 'p'} + require(set(u) == set(range(nv)) and set(p) == set(range(nc)), 'complete mutation state') + ru = [rhs[i] - sum((a[i][j] * u[j] for j in range(nv)), F(0)) + + sum((b[c][i] * p[c] for c in range(nc)), F(0)) for i in range(nv)] + rp = [sum((b[c][j] * u[j] for j in range(nv)), F(0)) for c in range(nc)] + for r in state: + r['original_residual'] = render((ru if r['kind'] == 'u' else rp)[int(r['index'])]) + save_csv(case / 'states.csv', fields, rows) + + +def rewrite_rhs(case, *, body_factor=None, boundary=None): + fields, rows = load_csv(case / 'loads.csv') + for r in rows: + index = int(r['index']) + if body_factor is not None: + r['body'] = render(represented(r['body']) * body_factor) + if boundary is not None: + r['boundary'] = render(boundary[index]) + r['rhs'] = render(represented(r['body']) + represented(r['boundary'])) + save_csv(case / 'loads.csv', fields, rows) + rewrite_residuals(case) + + +def boundary_load_from_rows(case, points, basis): + _, nodes = load_csv(case / 'operators' / 'nodes.csv') + active = {int(r['active']): int(r['axis']) for r in nodes if r['active'] != ''} + weighted = {int(r['q']): (represented(r['gx_weight']), represented(r['gy_weight'])) for r in points} + boundary = [F(0)] * len(active) + for r in basis: + i = int(r['index']) + boundary[i] += represented(r['phi']) * weighted[int(r['q'])][active[i]] + return boundary + + +def pressure_traction(case, pressure_multiplier): + """Keep the viscous contribution; change only the analytic -p n term.""" + fields, points = load_csv(case / 'traction-points.csv') + for r in points: + x, y = represented(r['x']), represented(r['y']) + p = 1 + x + 2 * y + x * y # fixed L=U=tau=1 continuum problem + for value, normal in (('gx_weight', 'nx_weight'), ('gy_weight', 'ny_weight')): + r[value] = render(represented(r[value]) + (1 - pressure_multiplier) * p * represented(r[normal])) + save_csv(case / 'traction-points.csv', fields, points) + _, basis = load_csv(case / 'traction-basis.csv') + rewrite_rhs(case, boundary=boundary_load_from_rows(case, points, basis)) + + +def two_point_degree4(case): + """Three rows, degree0..3 Gauss2 moments, but incorrect degree4 moments. + + Use t=(-a,+a,+a) mapped onto [0,1], weights=(.5,.25,.25). + Rebuild points, normal weights, continuum g, basis phi and boundary/RHS. + No row-count/parser defect is introduced; the degree-four guard must reject. + """ + pf, points = load_csv(case / 'traction-points.csv') + bf, _ = load_csv(case / 'traction-basis.csv') + _, segments = load_csv(case / 'operators' / 'segments.csv') + _, node_rows = load_csv(case / 'operators' / 'nodes.csv') + _, _, meta = input_rows(case) + mu, depth = number(meta['mu']), number(meta['Href']) + n = int(meta['n']) + h = number(meta['extent']) / n + active = {int(r['active']): r for r in node_rows if r['active'] != ''} + by_record = {} + for r in points: + by_record.setdefault(int(r['record']), []).append(r) + t_minus, t_plus = (1 - 1 / math.sqrt(3)) / 2, (1 + 1 / math.sqrt(3)) / 2 + basis = [] + require(by_record, 'nonempty copied physical traction segments') + for record, group in by_record.items(): + segment = segments[record] + require(int(segment['segment']) == record and segment['kind'] == 'global' and len(group) == 3, + 'three existing rows per physical segment') + ax, ay, bx, by = (number(segment[k]) for k in ('ax', 'ay', 'bx', 'by')) + for r, t, weight in zip(group, (t_minus, t_plus, t_plus), (.5, .25, .25)): + x, y = ax + t * (bx - ax), ay + t * (by - ay) + nx, ny = (by - ay) * weight * depth, (ax - bx) * weight * depth + p = 1 + x + 2 * y + x * y + xx, xy, yy = -p + 4 * mu * (x + y), 2 * mu * (x - y), -p - 4 * mu * (x + y) + for key, value in zip(('x', 'y', 'nx_weight', 'ny_weight', 'gx_weight', 'gy_weight'), + (x, y, nx, ny, xx * nx + xy * ny, xy * nx + yy * ny)): + r[key] = render(value) + for i, node in sorted(active.items()): + phi = max(0., 1 - abs((x - number(node['x'])) / h)) * max(0., 1 - abs((y - number(node['y'])) / h)) + if phi != 0: + basis.append({'q': r['q'], 'index': str(i), 'phi': render(phi)}) + save_csv(case / 'traction-points.csv', pf, points) + save_csv(case / 'traction-basis.csv', bf, basis) + rewrite_rhs(case, boundary=boundary_load_from_rows(case, points, basis)) + + +def wrong_phase(case): + fields, rows, _ = input_rows(case) + for r in rows: + if r['key'] == 'phase': + require(r['value'] == 'origin', 'chosen origin-phase source') + r['value'] = 'quarter' + save_csv(case / 'input.csv', fields, rows) + + +def wrong_source(case): + fields, rows = load_csv(case / 'operators' / 'source.csv') + rows[0]['x'] = render(represented(rows[0]['x']) + F(1, 1024)) + save_csv(case / 'operators' / 'source.csv', fields, rows) + fields, meta, _ = input_rows(case) + value = number(rows[0]['x']) + import struct # stdlib bit identity, never an oracle/scientific import + for r in meta: + if r['key'] == 'vertex_0_0': + r['value'] = render(value) + r['bits'] = str(struct.unpack('Q', struct.pack('d', value))[0]) + save_csv(case / 'input.csv', fields, meta) + + +def wrong_p0_trace(case): + fields, rows = load_csv(case / 'operators' / 'cells.csv') + active = [r for r in rows if r['pressure'] != ''] + require(len(active) >= 2, 'two physical P0 pressure cells') + active[0]['pressure'], active[1]['pressure'] = active[1]['pressure'], active[0]['pressure'] + save_csv(case / 'operators' / 'cells.csv', fields, rows) + + +def wrong_final_velocity(case): + fields, rows = load_csv(case / 'states.csv') + chosen = [r for r in rows if (r['method'], r['iteration'], r['kind'], r['index']) == ('selected', '3', 'u', '0')] + require(len(chosen) == 1, 'one final chosen velocity coefficient') + old = number(chosen[0]['value']) + step = max(.125, 4 * math.ulp(old)) + bad = old + step + if not math.isfinite(bad): + bad = old - step + require(math.isfinite(bad) and abs(F.from_float(bad) - F.from_float(old)) >= F(1, 8), + 'material representable wrong final coefficient') + chosen[0]['value'] = render(bad) + save_csv(case / 'states.csv', fields, rows) + rewrite_residuals(case) + + +def nan_body(case): + fields, rows = load_csv(case / 'loads.csv') + rows[0]['body'] = 'NaN' + save_csv(case / 'loads.csv', fields, rows) + + +def duplicate_load_index(case): + fields, rows = load_csv(case / 'loads.csv') + rows.append(dict(rows[0])) + save_csv(case / 'loads.csv', fields, rows) + + +def missing_zero_matrix_entry(case): + path = case / 'operators' / 'matrices.csv' + fields, rows = load_csv(path) + chosen = next((i for i, row in enumerate(rows) if represented(row['value']) == 0), None) + require(chosen is not None, 'existing zero dense entry for targeted malformed control') + del rows[chosen] + save_csv(path, fields, rows) + + +def missing_final_iteration(case): + path = case / 'states.csv' + fields, rows = load_csv(path) + rows = [row for row in rows if not (row['method'] == 'selected' and row['iteration'] == '3')] + save_csv(path, fields, rows) + + +def failed_guards(report): + gates = report.get('gates') + require(isinstance(gates, dict) and (gates or report.get('status') == 'native-refused'), + 'frozen analyzer named mathematical gates') + for name, gate in gates.items(): + require(isinstance(name, str) and isinstance(gate, dict) and isinstance(gate.get('pass'), bool), + 'named gate result schema') + decoded = {} + for key in ('value', 'limit'): + rational = gate.get(key) + require(isinstance(rational, dict) and set(rational) == {'numerator', 'denominator'} + and all(isinstance(rational[k], str) for k in rational), 'exact rational gate schema') + require(all(len(text) <= INTEGER_DECIMAL_CHAR_LIMIT for text in rational.values()), + 'bounded rational decimal text') + integers = {part: int(text) for part, text in rational.items()} + require(all(value.bit_length() <= INTEGER_BIT_LIMIT for value in integers.values()), + 'bounded rational integer bits') + require(integers['denominator'] > 0, 'positive rational gate denominator') + decoded[key] = F(integers['numerator'], integers['denominator']) + value, limit = (decoded[key] for key in ('value', 'limit')) + require(gate['pass'] == (value <= limit), 'gate boolean matches exact value and limit') + return [name for name, gate in gates.items() if not gate['pass']] + + +def main(): + # Bounded report codec policy, scoped to this explicitly invoked CLI. + # It changes neither scientific tolerances nor the represented fractions. + sys.set_int_max_str_digits(INTEGER_DECIMAL_CHAR_LIMIT) + require(len(sys.argv) == 3, 'usage check_oracle.py NATIVE_ROOT FRESH_OUTPUT') + raw = Path(sys.argv[1]).resolve() + out = Path(sys.argv[2]).absolute() + require(raw.is_dir() and not out.exists(), 'existing raw / fresh retained output') + require(not out.resolve().is_relative_to(raw), 'output outside immutable raw corpus') + require({p.name for p in raw.iterdir() if p.is_dir()} == set(CASES), 'exact nine native case directories') + before = inventory(raw) + analyzer = Path(__file__).with_name('analyze.py').resolve() + require(analyzer.is_file(), 'completed separately reviewed analyzer required') + source_freeze = {str(p): digest(p) for p in sorted(analyzer.parent.glob('*.py'))} + out.mkdir(parents=True) + budget_root = out / 'complete' + budget_root.mkdir() + output_limit = COMPLETE_OUTPUT_BYTES + started = time.monotonic() + deadline = started + COMPLETE_SECONDS + complete_cpu_start = child_cpu() + mode_cpu_start = complete_cpu_start + control_cpu_start = None + runs = [] + record = {'status': 'preparing', 'source_sha256': source_freeze, + 'native_before_sha256': before, 'limits': {'child_cpu_seconds': CHILD_SECONDS, + 'child_wall_seconds': CHILD_SECONDS, 'complete_mode_wall_seconds': MODE_SECONDS, + 'complete_three_mode_wall_seconds': COMPLETE_SECONDS, + 'control_total_wall_seconds': CONTROL_SECONDS, + 'address_bytes': ADDRESS_BYTES, 'complete_output_bytes': COMPLETE_OUTPUT_BYTES, + 'control_output_bytes': CONTROL_OUTPUT_BYTES, 'workers': 1}, + 'runs': runs, 'resource_feasibility': 'unmeasured; hard stop on limit'} + + def retain(): + (budget_root / 'report.json').write_text(json.dumps(record, indent=2, sort_keys=True, allow_nan=False) + '\n') + + def check_stage_budget(): + check_budget(budget_root, deadline, output_limit) + if control_cpu_start is None: + require(child_cpu() - complete_cpu_start < COMPLETE_SECONDS, 'complete total child CPU limit') + require(child_cpu() - mode_cpu_start < MODE_SECONDS, 'complete mode child CPU limit') + else: + require(child_cpu() - control_cpu_start < CONTROL_SECONDS, 'control total child CPU limit') + + def execute(tag, mode, flags, command_args, expected_guard=None, target_result=None, + input_refusal=False, numerical_failure=False): + check_stage_budget() + require({str(p): digest(p) for p in sorted(analyzer.parent.glob('*.py'))} == source_freeze, + 'oracle source set and bytes unchanged during checks') + result = target_result or budget_root / (tag + '-' + mode + '-result') + require(result.resolve().is_relative_to(budget_root.resolve()), 'result/logs inside accounted stage root') + require(not result.exists(), 'fresh analyzer output') + argv = [sys.executable, *flags, str(analyzer), *map(str, command_args), str(result)] + entry = {'tag': tag, 'mode': mode, 'argv': argv, 'expected_guard': expected_guard, + 'status': 'starting', 'peak_observed_rss': 0} + runs.append(entry) + retain() + previous_signal_mask = None + def limits(): + resource.setrlimit(resource.RLIMIT_AS, (ADDRESS_BYTES, ADDRESS_BYTES)) + resource.setrlimit(resource.RLIMIT_CPU, (CHILD_SECONDS, CHILD_SECONDS)) + resource.setrlimit(resource.RLIMIT_FSIZE, (output_limit, output_limit)) + resource.setrlimit(resource.RLIMIT_CORE, (0, 0)) + # The child must not carry the parent's creation-window signal mask. + signal.pthread_sigmask(signal.SIG_SETMASK, previous_signal_mask) + env = dict(os.environ, PYTHONDONTWRITEBYTECODE='1', OPENBLAS_NUM_THREADS='1', + OMP_NUM_THREADS='1', MKL_NUM_THREADS='1', BLIS_NUM_THREADS='1', NUMEXPR_NUM_THREADS='1') + child = None + child_started = time.monotonic() + stdout = budget_root / (tag + '-' + mode + '.stdout') + stderr = budget_root / (tag + '-' + mode + '.stderr') + try: + with stdout.open('xb') as so, stderr.open('xb') as se: + previous_signal_mask = signal.pthread_sigmask(signal.SIG_BLOCK, {signal.SIGINT, signal.SIGTERM}) + try: + child = subprocess.Popen(argv, stdin=subprocess.DEVNULL, stdout=so, stderr=se, + start_new_session=True, preexec_fn=limits, env=env) + finally: + # Pending signals are delivered only after child is owned. + signal.pthread_sigmask(signal.SIG_SETMASK, previous_signal_mask) + while child.poll() is None: + check_stage_budget() + resident = observed_rss(child.pid) + entry['peak_observed_rss'] = max(entry['peak_observed_rss'], resident) + require(resident <= ADDRESS_BYTES, 'observed child RSS limit') + require(time.monotonic() - child_started < CHILD_SECONDS, 'fixed child wall limit') + time.sleep(.1) + child.wait() + check_stage_budget() + require(time.monotonic() - child_started < CHILD_SECONDS, 'final child wall limit') + entry.update(returncode=child.returncode, status='returned') + report_path = result / 'analysis.json' + if report_path.is_file(): + require(not input_refusal, 'malformed control reaches intended typed input refusal') + report = json.loads(report_path.read_text()) + bad = failed_guards(report) + passed = report.get('all_required_gates_pass') + require(report.get('status') in ('numerical-pass', 'numerical-fail', 'native-refused'), + 'declared scientific report disposition') + require(isinstance(passed, bool) and passed == (not bad and report['status'] != 'native-refused'), + 'scientific disposition matches named guards') + require(child.returncode == (0 if passed else 1), 'exit agrees with mathematical disposition') + if expected_guard is not None: + require(not passed and expected_guard in bad, 'intended mathematical guard rejects ' + tag) + else: + require(not numerical_failure, 'mathematical control retains complete negative numerical analysis') + require(expected_guard is not None and child.returncode == 1, 'complete deterministic report required') + lines = stderr.read_text().splitlines() + accepted = {'CV3 input guard: ' + expected_guard, + 'RuntimeError: CV3 input guard: ' + expected_guard} + require(any(line in accepted for line in lines), + 'exact named mathematical refusal, not parse/nonzero-exit alone') + report = None + entry['status'] = 'expected-disposition' + retain() + return result, report + except BaseException as error: + if child is not None and child.poll() is None: + try: + os.killpg(child.pid, signal.SIGKILL) + except ProcessLookupError: + pass + child.wait() + entry.update(status='refused', reason=str(error)) + if child is not None: + entry['returncode'] = child.returncode + retain() + raise + + try: + retain() + complete_reports = {} + baseline_case = None + original_scientific = {} + record['original_scientific_dispositions'] = original_scientific + for mode, flags in MODES: + deadline = min(started + COMPLETE_SECONDS, time.monotonic() + MODE_SECONDS) + mode_cpu_start = child_cpu() + per_case = budget_root / ('complete-' + mode + '-cases') + per_case.mkdir() + for case in CASES: + _, report = execute('complete-' + case, mode, flags, ('case', raw / case), target_result=per_case / case) + require(report is not None and report.get('case') == case, 'full original case identity retained') + original_scientific[mode + '/' + case] = report['all_required_gates_pass'] + if mode == 'normal' and case == MUTANT_CASE: + baseline_case = report + check_budget(budget_root, deadline, output_limit) + result, report = execute('complete-aggregate', mode, flags, ('aggregate', raw, per_case)) + original_scientific[mode + '/aggregate'] = report['all_required_gates_pass'] + complete_reports[mode] = {'aggregate': result / 'analysis.json', + **{case: per_case / case / 'analysis.json' for case in CASES}} + require(all(identical_files(complete_reports['normal'][key], complete_reports[mode][key]) + for mode in ('O', 'OO') for key in (*CASES, 'aggregate')), + 'all nine full case and aggregate scientific reports byte-identical') + record.update(status='complete-modes-finished', complete_modes_byte_identical=True) + record['original_scientific_dispositions'] = original_scientific + record['original_scientific_gates_pass'] = all(original_scientific.values()) + retain() + budget_root = out / 'controls' + budget_root.mkdir() + output_limit = CONTROL_OUTPUT_BYTES + deadline = time.monotonic() + CONTROL_SECONDS + control_cpu_start = child_cpu() + record['status'] = 'checking-retained-mutations' + retain() + recipes = ( + ('omitted-pressure-traction', 'audit', 'exact-pressure-traction', lambda c: pressure_traction(c, F(0))), + ('wrong-pressure-traction', 'audit', 'exact-pressure-traction', lambda c: pressure_traction(c, F(5, 4))), + ('reversed-pressure-traction', 'audit', 'exact-pressure-traction', lambda c: pressure_traction(c, F(-1))), + ('omitted-body-force', 'audit', 'exact-body-load', lambda c: rewrite_rhs(c, body_factor=F(0))), + ('wrong-body-force', 'audit', 'exact-body-load', lambda c: rewrite_rhs(c, body_factor=F(5, 4))), + ('wrong-phase', 'audit', 'phase-identity', wrong_phase), + ('wrong-source', 'audit', 'source-identity', wrong_source), + ('wrong-P0-trace', 'audit', 'pressure-trace-binding', wrong_p0_trace), + ('degree3-oblique-rule', 'audit', 'traction-degree4-moments', two_point_degree4), + ('self-consistent-wrong-final-u', 'case', 'solution-R1-velocity', wrong_final_velocity), + ) + malformed = ( + ('NaN-body-field', 'audit', 'nonfinite field', nan_body), + ('duplicate-load-index', 'audit', 'duplicate index', duplicate_load_index), + ('missing-zero-dense-entry', 'audit', 'complete dense blocks including zeros', missing_zero_matrix_entry), + ('missing-final-state-iteration', 'audit', 'all four selected states', missing_final_iteration), + ) + identity_guards = {'phase-identity', 'source-identity', 'pressure-trace-binding'} + require(baseline_case is not None and baseline_case['status'] != 'native-refused', + 'complete structurally valid original mutant-case report is required') + for tag, kind, guard, mutate in recipes + malformed: + is_malformed = (tag, kind, guard, mutate) in malformed + if not is_malformed and guard not in identity_guards: + require(guard in baseline_case['gates'] and baseline_case['gates'][guard]['pass'], + 'untouched case target guard must pass before mutation: ' + guard) + fixture = copied_case(raw, budget_root, tag, deadline) + mutate(fixture) + after = inventory(fixture) + reference = {str(p.relative_to(raw / MUTANT_CASE)): digest(p) + for p in sorted((raw / MUTANT_CASE).rglob('*')) if p.is_file()} + require(after != reference, 'mutation changed independent copied bytes') + (budget_root / (tag + '-fixture-sha256.json')).write_text(json.dumps(after, sort_keys=True, indent=2) + '\n') + for mode, flags in MODES: + execute(tag, mode, flags, (kind, fixture), guard, input_refusal=is_malformed, + numerical_failure=not is_malformed and guard not in identity_guards) + require(inventory(fixture) == after, 'analyzer leaves retained mutant unchanged') + record.update(status='completed', all_tooling_contracts_pass=True, + complete_modes_byte_identical=True, mutation_fixtures=len(recipes), + malformed_fixtures=len(malformed), subprocess_checks=len(runs), + scientific_scope='fixed nine cases only') + require(len(runs) == 72, 'fixed 30 complete plus 42 control subprocess dispositions') + except BaseException as error: + record.update(status='refused', reason=str(error), all_tooling_contracts_pass=False) + raise + finally: + try: + after = inventory(raw) + except BaseException as error: + record.update(original_corpus_unchanged=False, original_corpus_inventory_error=str(error), + status='refused', all_tooling_contracts_pass=False) + retain() + raise + record['native_after_sha256'] = after + record['original_corpus_unchanged'] = after == before + if after != before: + record.update(status='refused', all_tooling_contracts_pass=False) + retain() + require(after == before, 'all original raw file hashes unchanged after checks/refusal') + print(json.dumps({'all_tooling_contracts_pass': True, + 'original_scientific_gates_pass': record['original_scientific_gates_pass'], + 'subprocess_checks': len(runs)}, sort_keys=True)) + + +if __name__ == '__main__': + def interrupted(signum, frame): + raise InterruptedError('CV3 harness interrupted by SIGTERM') + + previous_sigterm = signal.signal(signal.SIGTERM, interrupted) + try: + try: + main() + except Exception as error: + print(str(error), file=sys.stderr) + sys.exit(1) + finally: + signal.signal(signal.SIGTERM, previous_sigterm) diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/continuum.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/continuum.py new file mode 100644 index 00000000..4e1e7304 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/continuum.py @@ -0,0 +1,107 @@ +"""Prospective exact CV3 continuum loads and reconstructed physical fields.""" +from fractions import Fraction as F +import exact_polynomial as ep +import exact_operators as eo +from validated import require +from bounded_norms import fan + + +def fields(mu): + mu = F(mu); x, y = ep.X, ep.Y; one = ep.constant(1) + xx, yy, xy = ep.multiply(x, x), ep.multiply(y, y), ep.multiply(x, y) + u = (ep.add(xx, ep.scale(xy, 2)), ep.add(ep.scale(xy, -2), ep.scale(yy, -1))) + p = ep.add(one, x, ep.scale(y, 2), xy) + visc = ep.scale(ep.add(x, y), 4*mu) + sigma = (ep.add(ep.scale(p, -1), visc), ep.scale(ep.add(x, ep.scale(y, -1)), 2*mu), ep.add(ep.scale(p, -1), ep.scale(visc, -1))) + div_sigma = (ep.add(ep.derivative(sigma[0], 0), ep.derivative(sigma[1], 1)), ep.add(ep.derivative(sigma[1], 0), ep.derivative(sigma[2], 1))) + body = tuple(ep.add(v, ep.scale(d, -1)) for v, d in zip(u, div_sigma)) + require(ep.add(ep.derivative(u[0], 0), ep.derivative(u[1], 1)) == {}, 'exact continuum incompressibility') + return {'u': u, 'p': p, 'sigma': sigma, 'body': body} + + +def integral(poly, patch): + return sum((v*patch['moments'][e] for e, v in poly.items()), F(0)) + + +def exact_loads(op): + f = fields(op['mu']); nv = len(op['active']); amap = {g: i for i, g in enumerate(op['active'])} + body = [F(0)]*nv; boundary = [F(0)]*nv + for patch in op['patches']: + if not patch['area']: + continue + for node, phi, dx, dy in patch['local']: + body[amap[node['global']]] += integral(ep.multiply(phi, f['body'][node['axis']]), patch) + for segment in op['segments']: + if segment['kind'] != 'global': + continue + a, b = segment['a'], segment['b']; nx, ny = segment['normal'] + traction_measure = (ep.add(ep.scale(f['sigma'][0], nx), ep.scale(f['sigma'][1], ny)), + ep.add(ep.scale(f['sigma'][1], nx), ep.scale(f['sigma'][2], ny))) + midpoint = tuple((a[d]+b[d])/2 for d in range(2)) + for i, g in enumerate(op['active']): + node = op['nodes'][g] + phi = eo.hat(node, midpoint, op['h']) + boundary[i] += ep.segment_integral_parameter(ep.multiply(phi, traction_measure[node['axis']]), a, b) + return {'body': body, 'boundary': boundary, 'rhs': [a+b for a, b in zip(body, boundary)]+[F(0)]*len(op['cells']), 'fields': f} + + +def reconstruction(op, velocity, pressure): + require(len(velocity) == len(op['active']) and len(pressure) == len(op['cells']), 'complete physical state') + amap = {g: i for i, g in enumerate(op['active'])}; cmap = {c: i for i, c in enumerate(op['cells'])} + out = [] + for patch in op['patches']: + if not patch['area']: + continue + u = [{}, {}] + for node, phi, dx, dy in patch['local']: + d = node['axis']; u[d] = ep.add(u[d], ep.scale(phi, velocity[amap[node['global']]])) + p = ep.constant(pressure[cmap[patch['cell']]]) + mu = op['mu'] + sigma = (ep.add(ep.scale(ep.derivative(u[0], 0), 2*mu), ep.scale(p, -1)), + ep.scale(ep.add(ep.derivative(u[0], 1), ep.derivative(u[1], 0)), mu), + ep.add(ep.scale(ep.derivative(u[1], 1), 2*mu), ep.scale(p, -1))) + out.append({'patch': patch, 'u': tuple(u), 'p': p, 'sigma': sigma}) + return out + + +def volume_items(reconstructed, field, exact): + items = [] + for piece in reconstructed: + got = piece[field] if field == 'u' else (piece[field],) + expected = exact if field == 'u' else (exact,) + error = tuple(ep.add(a, ep.scale(b, -1)) for a, b in zip(got, expected)) + items.extend(('triangle', error, tri) for tri in fan(piece['patch']['poly'])) + return items + + +def boundary_pieces(op, reconstructed): + # Clip every physical source edge by actual common boxes. A source segment + # lying on a box boundary could have two owners; choose its liquid-side + # interior by exact CCW orientation, not epsilon displacements. + out = [] + for edge, (a, b) in enumerate(zip(op['source'], op['source'][1:]+op['source'][:1])): + nx, ny = b[1]-a[1], a[0]-b[0] + cuts = [] + for piece in reconstructed: + patch = piece['patch']; segment = ep.clip_segment(a, b, patch['lo'], patch['hi']) + if segment is None: + continue + pa, pb = segment; mid = tuple((pa[d]+pb[d])/2 for d in range(2)) + # The inward direction (-nx,-ny) must enter this patch or remain + # tangential. This excludes only the dry-side ownership at a knot. + admissible = all(not (mid[d] == patch['lo'][d] and (nx, ny)[d] > 0) + and not (mid[d] == patch['hi'][d] and (nx, ny)[d] < 0) for d in range(2)) + if admissible: + cuts.append((pa, pb, piece)) + # Exact coverage, no duplicated ownership or unrepresented length. + axis = 0 if b[0] != a[0] else 1 + intervals = sorted((((pa[axis]-a[axis])/(b[axis]-a[axis]), (pb[axis]-a[axis])/(b[axis]-a[axis]), pa, pb, piece) + for pa, pb, piece in cuts), key=lambda r: (r[0], r[1])) + cursor = F(0) + for t0, t1, pa, pb, piece in intervals: + require(t0 == cursor and t0 < t1, 'exact boundary ownership/coverage') + cursor = t1 + out.append({'edge': edge, 'a': pa, 'b': pb, 'source_a': a, 'source_b': b, + 'parameter_weight': t1-t0, 'normal_measure': (nx, ny), 'piece': piece}) + require(cursor == 1, 'complete physical source edge coverage') + return out diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/cross_phase.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/cross_phase.py new file mode 100644 index 00000000..b1874b97 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/cross_phase.py @@ -0,0 +1,39 @@ +"""Prospective same-polygon phase comparison on the exact union partition.""" +from fractions import Fraction as F +import exact_polynomial as ep +from continuum import reconstruction +from physical_norms import metrics_reconstructed +from validated import require + + +def common_reconstruction(op_a, ua, pa, op_b, ub, pb, budget): + require(op_a['source'] == op_b['source'] and op_a['n'] == op_b['n'], 'same world source/level cross-phase') + a,b = reconstruction(op_a,ua,pa),reconstruction(op_b,ub,pb) + result = [] + for ra in a: + budget.check() + for rb in b: + lo = tuple(max(ra['patch']['lo'][d],rb['patch']['lo'][d]) for d in range(2)) + hi = tuple(min(ra['patch']['hi'][d],rb['patch']['hi'][d]) for d in range(2)) + if any(lo[d] >= hi[d] for d in range(2)): + continue + poly = ep.clip_box(op_a['source'],lo,hi); area = ep.signed_twice_area(poly)/2 + require(area >= 0, 'nonnegative exact cross-phase common domain') + if not area: + continue + result.append({'patch':{'lo':lo,'hi':hi,'poly':poly,'area':area}, + 'u':tuple(ep.add(x,ep.scale(y,-1)) for x,y in zip(ra['u'],rb['u'])), + 'p':ep.add(ra['p'],ep.scale(rb['p'],-1)), + 'sigma':tuple(ep.add(x,ep.scale(y,-1)) for x,y in zip(ra['sigma'],rb['sigma']))}) + require(sum((p['patch']['area'] for p in result),F(0)) == sum(op_a['volumes'],F(0)) == sum(op_b['volumes'],F(0)), 'exact complete union-partition coverage') + return result + + +def compare(op_a, ua, pa, op_b, ub, pb, analytic_fields, ledger): + reconstructed = common_reconstruction(op_a,ua,pa,op_b,ub,pb,ledger.budget) + zero_fields = {'u':({},{}),'p':{},'sigma':({},{},{})} + result = metrics_reconstructed(op_a,reconstructed,zero_fields,ledger,denominator_fields=analytic_fields) + result.pop('reconstructed') + result['common_positive_pieces'] = len(reconstructed) + result['decision'] = 'same-domain phase diagnostic with intervals; no pass cutoff' + return result diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/exact_operators.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/exact_operators.py new file mode 100644 index 00000000..51811d76 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/exact_operators.py @@ -0,0 +1,190 @@ +"""Prospective CV3 exact-integral operator/trace oracle, candidate-free. + +This independently reuses the reviewer's simplex polynomial primitives. It does +not import candidate code, native Gauss samples or rounded native operators. +No calculations run on import. Material/geometry inputs are exact Fractions of +represented native physical primitives; MU is NOT silently replaced by1/10. +""" +from fractions import Fraction as F +import exact_polynomial as ep + + +def require(condition,message): + if not condition:raise RuntimeError('CV3 exact-operator guard: '+message) + + +def zero(rows,cols):return [[F(0) for _ in range(cols)] for _ in range(rows)] + + +def split(a,b,planes): + cuts={F(0),F(1)} + for d in range(2): + if a[d]!=b[d]: + for plane in planes[d]: + t=(plane-a[d])/(b[d]-a[d]) + if 0=center+h:return {} + if point[d]<=center:factors.append(ep.scale(ep.add(coordinate,ep.constant(h-center)),1/h)) + else:factors.append(ep.scale(ep.add(ep.constant(h+center),ep.scale(coordinate,-1)),1/h)) + return ep.multiply(*factors) + + +def interval(source,axis,plane,lower,upper): + # Halfplane inequality in one scalar tangent coordinate. This is independent + # of native endpoint crossing/line-cache implementation. + for a,b in zip(source,source[1:]+source[:1]): + ex,ey=b[0]-a[0],b[1]-a[1] + alpha,beta=(ex,-ex*a[1]-ey*(plane-a[0])) if axis==0 else (-ey,ex*(plane-a[1])+ey*a[0]) + if alpha>0:lower=max(lower,-beta/alpha) + elif alpha<0:upper=min(upper,-beta/alpha) + elif beta<0:return None + if lower>=upper:return None + return ((plane,lower),(plane,upper)) if axis==0 else ((upper,plane),(lower,plane)) + + +def build(source,n,origin,extent,rho,mu): + source=[tuple(map(F,p)) for p in source];origin=tuple(map(F,origin));extent=F(extent) + rho,mu=F(rho),F(mu) + require(isinstance(n,int) and 2<=n<=16 and extent>0 and rho>0 and mu>0,'bounded shape/material') + require(len(source)>=3 and len(set(source))==len(source) and ep.signed_twice_area(source)>0,'unique CCW source') + for a,b in zip(source,source[1:]+source[:1]): + require(all(ep.cross((b[0]-a[0],b[1]-a[1]),(p[0]-a[0],p[1]-a[1]))>=0 for p in source),'convex represented source') + h=extent/n + require(all(origin[d]+h/2<=p[d]<=origin[d]+extent-h/2 for p in source for d in range(2)), 'complete component nodal hulls') + nodes=[];lookup={} + for axis in range(2): + counts=(n+1,n) if axis==0 else (n,n+1) + shift=(F(0),F(1,2)) if axis==0 else (F(1,2),F(0)) + for j in range(counts[1]): + for i in range(counts[0]): + node={'global':len(nodes),'axis':axis,'face':i+counts[0]*j,'i':i,'j':j, + 'point':tuple(origin[d]+((i,j)[d]+shift[d])*h for d in range(2))} + lookup[axis,i,j]=node;nodes.append(node) + planes=[[origin[d]+i*h/2 for i in range(2*n+1)] for d in range(2)] + patches=[];flags=set();volumes=[F(0)]*(n*n) + for j in range(2*n): + for i in range(2*n): + lo=(planes[0][i],planes[1][j]);hi=(planes[0][i+1],planes[1][j+1]) + poly=ep.clip_box(source,lo,hi);area=ep.signed_twice_area(poly)/2 + require(area>=0,'nonnegative exact common cut') + local=[];moments={};cell=i//2+n*(j//2) + if area: + require(i>0 and j>0 and i+1<2*n and j+1<2*n,'positive region has complete basis halo') + for axis in range(2): + ix,iy=(i//2,(j-1)//2) if axis==0 else ((i-1)//2,j//2) + shift=(F(0),F(1,2)) if axis==0 else (F(1,2),F(0)) + elo=(origin[0]+(ix+shift[0])*h,origin[1]+(iy+shift[1])*h);ehi=tuple(x+h for x in elo) + for dj in range(2): + for di in range(2): + node=lookup[axis,ix+di,iy+dj] + phi=ep.q1_on_element(node['point'],elo,ehi) + local.append((node,phi,ep.derivative(phi,0),ep.derivative(phi,1))) + flags.add(node['global']) + moments={(a,b):ep.polygon_integral({(a,b):F(1)},poly) for a in range(5) for b in range(5-a)} + volumes[cell]+=area + else:poly=[] + patches.append({'i':i,'j':j,'cell':cell,'lo':lo,'hi':hi,'poly':poly,'area':area,'local':local,'moments':moments}) + active=sorted(flags);amap={g:i for i,g in enumerate(active)} + cells=[c for c,a in enumerate(volumes) if a>0];cmap={c:i for i,c in enumerate(cells)} + nv,nc=len(active),len(cells);require(nv>0 and nc>0,'positive active/pressure spaces') + require(nv<=544 and nc<=256,'declared bounded dimensions') + M,K,B=zero(nv,nv),zero(nv,nv),zero(nc,nv) + H1=zero(nv,nv) + G,moment=zero(nv,3),zero(nv,3) + def integral(poly,p):return sum((v*p['moments'][e] for e,v in poly.items()),F(0)) + for p in patches: + if not p['area']:continue + c=cmap[p['cell']] + for node,phi,dx,dy in p['local']: + i=amap[node['global']];axis=node['axis'] + B[c][i]+=integral(dx if axis==0 else dy,p) + if axis==0: + G[i][0]+=integral(dx,p);G[i][1]+=integral(dy,p) + moment[i][0]+=rho*integral(phi,p);moment[i][2]-=rho*integral(ep.multiply(ep.Y,phi),p) + strain=(dx,{},dy) + else: + G[i][1]+=integral(dx,p);G[i][2]+=integral(dy,p) + moment[i][1]+=rho*integral(phi,p);moment[i][2]+=rho*integral(ep.multiply(ep.X,phi),p) + strain=({},dy,dx) + for node2,phi2,dx2,dy2 in p['local']: + k=amap[node2['global']];axis2=node2['axis'] + if axis==axis2: + M[i][k]+=rho*integral(ep.multiply(phi,phi2),p) + H1[i][k]+=integral(ep.add(ep.multiply(phi,phi2),ep.multiply(dx,dx2),ep.multiply(dy,dy2)),p) + s2=(dx2,{},dy2) if axis2==0 else ({},dy2,dx2) + K[i][k]+=mu*integral(ep.add(*(ep.scale(ep.multiply(strain[d],s2[d]),2 if d<2 else 1) for d in range(3))),p) + TG,PF,GF=zero(nv,3),zero(nc,nv),zero(nc,nv);faces={};segments=[] + def add(kind,owner,axis,edge,a,b): + for a,b in split(a,b,planes): + midpoint=tuple((a[d]+b[d])/2 for d in range(2));normal=(b[1]-a[1],a[0]-b[0]) + integrals=[ep.segment_integral_parameter(hat(nodes[g],midpoint,h),a,b) for g in active] + flux=[v*normal[nodes[g]['axis']] for g,v in zip(active,integrals)] + if kind=='global': + for i,g in enumerate(active): + if nodes[g]['axis']==0: + TG[i][0]+=integrals[i]*normal[0];TG[i][1]+=integrals[i]*normal[1] + else: + TG[i][1]+=integrals[i]*normal[0];TG[i][2]+=integrals[i]*normal[1] + elif kind=='grid': + row=faces.setdefault((axis,owner),[F(0)]*nv) + for i,v in enumerate(flux):row[i]+=v + else: + for i,v in enumerate(flux):PF[cmap[owner]][i]+=v + segments.append({'kind':kind,'owner':owner,'axis':axis,'edge':edge,'a':a,'b':b,'basis_integrals':integrals,'normal':normal}) + for edge,(a,b) in enumerate(zip(source,source[1:]+source[:1])):add('global',edge,2,edge,a,b) + for axis in range(2): + for face in range(n*(n+1)): + normal,tangent=(face%(n+1),face//(n+1)) if axis==0 else (face//n,face%n) + piece=interval(source,axis,origin[axis]+normal*h,origin[1-axis]+tangent*h,origin[1-axis]+(tangent+1)*h) + if piece:add('grid',face,axis,None,*piece) + for cell in cells: + lo=(origin[0]+(cell%n)*h,origin[1]+(cell//n)*h);hi=tuple(x+h for x in lo) + for edge,(a,b) in enumerate(zip(source,source[1:]+source[:1])): + piece=ep.clip_segment(a,b,lo,hi) + if piece:add('cell',cell,2,edge,*piece) + for c,cell in enumerate(cells): + i,j=cell%n,cell//n + for axis,face,sign in ((0,i+(n+1)*j,-1),(0,i+1+(n+1)*j,1),(1,i+n*j,-1),(1,i+n*(j+1),1)): + for k,v in enumerate(faces.get((axis,face),[F(0)]*nv)):GF[c][k]+=sign*v + require(TG==G,'exact source-stress/volume derivative identity') + require(all(B[c][i]==GF[c][i]+PF[c][i] for c in range(nc) for i in range(nv)),'exact each-cell physical flux bridge') + require(M==list(map(list,zip(*M))) and K==list(map(list,zip(*K))), 'exact symmetric Gram blocks') + require(all(M[i][i]>0 for i in range(nv)), 'positive full mass diagonal') + rank,pivots=ep.exact_rank(B);require(rank==nc,'exact full pressure rank without gauge') + old_dual=[] + for g in active: + point=nodes[g]['point'] + old_dual.append(ep.polygon_integral(ep.constant(1),ep.clip_box(source, + tuple(x-h/2 for x in point),tuple(x+h/2 for x in point)))) + return {'n':n,'h':h,'origin':origin,'rho':rho,'mu':mu,'source':source,'nodes':nodes,'active':active, + 'cells':cells,'M':M,'K':K,'B':B,'H1':H1,'gradient':G,'trace_gradient':TG,'moment':moment, + 'grid_flux':GF,'physical_flux':PF,'segments':segments,'volumes':volumes,'old_dual':old_dual, + 'patches':patches,'rank':rank,'rank_pivots':pivots} + + +def system(operators,dt): + dt=F(dt);require(dt>0,'positive timestep') + M,K,B=operators['M'],operators['K'],operators['B'];nv=len(M);nc=len(B) + a=[[M[i][j]/dt+K[i][j] for j in range(nv)] for i in range(nv)] + return [a[i]+[-B[c][i] for c in range(nc)] for i in range(nv)]+[[-x for x in row]+[F(0)]*nc for row in B] + + +def load(operators,gradient,pressure): + require(len(gradient)==4,'four represented affine-gradient primitives') + ax,ay,bx,by=map(F,gradient);mu=operators['mu'];pressure=F(pressure) + sigma=(2*mu*ax-pressure,mu*(ay+bx),2*mu*by-pressure) + return [sum((g[d]*sigma[d] for d in range(3)),F(0)) for g in operators['trace_gradient']] + + +def rhs(operators,dt,star,traction_load): + dt=F(dt);M=operators['M'];nv=len(M);nc=len(operators['B']) + require(dt>0 and len(star)==nv and len(traction_load)==nv,'complete state/load and positive dt') + return [sum((M[i][j]*F(star[j]) for j in range(nv)),F(0))/dt+F(traction_load[i]) for i in range(nv)]+[F(0)]*nc diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/exact_polynomial.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/exact_polynomial.py new file mode 100644 index 00000000..50d13819 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/exact_polynomial.py @@ -0,0 +1,184 @@ +"""Independent rational CV1 geometry/polynomial primitives; no candidate imports. + +Prepared prospectively. This module performs no work on import. Its use against +native raw evidence waits for source/protocol freeze and execution authorization. +Polynomials map (x power,y power) to fractions; inputs are represented floats. +""" +from fractions import Fraction as F +from math import factorial + +def require(condition,message): + if not condition: + raise RuntimeError(message) + +def represented(value): + return F.from_float(float(value)) + +def constant(value): + value=F(value) + return {} if value==0 else {(0,0):value} + +X={(1,0):F(1)} +Y={(0,1):F(1)} + +def add(*polynomials): + result={} + for p in polynomials: + for power,value in p.items(): + result[power]=result.get(power,F(0))+value + return {power:value for power,value in result.items() if value} + +def scale(p,value): + value=F(value) + return {power:coefficient*value for power,coefficient in p.items() if coefficient*value} + +def multiply(a,b): + result={} + for (i,j),x in a.items(): + for (k,l),y in b.items(): + power=i+k,j+l + result[power]=result.get(power,F(0))+x*y + return {power:value for power,value in result.items() if value} + +def power(p,n): + require(n>=0,'nonnegative polynomial exponent') + result=constant(1) + for _ in range(n): + result=multiply(result,p) + return result + +def derivative(p,axis): + require(axis in (0,1),'polynomial axis') + result={} + for exponent,value in p.items(): + if exponent[axis]: + target=list(exponent);target[axis]-=1 + result[tuple(target)]=value*exponent[axis] + return result + +def evaluate(p,point): + return sum((value*point[0]**i*point[1]**j for (i,j),value in p.items()),F(0)) + +def substitute(p,x,y): + result={} + for (i,j),value in p.items(): + result=add(result,scale(multiply(power(x,i),power(y,j)),value)) + return result + +def cross(a,b): + return a[0]*b[1]-a[1]*b[0] + +def signed_twice_area(vertices): + return sum((cross(a,b) for a,b in zip(vertices,vertices[1:]+vertices[:1])),F(0)) + +def triangle_integral(p,triangle): + """Affine map to the standard simplex; analytic factorial monomial rule.""" + a,b,c=triangle + ab=(b[0]-a[0],b[1]-a[1]);ac=(c[0]-a[0],c[1]-a[1]) + determinant=cross(ab,ac) + require(determinant>0,'positive exact triangle orientation required') + x=add(constant(a[0]),scale(X,ab[0]),scale(Y,ac[0])) + y=add(constant(a[1]),scale(X,ab[1]),scale(Y,ac[1])) + local=substitute(p,x,y) + return determinant*sum((value*F(factorial(i)*factorial(j),factorial(i+j+2)) + for (i,j),value in local.items()),F(0)) + +def polygon_integral(p,vertices): + if len(vertices)<3: + return F(0) + result=F(0) + for i in range(1,len(vertices)-1): + triangle=vertices[0],vertices[i],vertices[i+1] + determinant=cross((triangle[1][0]-triangle[0][0],triangle[1][1]-triangle[0][1]), + (triangle[2][0]-triangle[0][0],triangle[2][1]-triangle[0][1])) + require(determinant>=0,'convex CCW fan required') + if determinant: + result+=triangle_integral(p,triangle) + return result + +def segment_integral_parameter(p,a,b): + """Integral from t=0 to1; multiply by oriented normal measure separately.""" + x=add(constant(a[0]),scale(X,b[0]-a[0])) + y=add(constant(a[1]),scale(X,b[1]-a[1])) + local=substitute(p,x,y) + require(all(j==0 for i,j in local),'univariate segment substitution') + return sum((value/F(i+1) for (i,j),value in local.items()),F(0)) + +def clip_halfplane(vertices,axis,plane,keep_above): + if not vertices: + return [] + result=[] + for a,b in zip(vertices,vertices[1:]+vertices[:1]): + ia=a[axis]>=plane if keep_above else a[axis]<=plane + ib=b[axis]>=plane if keep_above else b[axis]<=plane + if ia!=ib: + t=(plane-a[axis])/(b[axis]-a[axis]) + point=tuple(a[d]+t*(b[d]-a[d]) for d in range(2)) + if not result or result[-1]!=point: + result.append(point) + if ib and (not result or result[-1]!=b): + result.append(b) + if len(result)>1 and result[0]==result[-1]: + result.pop() + return result + +def clip_box(vertices,lo,hi): + require(all(lo[d]= 0, 'canonical nonnegative integer') + return out + + +def bits(value): + return struct.unpack('>Q',struct.pack('>d',real(value)))[0] + + +def from_bits(value): + return F.from_float(struct.unpack('>d',struct.pack('>Q',value))[0]) + + +def read(path, schema): + path = Path(path) + require(path.is_file() and not path.is_symlink(), 'missing/linked file '+str(path)) + with path.open(newline='') as handle: + reader = csv.DictReader(handle) + require(reader.fieldnames == schema.split(','), 'schema '+str(path)) + rows = list(reader) + require(all(None not in row and all(v is not None for v in row.values()) for row in rows), 'ragged CSV '+str(path)) + return rows + + +def indexed(rows, key, count): + out = {} + for row in rows: + i = integer(row[key]); require(i not in out, 'duplicate '+key) + out[i] = row + require(set(out) == set(range(count)), 'incomplete/extra '+key) + return out + + +def keyed(rows, key): + out = {} + for row in rows: + require(row[key] not in out, 'duplicate '+key); out[row[key]] = row + return out + + +def dense(rows, shapes): + out = {k:[[F(0)]*cols for _ in range(nr)] for k,(nr,cols) in shapes.items()}; seen = set() + for row in rows: + k = row['block']; require(k in shapes, 'known matrix block') + i,j = integer(row['row']),integer(row['column']) + require(i < shapes[k][0] and j < shapes[k][1] and (k,i,j) not in seen, 'block index/duplicate') + seen.add((k,i,j)); out[k][i][j] = fraction(row['value']) + require(len(seen) == sum(a*b for a,b in shapes.values()), 'complete dense blocks including zeros') + return out + + +def hashes(root): + return {str(p.relative_to(root)):hashlib.sha256(p.read_bytes()).hexdigest() for p in sorted(Path(root).rglob('*.csv'))} + + +def read_case(root): + root = Path(root); name = root.name + require(name in cases(), 'declared nine-case identity') + geometry,phase,n = cases()[name]; origin = F(0) if phase == 'origin' else F(1,4*n) + identity = keyed(read(root/'input.csv',TOP_SCHEMAS['input.csv']),'key') + numeric = {'rho':1.,'mu':.1,'dt':1.,'Lref':1.,'Uref':1.,'Href':1.,'tau_ref':1.,'extent':1., + 'origin_x':float(origin),'origin_y':float(origin)} + text = {'case':name,'geometry':geometry,'phase':phase,'source_csv_sha256':SOURCE_SHA[geometry], + 'model':'CV3-A-static-polygon-MMS-v1','field_load':'global-polynomial-continuum-v1', + 'basis':'CV1-full-consistent-Q1-P0','solver':'CV2-scaled-Cholesky-QR-refinement3-cap544', + 'traction_rule':'split-three-point-Gauss-v1','pressure_gauge':'none','u_star':'zero','n':str(n)} + vertices = {f'vertex_{i}_{d}':value for i,point in enumerate(SOURCE_BITS[geometry]) for d,value in enumerate(point)} + require(set(identity) == set(numeric)|set(text)|set(vertices), 'complete primitive metadata') + for key,value in numeric.items(): + reason = 'phase-identity' if key.startswith('origin_') else 'fixed primitive '+key + require(real(identity[key]['value']) == value and integer(identity[key]['bits']) == bits(value), reason) + for key,value in text.items(): + reason = 'phase-identity' if key in ('case','phase') else 'source-identity' if key in ('geometry','source_csv_sha256') else 'fixed method '+key + require(identity[key]['value'] == value and identity[key]['bits'] == '', reason) + for key,value in vertices.items(): + require(integer(identity[key]['bits']) == value and bits(identity[key]['value']) == value, 'source-identity') + require(hashlib.sha256((root/'operators/source.csv').read_bytes()).hexdigest() == SOURCE_SHA[geometry], 'source-identity') + source = [tuple(from_bits(v) for v in point) for point in SOURCE_BITS[geometry]] + if (root/'refusal.txt').exists(): + return {'name':name,'root':root,'native_refused':(root/'refusal.txt').read_text(),'input_sha256':hashes(root)} + expected = {f'operators/{k}' for k in SCHEMAS}|set(TOP_SCHEMAS) + require(set(hashes(root)) == expected, 'complete24-file native case corpus') + rows = {key:read(root/'operators'/key,schema) for key,schema in SCHEMAS.items()} + top = {key:read(root/key,schema) for key,schema in TOP_SCHEMAS.items()} + # Parse every represented numeric field, including diagnostic-only custody. + categorical = {'block','kind','method','name','gate'} + for key,rr in list(rows.items())+[(f'top/{k}',v) for k,v in top.items()]: + if key in ('meta.csv','input-meta.csv','top/input.csv'): + continue + for row in rr: + for field,value in row.items(): + if field not in categorical and value != '': + real(value) + metadata = {k:r['value'] for k,r in keyed(rows['meta.csv'],'key').items()} + require(set(metadata) == {'n','h','origin_x','origin_y','active','pressure_cells','patches','quadrature','segments','trace_points', + 'rho','mu','depth','velocity_basis','pressure_basis','operators_only','pressure_gauge'}, 'complete operator metadata') + for key in ('n','active','pressure_cells','patches','quadrature','segments','trace_points'): + integer(metadata[key]) + for key in ('h','origin_x','origin_y','rho','mu','depth'): + real(metadata[key]) + require(integer(metadata['patches']) == len(rows['patches.csv']) == 4*n*n + and integer(metadata['quadrature']) == len(rows['quadrature.csv']) + and integer(metadata['segments']) == len(rows['segments.csv']) + and integer(metadata['trace_points']) == len(rows['trace-points.csv']), 'complete native geometry record counts') + require((metadata['velocity_basis'],metadata['pressure_basis'],metadata['operators_only'],metadata['pressure_gauge']) == + ('staggered-continuous-Q1','primal-cut-P0','true','none'), 'fixed operator method metadata') + require(fraction(metadata['rho']) == 1 and fraction(metadata['mu']) == F.from_float(.1) and fraction(metadata['depth']) == 1, 'fixed operator material primitives') + imeta = {k:r['value'] for k,r in keyed(rows['input-meta.csv'],'key').items()} + require(set(imeta) == {'n','origin_x','origin_y','extent','rho','mu','depth','model'}, 'complete operator input metadata') + require(integer(imeta['n']) == n and fraction(imeta['origin_x']) == origin and fraction(imeta['origin_y']) == origin, 'phase-identity') + require(fraction(imeta['extent']) == 1 and fraction(imeta['rho']) == 1 and fraction(imeta['mu']) == F.from_float(.1) + and fraction(imeta['depth']) == 1 and imeta['model'] == 'CV1-operator-only', 'fixed operator input primitives') + require(integer(metadata['n']) == n and fraction(metadata['h']) == F(1,n), 'phase-identity') + require(fraction(metadata['origin_x']) == origin and fraction(metadata['origin_y']) == origin, 'phase-identity') + nv,nc = integer(metadata['active']),integer(metadata['pressure_cells']) + require(0 < nv <= 544 and 0 < nc <= 256 and nv+nc <= 800, 'bounded dimensions') + nodes = indexed(rows['nodes.csv'],'global',2*n*(n+1)) + cells = indexed(rows['cells.csv'],'cell',n*n) + mats = dense(rows['matrices.csv'],{'M':(nv,nv),'K':(nv,nv),'B':(nc,nv),'grid_flux':(nc,nv),'physical_flux':(nc,nv)}) + h1 = dense([dict(row,block='H1') for row in top['h1.csv']],{'H1':(nv,nv)})['H1'] + factor_shapes = {'A':(nv,nv),'scaled_A':(nv,nv),'L':(nv,nv),'Y':(nv,nc),'Z':(nv,nc),'Q':(nv,nc), + 'R':(nc,nc),'D':(nv,1),'E':(nc,1)} + factors = dense(top['factors.csv'],factor_shapes) + loads = indexed(top['loads.csv'],'index',nv) + loads = {k:[fraction(loads[i][k]) for i in range(nv)] for k in ('body','boundary','rhs')} + states = {} + for row in top['states.csv']: + require(row['method'] == 'selected' and row['kind'] in ('u','p'), 'fixed state method/kind') + it = integer(row['iteration']); i = integer(row['index']); kind = row['kind'] + require(it in range(4) and i < (nv if kind == 'u' else nc), 'fixed state iteration/index') + target = states.setdefault((it,kind),{}); require(i not in target, 'duplicate state coefficient') + target[i] = fraction(row['value']),fraction(row['original_residual']) + require(set(states) == {(it,k) for it in range(4) for k in ('u','p')}, 'all four selected states') + for (it,kind),vector in states.items(): + require(set(vector) == set(range(nv if kind == 'u' else nc)), 'complete state vector') + metrics = keyed(top['metrics.csv'],'name') + require(set(metrics) == NATIVE_GATES|NATIVE_OBSERVATIONS, 'complete native physical metrics') + require(all(r['kind'] == ('gate' if k in NATIVE_GATES else 'observation') for k,r in metrics.items()), 'metric classification') + metrics = {k:(r['kind'],fraction(r['value'])) for k,r in metrics.items()} + return {'name':name,'root':root,'n':n,'origin':(origin,origin),'source':source,'nv':nv,'nc':nc, + 'rows':rows,'top':top,'nodes':nodes,'cells':cells,'native':mats,'h1':h1,'factors':factors, + 'loads':loads,'states':states,'metrics':metrics,'input_sha256':hashes(root)} diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/physical_norms.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/physical_norms.py new file mode 100644 index 00000000..360f9944 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/physical_norms.py @@ -0,0 +1,121 @@ +"""Prospective physical norm intervals, including oblique traction measure.""" +from fractions import Fraction as F +import exact_polynomial as ep +from validated import require, sqrt_interval, ratio_interval, add_radius +from bounded_norms import l1_enclosure, volume_l2_squared, square_polynomial, supremum_bounds +from continuum import reconstruction, volume_items, boundary_pieces + + +def sum_intervals(items): + return sum((x[0] for x in items), F(0)), sum((x[1] for x in items), F(0)) + + +def squared_integral_interval(items): + q = volume_l2_squared([(p, tri) for kind, p, tri in items]) + require(q >= 0, 'nonnegative exact volume squared norm') + return sqrt_interval(q) + + +def norm_metrics(op, velocity, pressure, continuum_fields, ledger): + reconstructed = reconstruction(op, velocity, pressure) + return metrics_reconstructed(op,reconstructed,continuum_fields,ledger) + + +def metrics_reconstructed(op, reconstructed, continuum_fields, ledger, denominator_fields=None): + denominator_fields = continuum_fields if denominator_fields is None else denominator_fields + volume = sum((op['volumes'][c] for c in op['cells']), F(0)) + require(volume > 0, 'positive physical volume') + errors, denominators, result = {}, {}, {} + for key, field in (('velocity', 'u'), ('pressure', 'p')): + exact = continuum_fields[field] + items = volume_items(reconstructed, field, exact) + expected = denominator_fields[field] if field == 'u' else (denominator_fields[field],) + target_items = [('triangle', expected, tri) for kind, p, tri in items] + tolerance = volume/F(10**8) + a1, b1 = l1_enclosure(items, tolerance, ledger), l1_enclosure(target_items, tolerance, ledger) + a2, b2 = squared_integral_interval(items), squared_integral_interval(target_items) + errors[key] = {'L1': a1, 'L2': a2} + denominators[key] = {'L1': b1, 'L2': b2} + result[key] = {'L1': ratio_interval(a1, b1), 'L2': ratio_interval(a2, b2), + 'Linfinity_enclosure': supremum_bounds(items)} + source_lengths = [sqrt_interval(sum(((b[d]-a[d])**2 for d in range(2)), F(0))) + for a, b in zip(op['source'], op['source'][1:]+op['source'][:1])] + perimeter = sum_intervals(source_lengths) + traction_items = []; l2_parts = []; sup_lower = F(0); sup_upper = F(0) + normal_items = []; tangent_items = []; normal_l2 = []; tangent_l2 = []; edge_maxima = {} + for boundary in boundary_pieces(op, reconstructed): + nx, ny = boundary['normal_measure']; pa, pb = boundary['a'], boundary['b']; weight = boundary['parameter_weight'] + a, b = boundary['source_a'], boundary['source_b']; dx, dy = b[0]-a[0], b[1]-a[1] + length = source_lengths[boundary['edge']] + require(length[0] > 0, 'resolved source-edge length') + dsigma = tuple(ep.add(got, ep.scale(exact, -1)) for got, exact in zip(boundary['piece']['sigma'], continuum_fields['sigma'])) + q = (ep.add(ep.scale(dsigma[0], nx), ep.scale(dsigma[1], ny)), + ep.add(ep.scale(dsigma[1], nx), ep.scale(dsigma[2], ny))) + item = ('segment', q, (pa, pb, weight)); traction_items.append(item) + moment = ep.segment_integral_parameter(square_polynomial(q), pa, pb)*weight + require(moment >= 0, 'nonnegative physical traction squared moment') + l2_parts.append((moment/length[1], moment/length[0])) + local_sup = supremum_bounds([item]) + sup_lower = max(sup_lower, local_sup[0]/length[1]); sup_upper = max(sup_upper, local_sup[1]/length[0]) + edge = str(boundary['edge']); elo,ehi = edge_maxima.get(edge,(F(0),F(0))) + edge_maxima[edge] = max(elo,local_sup[0]/length[1]),max(ehi,local_sup[1]/length[0]) + # Scalar physical normal/tangent L1: (nraw^T dsigma nraw)/length^2, + # with ds=length dt. Separate exact numerator then divide by length. + qn = ep.add(ep.scale(q[0], nx), ep.scale(q[1], ny)) + qt = ep.add(ep.scale(q[0], dx), ep.scale(q[1], dy)) + normal_items.append((('segment', (qn,), (pa, pb, weight)), length)) + tangent_items.append((('segment', (qt,), (pa, pb, weight)), length)) + n2 = ep.segment_integral_parameter(ep.multiply(qn,qn),pa,pb)*weight + t2 = ep.segment_integral_parameter(ep.multiply(qt,qt),pa,pb)*weight + require(n2 >= 0 and t2 >= 0, 'nonnegative component traction squared moments') + normal_l2.append((n2/length[1]**3,n2/length[0]**3)) + tangent_l2.append((t2/length[1]**3,t2/length[0]**3)) + tolerance = perimeter[0]/F(10**8) + t1 = l1_enclosure(traction_items, tolerance, ledger) + t2square = sum_intervals(l2_parts) + t2 = (sqrt_interval(t2square[0])[0], sqrt_interval(t2square[1])[1]) + # q=1: integral/perimeter. q=2: sqrt(integral/perimeter). + normalized_l1 = ratio_interval(t1, perimeter) + normalized_l2 = ratio_interval(t2, (sqrt_interval(perimeter[0])[0], sqrt_interval(perimeter[1])[1])) + result['traction'] = {'L1': normalized_l1, 'L2': normalized_l2, 'Linfinity_enclosure': (sup_lower, sup_upper), + 'per_source_edge_Linfinity_enclosures':edge_maxima} + for name, pieces in (('normal_L1', normal_items), ('tangent_L1', tangent_items)): + bounds = [] + for item, length in pieces: + # Reserve the same overall normalized-width budget by splitting it + # proportionally to exact source parameter measure / edge count. + local_tolerance = tolerance*item[2][2]*length[0]/len(source_lengths) + interval = l1_enclosure([item], local_tolerance, ledger) + bounds.append(ratio_interval(interval, length)) + result['traction'][name] = ratio_interval(sum_intervals(bounds), perimeter) + for name,parts in (('normal_L2',normal_l2),('tangent_L2',tangent_l2)): + square = ratio_interval(sum_intervals(parts),perimeter) + result['traction'][name] = sqrt_interval(square[0])[0],sqrt_interval(square[1])[1] + return {'metrics': result, 'absolute_volume_error_intervals': errors, + 'exact_field_denominator_intervals': denominators, 'perimeter': perimeter, + 'volume': volume, 'reconstructed': reconstructed, + 'subdivision_created': ledger.created, 'subdivision_maximum_depth': ledger.maximum_depth} + + +def normalized_algebraic_radii(op, coefficient_radius, measured): + """Safe original-coordinate norm Lipschitz bounds; fixed units all1.""" + epsu = F(coefficient_radius['velocity']); epsp = F(coefficient_radius['pressure']) + require(epsu >= 0 and epsp >= 0, 'nonnegative separate physical coefficient radii') + volume = measured['volume']; sqrt2 = sqrt_interval(F(2))[1] + # Complete component partitions give ||delta u||<=sqrt(2)*eps pointwise. + ur1 = sqrt2*epsu*volume + ur2 = sqrt2*epsu*sqrt_interval(volume)[1] + pr1 = epsp*volume; pr2 = epsp*sqrt_interval(volume)[1] + v = 4*op['mu']*epsu/op['h'] + traction_radius = sqrt_interval(2*(v+epsp)**2+2*v*v)[1] + denominators = measured['exact_field_denominator_intervals'] + return {'velocity': {'L1': ur1/denominators['velocity']['L1'][0], 'L2': ur2/denominators['velocity']['L2'][0]}, + 'pressure': {'L1': pr1/denominators['pressure']['L1'][0], 'L2': pr2/denominators['pressure']['L2'][0]}, + 'traction': {'L1': traction_radius, 'L2': traction_radius}} + + +def deciding_intervals(measured, radii): + out = {} + for field in ('velocity', 'pressure', 'traction'): + out[field] = {norm: add_radius(measured['metrics'][field][norm], radii[field][norm]) for norm in ('L1', 'L2')} + return out diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/preparation-proposal.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/preparation-proposal.md new file mode 100644 index 00000000..17d479d3 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/preparation-proposal.md @@ -0,0 +1,262 @@ +# CV3-A independent preparation and uncertainty method v1 + +Prepared 2026-10-20. This document selects prospective algorithms; it records no +selected assembly, solve, spectrum, benchmark, test or campaign result. The +parent selected this validated route before oracle implementation. There is no +estimated-bound fallback. Prospective source is now prepared; numerical launch +remains pending final source/protocol/resource review, hashes and custody. + +## Authority and source custody + +Read the exact published PR141 head +`38c40ca7b4b2401e0ac802f12c647f7229072f52`, rather than a mutable local report: + +| File under docs/plans/fluid-accuracy-composition | SHA256 of exact blob | +| --- | --- | +| reports/cv3a-admission.md | 8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208 | +| reports/cv3a-review/recommendation.md | d54d52efd222b9defc7a37ec2efb43daaef7f31c7ff97c607c6d267e9187f69a | +| reports/cv3a-review/review.md | 2161bb6e08fd24dcd6e328b78d1842aca07a64709c2537951522e22812d097ee | + +Dependency PR139 is head `902f6092de6044419d028f92dabd8e59ae7a87ba`, numerical +source `b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. Read and preserve independent +CV2 helpers (not candidate imports): + +| Helper | Original SHA256 | +| --- | --- | +| exact_polynomial.py | 4fe9c518beaa691ee6a1c5c5ab12ecf6cdfba79c83f93c482e988b203f7cf464 | +| exact_operators.py | 09e7d8ac268852b553557b8fa8f1e7661a6976727a996ed764a8481e8f5cee49 | +| high_precision.py | d17b2a452f874141a6051cbac33ef61313114b9a10fe0722552f4145a6d51f7f | + +Their copies, if extended, receive this new owner's identity. Old sources, +outputs and archives are read-only. This owner writes only +`/workspace/rheon-q2-static-mms-independent`. + +## Dimension replan disposition + +Read the pre-edit replan at `bc82e92c277015a4944ef0dbd31f3505ba165c31`, +q2-static-mms/replan.md, SHA256 +`89639b0df7c2f297be8173086abcd3b097acb0a1ba4ae16a9665a7b82acb3f31`. +Accept the bounded prospective extension: Layout n<=16, assembly and selected +Cholesky/QR velocity dimension<=544, pressure dimension<=256, checked allocation +arithmetic, and refusal beyond these limits. The support, spaces and formulas +stay the same; the scientific source identity changes. Record exact shared writes +and lead coordination, preserve frozen CV1/CV2 and old-case byte controls. + +The full-grid bounds are nv=2n(n+1), nc=n^2, N=nv+nc. They are not actual cut +support counts. Elementary strict support inequalities give rectangle bounds: + +| n | active velocities | pressure cells | KKT size | +| --- | ---: | ---: | ---: | +| 4 | 40 | 16 | 56 | +| 8 | 98 | 36 | 134 | +| 16 | 275 | 120 | 395 | + +For n16, X has 13x11=143 and Y has 12x11=132. The fixed rotated square's box +width is strictly below .375; each phase is bounded by respectively +(nv,nc,N)=(32,9,41),(50,16,66),(128,49,177) at n4/8/16. These are source +inequality bounds, not executed support counts. Actual support/rank must still +be independently reconstructed. The conservative universal n16 limit is +(544,256,800). No CV3 baseline KKT factor is selected: the shared velocity limit +544 must not be represented as admitting an arbitrary 800-row baseline solve. + +## Exact continuum and independent target + +Use exact Fractions of represented source coordinates, grid primitives and mu, +never rational 1/10 for represented .1. Independently differentiate the declared +streamfunction and pressure. At the fixed units: + +``` +u=(x^2+2xy,-2xy-y^2), p=1+x+2y+xy, +sigma=(-p+4mu(x+y), 2mu(x-y), -p-4mu(x+y)), +f=(x^2+2xy-2mu+1+y,-2xy-y^2+2mu+2+x). +``` + +The symmetric stress tuple is xx,xy,yy. Integrate body phi*f and physical +traction phi*sigma*n separately by exact simplex/segment monomial moments, with +all component knots and pressure-cell splits. Body, boundary power, resultant +and torque remain separate. No discrete RHS manufactured from desired U/P. + +R1 is the full exported rounded operator and actual exported rounded RHS, +including any rounding asymmetry. R2 is the exact independently reconstructed +integral target and continuum load. C=[A,-B^T;-B,0], A=M/dt+K. No gauge, +support deletion, symmetrization of R1, pressure shift or stabilization. + +## Validated original-coordinate solution uncertainty + +Generate an approximate inverse R and candidate z using independently pivoted +mpmath LU at fixed 120 decimal digits. Convert each actual finite mpf binary +tuple to a Fraction; printed decimal text is not the mathematical value. The +generation is untrusted for enclosure purposes. For each exact target C,b, +verify by exact rational arithmetic: + +``` +E=I-R*C; delta=max_i sum_j |Eij| < 1; +r=b-C*z; eta=max_i |(R*r)i|/(1-delta). +``` + +Then C is invertible and ||C^-1*b-z||inf<=eta, by the Neumann series. Every term +of the certificate is exact; the guard cannot be bypassed by Python -O. R1 and +R2 have separate certificates and output radii. A failed defect, singular LU, +nonfinite generator, allocation or resource cap is a refusal. Fixed precision +is not increased after data. No condition-number estimate substitutes for eta. +The proof is this explicit derivation; [Rump's verified numerical linear algebra +survey](https://www.tuhh.de/ti3/paper/rump/Ru10.pdf) supplies primary context. + +Stream rows of R*C and retain only exact row sums, leveraging the exact sparse +columns of C. Do not form a dense exact defect matrix. Factor/inverse storage +and generation remain potentially expensive. The prepared policy generates +R1 and R2 separately, plus the H1 inverse; it does not adaptively reuse a target +or select a different precision/backend. Actual finite inverse/center generators +are retained with exact rational encoding and SHA binding for replay. + +For native represented coefficient vector zhat, exact |zhat-z| plus eta bounds +the error relative to each target. Keep R1 solve error, R2 solve+assembly error +and R1-R2 perturbation distinct. Propagate velocity/pressure coefficient radii +through actual positive Q1/P0 basis and derivative integrals to volume and +physical traction norms. Because the component hats form a partition of unity, +a uniform velocity radius eps gives pointwise Euclidean radius sqrt(2)*eps; +use derivative-weighted support bounds for stress, rather than treating pressure +or derivatives as nodal velocities. No nominal full-cell measures replace cuts. + +## Bounded physical norms + +Select Euclidean-vector L1 and L2 for velocity and traction, scalar absolute L1 +and L2 for pressure. Relative velocity/pressure denominators are norms of the +exact continuum field on the same fixed polygon, not coefficient norms or a +mean-subtracted pressure. Parent subsequently froze traction as +(integral_Gamma ||sigma_h*n-g||^q / length_Gamma)^(1/q)/tau_ref, for q=1,2. +Report normal/tangential components separately. This resolves the initial +normalization question prospectively, before any selected evaluation. + +L2 squared volume errors are exact degree<=4 polynomial integrals. Traction +pieces use the correct liquid-side gradient/P0 pressure on every split edge. +For oriented edge d=b-a, let q(t)=(sigma_h-sigma_exact)*(dy,-dx). Then Euclidean +traction L1 is integral_0^1 ||q(t)||dt: the edge-length denominator cancels ds. +Traction L2 squared is integral ||q||^2 dt/|d|; it is generally not rational on +an oblique represented edge. Use exact polynomial moments and outward rational +square-root enclosures, not a claim that its entire result is rational. + +For Euclidean L1 over a triangle, represent the degree2 error vector in its six +degree2 Bernstein coefficients b_alpha. Positivity and partition of unity give + +``` +||integral e|| <= integral ||e|| <= area/6 * sum_alpha ||b_alpha||. +``` + +The lower bound is the norm of the exact integral; each norm/square root is +outward enclosed. The scalar absolute case uses the same inequality; a common +coefficient sign resolves it exactly. Split the largest uncertain piece, +deterministically using edge-length and index ties; use exact dyadic midpoint +subdivision. The analogous 1D quadratic Bernstein bound treats edge traces. +This encloses Euclidean L1 without asserting it is polynomial. Freeze depth24, +at most 2,000,000 created pieces per case, 256-bit outward square-root endpoints, +and requested normalized integral width<=1e-8. Bounds and resource checks remain +always on. A piece/resource limit stops without replacing the result by Gaussian +sampling or dropping a difficult cut. + +Convert rational q>=0 to a sqrt interval with m=floor(sqrt(q*2^512)), using +integer square root of the exact quotient floor: [m/2^256,(m+1)/2^256], with an +exact endpoint if m^2=q*2^512. Interval operations remain rational and outward. + +For every deciding error and refinement difference, require total propagated +algebraic/integration uncertainty<=1% of its positive lower bound. A zero or +sign-uncertain gap is unresolved, not floored. Decide finest5% and order>=.9 +using conservative error intervals. For a pair, the lower order is +log2(E8_lower/E16_upper); implement the .9 comparison with outward-enclosed +constants/logarithms or an exact integer-powered inequality, not a rounded +printed logarithm. Preserve all nine outcomes and both phase comparisons. +L-infinity remains a clearly named search/Bernstein-range diagnostic unless an +actual global enclosure is implemented and validated. + +## Verified H1/pressure spectral diagnostic + +Independently integrate exact Gv=integral(grad phi_i:grad phi_j+phi_i.phi_j), +Qp=diag(actual positive volumes), and B. Exact rational elimination gives rank; +retain every pressure row and constant-pressure mode. No beta cutoff. + +Generate an approximate inverse RG of Gv and verify deltaG=||I-RG*Gv||inf<1. +Let epsG=deltaG*||RG||inf/(1-deltaG). Exact Gv^-1 is symmetric. With +Rs=(RG+RG^T)/2, a safe spectral inverse error is epsG plus +.5||RG-RG^T||inf. Consequently +epsT=||B||inf*||B||1*(epsG+.5||RG-RG^T||inf) bounds +||B*Gv^-1*B^T-B*Rs*B^T||2. + +Enclose every Qp^-1/2 diagonal by the integer-square-root method. Let D0 be +the rational midpoint, epsD the largest radius, D its exact value, and +T0=B*Rs*B^T. The symmetric rational center S0=D0*T0*D0 has target uncertainty + +``` +epsS <= ||D||^2*epsT + epsD*(||D||+||D0||)*||T0||inf. +``` + +Generate an ordinary symmetric eigendecomposition V,Lambda of S0. Treat each +finite returned value as an exact rational. Verify omega=||V^T V-I||inf<1 and +F=S0-V Lambda V^T exactly. Polar orthogonalization implies a conservative +distance dV<=(1+omega)*omega/(1-omega) from V to an orthogonal Q. Thus Weyl gives +sorted eigenvalue intervals centered on Lambda with common radius + +``` +||F||inf + dV*(2+omega)*max|Lambda| + epsS. +``` + +Report their square-root intervals, smallest mode, eigenvector/residual and +alternating-cell-pressure pattern/Rayleigh quotient. A nonpositive lower +endpoint gives unresolved positive beta uncertainty; do not replace it by a +positive floor. Exact rank/Gram reasoning may establish mathematical positivity +without establishing a narrow measured beta interval. A single eigenvector is +not unique in a cluster; report an eigenspace/diagnostic pattern unless a verified +gap supports a directional interpretation. This is finite-instance evidence, +never a uniform inf-sup theorem. [LAPACK's error-measure definitions](https://www.netlib.org/lapack/lug/node75.html) +separate vector, matrix and subspace error, which must not be conflated here. + +## Resources and readiness + +Read-only metadata: cgroup16GiB RAM, CPU quota4, about21.85GiB free workspace; +mpmath1.3.0, numpy2.3.5, scipy1.17.0, sympy1.14.0 available. python-flint and +gmpy2 are not installed. No numerical benchmark was run. Metadata inspection is +not a performance measurement or an installed validated-linear-algebra backend. + +Accept hard native caps: one worker,4GiB RSS,2GiB scratch,120s/case,900s total; +independent caps: one worker,8GiB address/RSS,8GiB scratch,1800s/child, +10800s per interpreter mode and32400s total for three complete modes. +Controls have a separate10800s total/2GiB scratch budget,1800s/child. +Set BLAS/OpenMP workers1 and use an external supervisor for RSS/time/output +caps, not merely internal Python checks. Process one case, and one inverse or +certificate phase, at a time; retain every partial receipt and refusal. Parent +must serialize native/oracle workloads to fit the shared machine and disk. + +At universal800 rows a single binary64 dense matrix is5.12MB; actual largest +reference is395 rows. Ordinary dense storage is not the main risk. Arbitrary +precision LU/inverse, Fraction numerator/denominator growth, exact rank, +certificate products and L1 subdivision dominate. Sparse target multiplication +may reduce inverse-defect verification work from dense cubic cost to +N*nnz(C), but no speedup has been measured. Do not extrapolate a package author's +benchmark or claim the1800s bound is demonstrated feasible. + +The exact-rational method is mathematically sufficient if it executes and its +certificates pass. Unmeasured runtime remains risk under enforced hard caps, +not an external blocker or reason for an additional approval/benchmark ritual. +No launch follows from this document alone: final source/protocol/resource +review and freeze remain necessary. A genuine cap/certificate/integration stop +retains its exact case/stage and returns for a reviewed backend/resource decision. +A future pinned +compiled ball/exact backend is possible but is not selected or installed here: +[official python-flint arb_mat documentation](https://python-flint.readthedocs.io/en/latest/arb_mat.html) +distinguishes bounded solves from its explicitly unbounded approximate option. +No implicit dependency or estimated-bound substitution is authorized. + +## Required before numerical execution + +Candidate-free source now includes exact target/load/reconstruction/physical +ledgers, certificates, all-nine structural guards and targeted wrong-load/ +pressure/phase/field controls. Review and freeze all sources/resource commands +before raw inspection. This remains a prospective method/cap review, not an +executed evaluator qualification or source/campaign admission. +Normal/-O/-OO behavior is tested only after the separate execution gate; all +acceptance guards use explicit checks, not assertions. The parent accepted L1 +limits/normalization and complete three-mode budget before data. Fixed spectrum +enclosures, error/gap propagation, cross-phase and bounded serialization are +implemented prospectively and require actual future checks, not assumed passes. +Display-only log arguments are outward2^-256 before the64-term series and +endpoints outward2^-128; all other rational report integers +are bounded at3,000,000 bits/1,000,000 decimal digits with explicit resource refusal. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/preparation-receipt.json b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/preparation-receipt.json new file mode 100644 index 00000000..66b081e0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/preparation-receipt.json @@ -0,0 +1,17 @@ +{ + "status": "prospective-source-only; pending final parent review and freeze", + "owner": "/root/p1_numerical_review", + "write_root": "/workspace/rheon-q2-static-mms-independent", + "date": "2026-10-20", + "authority_head": "38c40ca7b4b2401e0ac802f12c647f7229072f52", + "dependency_head": "902f6092de6044419d028f92dabd8e59ae7a87ba", + "dependency_numerical_source": "b0a9d52cc266cb651c5e67c07ec5f4f82419db55", + "pre_edit_dimension_replan": "bc82e92c277015a4944ef0dbd31f3505ba165c31", + "parent_native_preparation_checkpoint": "b9ec50c779122587a5da30318b29b42e1825ec10", + "source_inspection": "text review and standard-library AST parse only; no selected modules imported", + "selected_numerical_executions": [], + "selected_tests": [], + "benchmarks": [], + "resource_feasibility": "unmeasured risk under hard stop limits; no known infeasibility established", + "claim": "prospective method/cap/oracle source preparation; no executed numerical or production qualification" +} diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/readiness-review.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/readiness-review.md new file mode 100644 index 00000000..2d27bda0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/readiness-review.md @@ -0,0 +1,78 @@ +# CV3-A prospective independent review + +Disposition: **the bounded replan and complete prospective independent source +are suitable for final parent review and subsequent source/protocol/resource +freeze.** No numerical launch is authorized here. No selected test, assembly, +inverse, solve, spectrum, quadrature probe, benchmark or campaign ran. Sources +were read as text and parsed with standard-library AST without numerical imports. + +Read exact PR141 head38c40ca7b4b2401e0ac802f12c647f7229072f52 admission, +recommendation/review, immutable CV2 helpers and pre-edit replanbc82e92. Exact +hashes are in the proposal. Parent native checkpoint is +b9ec50c779122587a5da30318b29b42e1825ec10; its binary was not executed by this owner. +No production/Session/UI/Cargo or old evidence file was changed. + +The cap-only extension is necessary/coherent: strict support gives n16 rectangle +275 velocities/120 pressure rows/KKT395, distinct from universal full-grid800. +No CV3 baseline KKT is selected. Extended helper identity remains separate from +actual frozen CV2 numerical source. + +Prepared full candidate-free source for exact operators/H1/continuum loads, +source/bit/schema/cardinality custody, quadrature/physical trace checks, rank, +factors, full physical ledgers, both inverse-certified references, physical +norms/uncertainty/orders and same-domain cross-phase reconstruction. The separate +owner prepared normal/-O/-OO full scientific evaluations and14 targeted controls. +All are unexecuted. Scientific failures are distinguished from tooling success; +each mutation requires its untouched target guard to pass first. + +Mathematical/source findings resolved prospectively: + +- Exact E=I-RC,delta=||E||inf<1 and r=b-Cz give radius + ||Rr||inf/(1-delta). Fixed120dps LU generates untrusted R/z. Actual finite + generators/centers are retained. R1/R2 and original R1 asymmetry stay separate. +- Row scales use tau=1; coefficient-pressure comparison uses1+represented mu. + Certificate coordinates are (U/Uref,P/tau), numerical identity at fixed scales1; + separate physical U/P radii propagate throughout. Cholesky's identity target + is lower-symmetric scaled_A, while the original full solve target is retained. +- All18 native gate names and24 physical observations are required and compared + with independent physical work/resultant/torque/energy reconstructions. + Source-line coordinates and both outward normal components are checked. +- Volume squared L2 errors use exact moments. Bernstein-positive L1 bounds use + exact scalar absolute values/outward vector square roots. Fixed limits: + depth24,2m created pieces/case,256-bit sqrt endpoints,normalized width1e-8. + Oblique traction retains its irrational edge-length divisor. Full, normal/ + tangent L1/L2 and per-edge sup diagnostics use liquid-side P0 stress. +- H1 is full gradient plus consistent mass with actual pressure volumes. Exact + inverse/scaling/eigen residual/orthogonality bounds enclose the sorted spectrum. + Constant/alternating modes remain Qp-normalized without mean subtraction. + Generator directions/overlap are diagnostics, not unique clustered eigenvectors + or a uniform inf-sup theorem. +- Conservative exact-power .9 decisions and64-term outward logarithm intervals + report4->8/8->16. Only8->16 order decides; both refinement gaps have1% budgets. + Resolved negative coarse gaps use distance from zero. Finest5% is unchanged. + Cross-phase union-partition intervals add U/P radii separately, with no cutoff. +- Bounded report integers avoid Python decimal conversion failures. Order + display arguments are outward dyadic2^-256 before the64-term series, endpoints + outward2^-128; exact thresholds do not change. + +Static resources:16GiB cgroup RAM/4CPU,about21.85GiB free disk; +mpmath1.3.0/numpy2.3.5/scipy1.17.0/sympy1.14.0 installed; no python-flint/gmpy2. +No installation or benchmark. Largest declared KKT395; support gives +nnz(C)<=31nv+12nc, so streamed defects can use N*nnz(C) rather than N^3 terms. +H1 same-component rows have at most9 entries. These are structural bounds, not +timing/bit-growth guarantees. R1/R2 separate LU/inverses, H1, exact rank and L1 +may hit resource caps; no adaptive precision/backend or guarantee of completion. + +Parent selected frozen hard caps: native1worker/4GiB/2GiB output/120s case/900s +total; complete references1worker/8GiB/8GiB output/1800s child/10800s per mode/ +32400s total; controls1worker/8GiB/2GiB output/1800s child/10800s total. +Unmeasured runtime is **risk, not an external blocker or need for new user +permission**. Enforced cap/certificate/rank/integration stops retain exact stage +and return for a reviewed method/backend/resource decision. No floor/retry. + +Remaining gates are final parent source/protocol/resource command review, +snapshot/custody freeze, then separately authorized selected execution. They are +pending, not denied. No approval-review tool blocked an action. AST inspection +does not establish executed correctness or any physical acceptance. All actual +certificates, spectra, norms, orders, optimized modes and controls remain unknown. +No PDE-order, production, curved free-surface or generic cut-stability claim. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/spectrum.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/spectrum.py new file mode 100644 index 00000000..13c30f30 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/spectrum.py @@ -0,0 +1,100 @@ +"""Prospective exact verified H1/L2 spectrum; generators are untrusted. + +This is a finite-instance diagnostic. No beta cutoff or gauge is introduced. +""" +from fractions import Fraction as F +from validated import require, generate, inverse_defect, transpose, multiply, norm_inf, sqrt_interval, dot + + +def certified_spectrum(op, budget): + g, b = op['H1'], op['B']; nv, nc = len(g), len(b) + require(g == transpose(g) and len(g) == len(b[0]), 'consistent symmetric H1 dimensions') + r, unused = generate(g, [F(0)]*nv, budget) + delta = inverse_defect(g, r, budget) + inverse_error_inf = delta*norm_inf(r)/(1-delta) + rt = transpose(r) + skew = [[r[i][j]-rt[i][j] for j in range(nv)] for i in range(nv)] + rs = [[(r[i][j]+rt[i][j])/2 for j in range(nv)] for i in range(nv)] + # G^-1-Rs is symmetric, hence its spectral norm is bounded by its row norm. + inverse_error_2 = inverse_error_inf+norm_inf(skew)/2 + t0 = multiply(multiply(b, rs, budget), transpose(b), budget) + require(t0 == transpose(t0), 'exact symmetric spectral center') + eps_t = norm_inf(b)*norm_inf(transpose(b))*inverse_error_2 + q = [op['volumes'][c] for c in op['cells']] + require(len(q) == nc and all(v > 0 for v in q), 'actual positive pressure L2 volumes') + d_intervals = [] + for v in q: + lo, hi = sqrt_interval(v) + require(lo > 0, 'resolved positive pressure-mass square root') + d_intervals.append((1/hi, 1/lo)) + d0 = [(lo+hi)/2 for lo, hi in d_intervals] + eps_d = max((hi-lo)/2 for lo, hi in d_intervals) + d_bound = max(hi for lo, hi in d_intervals); d0_bound = max(d0) + eps_s = d_bound*d_bound*eps_t+eps_d*(d_bound+d0_bound)*norm_inf(t0) + s0 = [[d0[i]*t0[i][j]*d0[j] for j in range(nc)] for i in range(nc)] + # The external supervisor fixes BLAS/OpenMP1. SciPy supplies only a center. + import numpy as np + from scipy.linalg import eigh + budget.check() + floating = np.array([[float(v) for v in row] for row in s0], dtype=float) + require(bool(np.isfinite(floating).all()), 'finite ordinary spectral generator input') + eigenvalues, eigenvectors = eigh(floating, driver='evr', check_finite=True) + require(eigenvalues.shape == (nc,) and eigenvectors.shape == (nc, nc), 'complete spectral generator dimensions') + require(bool(np.isfinite(eigenvalues).all()) and bool(np.isfinite(eigenvectors).all()), 'finite spectral generator') + values = [F.from_float(float(v)) for v in eigenvalues] + require(all(values[i] <= values[i+1] for i in range(nc-1)), 'sorted generated spectrum') + v = [[F.from_float(float(eigenvectors[i, j])) for j in range(nc)] for i in range(nc)] + vt = transpose(v) + vtv = multiply(vt, v, budget) + orth_defect = [[vtv[i][j]-F(i == j) for j in range(nc)] for i in range(nc)] + omega = norm_inf(orth_defect) + require(omega < 1, 'verified spectral basis orthogonality defect below one') + vl = [[v[i][j]*values[j] for j in range(nc)] for i in range(nc)] + reconstructed = multiply(vl, vt, budget) + residual = [[s0[i][j]-reconstructed[i][j] for j in range(nc)] for i in range(nc)] + require(residual == transpose(residual), 'symmetric exact spectral residual') + distance = (1+omega)*omega/(1-omega) + epsilon = norm_inf(residual)+distance*(2+omega)*max(map(abs, values))+eps_s + intervals = [(x-epsilon, x+epsilon) for x in values] + beta = [] + for lo, hi in intervals: + require(hi >= 0, 'consistent nonnegative Gram spectral upper endpoint') + # Zero here is a mathematical lower bound for an SPD Gram operator, not + # a positivity threshold. A nonpositive computed lower stays unresolved. + beta.append((F(0) if lo <= 0 else sqrt_interval(lo)[0], sqrt_interval(hi)[1])) + physical_mode = [d0[i]*v[i][0] for i in range(nc)] + alternating = [F((-1)**((c % op['n'])+(c // op['n']))) for c in op['cells']] + alt_norm2 = sum((volume*x*x for volume, x in zip(q, alternating)), F(0)) + alt_center = dot(alternating, [dot(row, alternating) for row in t0])/alt_norm2 + # T's spectral error bounds a^T(T-T0)a in original pressure coordinates. + alt_radius = eps_t*sum((x*x for x in alternating), F(0))/alt_norm2 + constant = [F(1)]*nc + const_norm2 = sum(q, F(0)) + const_center = dot(constant, [dot(row, constant) for row in t0])/const_norm2 + const_radius = eps_t*nc/const_norm2 + mode_norm2 = sum((volume*x*x for volume, x in zip(q, physical_mode)), F(0)) + require(mode_norm2 > 0, 'nonzero generated pressure pattern') + alt_overlap2 = sum((volume*a*x for volume, a, x in zip(q, alternating, physical_mode)), F(0))**2/(alt_norm2*mode_norm2) + const_overlap2 = sum((volume*x for volume, x in zip(q, physical_mode)), F(0))**2/(const_norm2*mode_norm2) + def normalized_pattern(pattern,norm2): + lo,hi = sqrt_interval(norm2) + require(lo > 0, 'resolved positive pattern Qp norm') + return [(x/hi,x/lo) if x >= 0 else (x/lo,x/hi) for x in pattern] + return {'definition': 'Qp^-1/2 B H1^-1 B^T Qp^-1/2', + 'inverse_defect': delta, 'inverse_error_inf': inverse_error_inf, + 'orthogonality_defect': omega, 'spectral_center_residual_inf': norm_inf(residual), + 'spectral_radius': epsilon, 'eigenvalue_intervals': intervals, 'beta_intervals': beta, + 'positive_beta_lower_resolved': intervals[0][0] > 0, + 'smallest_mode_pressure_coefficients': physical_mode, + 'mode_claim': 'generator direction; no individual eigenvector enclosure or clustered-mode uniqueness claim', + 'alternating_cell_pressure': alternating, + 'alternating_Qp_normalized_intervals':normalized_pattern(alternating,alt_norm2), + 'constant_Qp_normalized_intervals':normalized_pattern(constant,const_norm2), + 'generated_mode_Qp_norm_squared':mode_norm2, + 'alternating_rayleigh_interval': (alt_center-alt_radius, alt_center+alt_radius), + 'constant_rayleigh_interval': (const_center-const_radius, const_center+const_radius), + 'generated_mode_squared_alternating_overlap': alt_overlap2, + 'generated_mode_squared_constant_overlap': const_overlap2, + 'inverse_generator': r, 'spectral_generator_values': values, + 'spectral_generator_vectors': v, + 'rank_exact': op['rank'], 'pressure_rows': nc, 'constant_mode_retained': True} diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/validated.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/validated.py new file mode 100644 index 00000000..d19302e0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/oracle/validated.py @@ -0,0 +1,229 @@ +"""Prospective exact certificates; no selected work on import. + +High precision only generates untrusted centers. Fractions verify every bound. +No assertions, tolerance-rank decisions, estimated-bound fallback or pivot floor. +""" +from fractions import Fraction as F +from math import isqrt +from time import monotonic + + +def require(condition, message): + if not condition: + raise RuntimeError('CV3 input/certificate guard: ' + message) + + +class Budget: + def __init__(self, seconds=1800): + require(0 < seconds <= 1800, 'fixed case time cap') + self.deadline = monotonic() + seconds + + def check(self): + require(monotonic() <= self.deadline, 'independent case time resource refusal') + + +def dot(a, b): + require(len(a) == len(b), 'complete dot vectors') + return sum((x*y for x, y in zip(a, b)), F(0)) + + +def action(a, x): + return [dot(row, x) for row in a] + + +def transpose(a): + require(a and a[0] and all(len(row) == len(a[0]) for row in a), 'rectangular nonempty matrix') + return list(map(list, zip(*a))) + + +def norm_inf(a): + require(a and a[0] and all(len(row) == len(a[0]) for row in a), 'rectangular matrix norm') + return max(sum(map(abs, row), F(0)) for row in a) + + +def sparse_columns(a): + at = transpose(a) + return [[(i, v) for i, v in enumerate(col) if v] for col in at] + + +def multiply(a, b, budget): + require(a and b and len(a[0]) == len(b), 'matrix product dimensions') + cols = sparse_columns(b) + out = [] + for row in a: + budget.check() + out.append([sum((row[k]*v for k, v in col), F(0)) for col in cols]) + return out + + +def sqrt_interval(q, bits=256): + q = F(q) + require(q >= 0 and bits == 256, 'nonnegative exact square root and frozen bits') + scale = 1 << bits + scaled = q*scale*scale + m = isqrt(scaled.numerator // scaled.denominator) + lo = F(m, scale) + return lo, lo if lo*lo == q else F(m+1, scale) + + +def norm_interval(values): + if len(values) == 1: + value = abs(F(values[0])) + return value, value + return sqrt_interval(sum((F(v)*v for v in values), F(0))) + + +def mpf_fraction(value): + sign, mantissa, exponent, bitcount = value._mpf_ + require(bitcount >= 0 and mantissa >= 0, 'finite real mpf tuple') + out = F((-1 if sign else 1)*mantissa) + return out*(2**exponent if exponent >= 0 else F(1, 2**(-exponent))) + + +def generate(matrix, rhs, budget): + """Fixed120dps pivoted LU, inverse and center. Not itself an enclosure.""" + from mpmath import mp + n = len(matrix) + require(0 < n <= 800 and all(len(r) == n for r in matrix), 'bounded square target') + require(len(rhs) == n, 'complete target RHS') + ctx = mp.clone(); ctx.dps = 120 + def convert(q): + q = F(q) + value = ctx.mpf(q.numerator)/ctx.mpf(q.denominator) + require(ctx.isfinite(value), 'finite rational generator input') + return value + budget.check() + a = ctx.matrix([[convert(v) for v in row] for row in matrix]) + lu, pivots = ctx.LU_decomp(a, overwrite=False, use_cache=False) + require(all(ctx.isfinite(lu[i, j]) for i in range(n) for j in range(n)), 'finite LU generator') + require(all(lu[i, i] != 0 for i in range(n)), 'nonzero generator pivot') + def solve(b): + budget.check() + z = ctx.U_solve(lu, ctx.L_solve(lu, b, pivots)) + require(all(ctx.isfinite(v) for v in z), 'finite generated center') + return [mpf_fraction(v) for v in z] + center = solve(ctx.matrix([convert(v) for v in rhs])) + inverse = [[F(0)]*n for _ in range(n)] + for j in range(n): + unit = ctx.matrix(n, 1); unit[j] = 1 + col = solve(unit) + for i in range(n): + inverse[i][j] = col[i] + return inverse, center + + +def inverse_defect(matrix, inverse, budget): + """Exact streamed ||I-R*C||inf; no dense defect allocation.""" + n = len(matrix) + require(n > 0 and len(inverse) == n and all(len(r) == n for r in matrix+inverse), 'complete inverse certificate') + cols = sparse_columns(matrix) + delta = F(0) + for i, row in enumerate(inverse): + budget.check() + total = F(0) + for j, col in enumerate(cols): + value = sum((row[k]*v for k, v in col), F(0)) + total += abs(F(i == j)-value) + delta = max(delta, total) + require(delta < 1, 'verified inverse defect strictly below one') + return delta + + +def certify(matrix, rhs, inverse, center, budget): + delta = inverse_defect(matrix, inverse, budget) + residual = [b-v for b, v in zip(rhs, action(matrix, center))] + require(len(rhs) == len(center) == len(matrix), 'complete certified center') + preconditioned = action(inverse, residual) + eta = max(map(abs, preconditioned), default=F(0))/(1-delta) + # This is an exact Neumann-series enclosure, not precision agreement. + return {'delta': delta, 'eta': eta, 'center': center, + 'residual_inf': max(map(abs, residual), default=F(0)), + 'inverse_norm_inf': norm_inf(inverse), 'precision_digits': 120, + 'inverse_generator': inverse} + + +def solve_certified(matrix, rhs, budget): + inverse, center = generate(matrix, rhs, budget) + return certify(matrix, rhs, inverse, center, budget) + + +def ratio_interval(a, b): + require(0 <= a[0] <= a[1] and 0 < b[0] <= b[1], 'positive norm denominator enclosure') + return a[0]/b[1], a[1]/b[0] + + +def add_radius(interval, radius): + require(radius >= 0 and 0 <= interval[0] <= interval[1], 'nonnegative norm radius') + return max(F(0), interval[0]-radius), interval[1]+radius + + +def uncertainty_budget(interval, radius): + require(0 <= radius and 0 < interval[0] <= interval[1], 'positive error for one-percent uncertainty') + return radius <= interval[0]/100 + + +def finest_gate(interval): + return 0 <= interval[0] <= interval[1] <= F(1, 20) + + +def order_gate(coarse, fine): + # r >= 2^(9/10) iff r^10 >= 2^9; no rounded log or threshold constant. + require(0 <= fine[0] <= fine[1] and 0 <= coarse[0] <= coarse[1], 'ordered error intervals') + return fine[1] > 0 and coarse[0]**10 >= (1 << 9)*fine[1]**10 + + +def logarithm2_interval(q): + """Exact rational atanh-series enclosure, fixed64 terms; display only. + + Order decisions themselves use the exact integer-power comparison above. + """ + q = F(q); require(q > 0, 'positive exact order logarithm') + k = q.numerator.bit_length()-q.denominator.bit_length() + scale = F(1 << k) if k >= 0 else F(1,1 << (-k)) + if q < scale: + k -= 1; scale /= 2 + require(scale <= q < 2*scale, 'exact binary logarithm reduction') + def atanh_bounds(t): + require(0 <= t <= F(1,2), 'bounded log-series parameter') + total = F(0); power = t + for j in range(64): + total += 2*power/(2*j+1); power *= t*t + tail = 2*power/(129*(1-t*t)) + return total,total+tail + def ln_reduced(y): + t = (y-1)/(y+1); require(0 <= t <= F(1,3), 'reduced exact logarithm argument') + # Display-only rigorous argument enclosure prevents powers of a huge + # exact error-ratio denominator from dominating source resource bounds. + step = 1 << 256; scaled = t*step + floor = scaled.numerator//scaled.denominator + ceil = -((-scaled).numerator//(-scaled).denominator) + return atanh_bounds(F(floor,step))[0],atanh_bounds(F(ceil,step))[1] + a,b = ln_reduced(q/scale),ln_reduced(F(2)) + require(b[0] > 0, 'positive exact log-two enclosure') + lo,hi = k+a[0]/b[1],k+a[1]/b[0] + # Display enclosure only. Keep exact order/threshold comparisons separately; + # outward dyadic endpoints avoid enormous decimal rational report payloads. + scale = 1 << 128 + lower = (lo*scale).numerator//(lo*scale).denominator + upper = -((-hi*scale).numerator//(-hi*scale).denominator) + return F(lower,scale),F(upper,scale) + + +def observed_order_interval(coarse,fine): + if coarse[0] <= 0 or fine[1] <= 0: + return {'lower':None,'upper':None,'status':'unresolved nonpositive norm endpoint'} + lower = logarithm2_interval(coarse[0]/fine[1])[0] + upper = None if fine[0] <= 0 else logarithm2_interval(coarse[1]/fine[0])[1] + return {'lower':lower,'upper':upper,'status':'outward exact logarithm enclosure'} + + +def json_exact(value): + if isinstance(value, F): + require(value.numerator.bit_length() <= 3000000 and value.denominator.bit_length() <= 3000000, + 'bounded exact report integer bit resource limit') + return {'numerator': str(value.numerator), 'denominator': str(value.denominator)} + if isinstance(value, dict): + return {str(k): json_exact(v) for k, v in value.items()} + if isinstance(value, (tuple, list)): + return [json_exact(v) for v in value] + return value diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/plan.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/plan.md new file mode 100644 index 00000000..af3e8c49 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/plan.md @@ -0,0 +1,79 @@ +# CV3-A static polygon MMS preparation + +Status: preparation complete, source/oracle/resource review frozen for lead +review. No selected numerical execution is admitted by the current handoff; +there are no CV3 numerical results. See preparation-freeze.md for exact custody. + +## Authority and dependencies + +The exact admitted contract is copied without changes in [admitted-contract.md](admitted-contract.md), +from PR141 head `38c40ca7b4b2401e0ac802f12c647f7229072f52`. +This branch starts at the required PR139 head +`902f6092de6044419d028f92dabd8e59ae7a87ba`, numerical freeze +`b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. Fresh main is still +`718469beedb9a949f4bb6f3299c7b880b4c47e47`. No production or integration +ancestry is imported from PR141. CV1/CV2 frozen sources, failures, source bytes, +criteria and sealed evidence remain immutable at their original identities. + +## Binding decisions and ownership + +Use the exact nine static polygon cases, continuum fields, physical loads, +absolute pressure and unchanged 5%/.9/1e-10 gates in the admitted contract. +No support removal, pressure gauge, stabilization or new numerical solver. +Root owns the Rust experiment and local preparation documents; the existing +independent reviewer owns the external candidate-free oracle and reviews. +Repository lead owns shared plan/source admission, dependencies and merges. +The separate visual owner maintains only a provisional local explanatory HTML. + +Composed-design review: not applicable to production composition. This is one +private numerical-reference executable with no deployed API or new production +state. Its mathematical/measurement/resource composition receives explicit +independent review before execution. Session, recording, providers, desktop, +SQLite, Cargo and production code remain outside the write set. + +## Milestones + +1. Discovery/reconciliation (Accepted for preparation): exact source inspection, continuum + derivation and bounding-box/quadrature/cost reasoning. Gate: independent + disposition of the additional private dimension guards in [replan.md](replan.md). +2. Source/oracle/resource preparation (Accepted for preparation): smallest admitted implementation, + candidate-free exact loads/norms, validated uncertainty, immutable commands + and hard caps. Gate: complete separate source/oracle/resource review with + source hashes, no selected execution. +3. One serialized campaign (Blocked): outside this preparation-only handoff. + Its source freeze and actual separate admission must precede any selected + native tests, solves, oracle calculations or scientific probes. + +The preparation slice is complete. The next numerical slice remains outside this +handoff; the lead owns its disposition using the committed source/command freeze. +No additional user confirmation is requested. + +## Exact proposed write set (recorded before source edits) + +New `examples/grid_static_mms_reference.rs` and its private module directory; +new `tests/grid_static_mms_reference_contract.rs`; new documentation here; +external independent oracle directory `/workspace/rheon-q2-static-mms-independent`. +The initially admitted helper edit is +`examples/grid_cut_variational_reference/basis.rs` (bounded n16 ceiling). +Inspection additionally requires dimension-guard-only edits to +`examples/grid_cut_variational_reference/assembly.rs` and +`examples/grid_cut_coupled_reference/solver.rs`; their disposition is owned by +the bounded replan, not silently treated as byte-identical dependencies. +No original trace/quadrature implementation is overwritten for the new loads. + +## Blockers and replan triggers + +The additional assembly/solver dimension guard replan received independent +prospective acceptance for preparation. The independent exact-rational oracle, +bounded physical norms, spectrum, controls and serialized resource owners are +prepared and source-reviewed. Mathematical guarantees remain conditional on +actual successful certificates and interval budgets. Unmeasured runtime is a +risk under fixed hard caps; no benchmark approval is required. A future cap, +rank/certificate/integration failure retains its case/stage and returns to the lead. +Broader basis, backend, boundary, support or pressure changes return to the lead. + +The branch/worktree is retained-protected under numerical-owner preparation, +reachable from `implementation/q2-static-mms-pilot-20261020`, for lead review and +later source-bound work. No merge, history rewrite or cleanup is authorized. + +See [execution-ledger.md](execution-ledger.md) and [issues.md](issues.md). diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-archive.json b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-archive.json new file mode 100644 index 00000000..2ed886c8 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-archive.json @@ -0,0 +1,19 @@ +{ + "bytes": 671729, + "crc_and_manifest": "pass", + "current_version_number": 0, + "file_id": "file_00000000dc648230acfe32028111bd3e", + "library_file_id": "libfile_5a1ed194bc80819198f26af4cfd6409b", + "local_path": "/workspace/rheon-cv3a-preparation-d940f19.zip", + "path": "/rheon-cv3a-preparation-d940f19.zip", + "payloads": 58, + "scope": "preparation-only; no selected numerical execution", + "sha256": "2e9e379626f8e35511881880492aee1bddd7ea4639c6dc999d70523cad3378f7", + "source_freeze": "d940f194534655c05160eba554e5828e6999b9e5", + "xattrs": [ + { + "name": "user.library-file-version", + "value": "0" + } + ] +} diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-archive.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-archive.md new file mode 100644 index 00000000..7a081c0f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-archive.md @@ -0,0 +1,20 @@ +# CV3-A sealed preparation custody + +Source freeze: `d940f194534655c05160eba554e5828e6999b9e5` ([PR143](https://github.com/MrScripty/Rheon/pull/143)). +This closure changes no source, command, criterion or frozen manifest entry. + +The archive `rheon-cv3a-preparation-d940f19.zip` is671,729 bytes with SHA256 +`2e9e379626f8e35511881880492aee1bddd7ea4639c6dc999d70523cad3378f7`. +All58 payload lengths/hashes and ZIP CRCs were checked. It retains reviewed +source/protocol/commands, independent reviews, compile receipts, the local HTML +explanation and the unexecuted release binary. No scientific outputs exist. + +Saved to Library at `/rheon-cv3a-preparation-d940f19.zip`, version0; actual identity +and local metadata receipt are in preparation-archive.json. This is a new +preparation deliverable; earlier sealed CV1/CV2 archives remain unchanged. + +All three new Rust contracts and72 prospective evaluator subprocess checks are +unrun. Numerical acceptance is unknown. No native/physical/GPU/UI/production +claim or execution admission follows from a successful archive validation. +At source-freeze publication the hosted workflows were queued; they are not +reported as passing checks. Lead owns exact-head status and next execution slice. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/compile-only-checks.json b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/compile-only-checks.json new file mode 100644 index 00000000..3b9844f8 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/compile-only-checks.json @@ -0,0 +1,41 @@ +{ + "admission_contract": "38c40ca7b4b2401e0ac802f12c647f7229072f52", + "campaign_output": null, + "checks": [ + { + "command": "cargo check --locked --no-default-features --example grid_static_mms_reference --test grid_static_mms_reference_contract", + "result": "passed, compilation only" + }, + { + "command": "cargo clippy --locked --no-default-features --example grid_static_mms_reference --test grid_static_mms_reference_contract -- -D warnings", + "result": "passed, compilation only" + }, + { + "command": "cargo fmt --all --check", + "result": "passed" + }, + { + "command": "cargo build --locked --release --no-default-features --example grid_static_mms_reference", + "result": "passed, build only; release-build.log retained" + } + ], + "dependency": "902f6092de6044419d028f92dabd8e59ae7a87ba", + "initial_compile_failures": [ + "CV2 experiment cfg(test) referenced old fixture root; repaired by importing only the shared solver", + "Clippy iterator-index lint and unused-variable repairs before any selected execution" + ], + "native_checkpoint": "b9ec50c779122587a5da30318b29b42e1825ec10", + "native_executable_sha256": "72f4245bf56a56da6e8a8c223c2a7a56220fc914491cf6997416c269945f9ad4", + "new_numeric_contracts": { + "count": 3, + "status": "ignored and unrun; future admitted command must explicitly select --ignored" + }, + "qualification": "unavailable; preparation only", + "receipt_created_utc": "2026-10-20T05:26:01.702991+00:00", + "selected_numerical_execution": false, + "source_review_manifest_sha256": "7ab5e6389f6a7e69006533cbade76253b1ee00af1d72e2b5a7d9a629c832bb61", + "toolchain": { + "cargo": "1.92.0 (344c4567c 2025-10-21)", + "rustc": "1.92.0 (ded5c06cf 2025-12-08)" + } +} diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/final-source-inspection.json b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/final-source-inspection.json new file mode 100644 index 00000000..edd2b622 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/final-source-inspection.json @@ -0,0 +1,27 @@ +{ + "admitted_contract_sha256": "8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208", + "approval_denials": [], + "fresh_main": "718469beedb9a949f4bb6f3299c7b880b4c47e47", + "independent_snapshot_file_hashes_verified": 16, + "independent_source_manifest_sha256": "043345393a6a418aa2b9be99ca4c74452be218972e314ad91c63001af701cdbe", + "native_binary_executed": false, + "native_case_output_exists": false, + "new_numeric_contracts": "3 ignored and unrun", + "numerical_acceptance": "unknown", + "pr139_head": "902f6092de6044419d028f92dabd8e59ae7a87ba", + "pr141_head": "38c40ca7b4b2401e0ac802f12c647f7229072f52", + "prospective_checks": "72 unrun", + "protected_archives": { + "CV1": "ff4cd5b0d265f2ea6d9df5944f3b2043f5c037ade9f4475f4ba0f4a1984a72a7", + "CV2": "4c40b60923bac393498388f7702fde0a182a38c09d415d6c41d7d43f43560616" + }, + "protected_worktrees_clean": [ + "/workspace/Rheon", + "/workspace/Rheon-q2-cut-solve", + "/workspace/Rheon-q2-cut-method" + ], + "python_ast_only_files": 14, + "runtime": "unmeasured; hard stop caps fixed before data", + "selected_module_imports": 0, + "status": "preparation-source-inspection-pass; no scientific execution" +} diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/release-build.log b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/release-build.log new file mode 100644 index 00000000..082e1b1f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-checks/release-build.log @@ -0,0 +1,2 @@ + Compiling rheon v0.1.0 (/workspace/Rheon-q2-static-mms) + Finished `release` profile [optimized] target(s) in 21.30s diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-freeze.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-freeze.md new file mode 100644 index 00000000..6446a90c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/preparation-freeze.md @@ -0,0 +1,71 @@ +# CV3-A preparation freeze — no scientific execution + +Preparation source/oracle/resource gates are complete by source review. This +freeze closes preparation only. The current handoff excludes numerical execution; +the repository lead owns the next-slice disposition. No new user confirmation is +requested, and no technical preparation blocker or denied action remains. + +## Exact authority and identities + +- Admission: PR141 `38c40ca7b4b2401e0ac802f12c647f7229072f52`; the unchanged + admitted-contract.md has SHA256 + `8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208`. +- Dependency: PR139 `902f6092de6044419d028f92dabd8e59ae7a87ba`, frozen numerical + source `b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. Fresh main remains + `718469beedb9a949f4bb6f3299c7b880b4c47e47`. +- Native preparation: `b9ec50c779122587a5da30318b29b42e1825ec10`; no Rust source + changed after this checkpoint. Copied release binary SHA256 + `72f4245bf56a56da6e8a8c223c2a7a56220fc914491cf6997416c269945f9ad4`. +- Complete 54-file preparation manifest SHA256: `b2628aa133853d61c4ba0b6a1a7def4418bc69629a55b0448000845446969bb6`. + SHA256SUMS-preparation uses repository-relative paths and excludes itself, + this closure document and any later archive-custody closure. It includes + full private Rust helper directories, build identities, oracle, protocol, + prospective commands, reviews, visual and compile receipts. +- Independent twelve-module source snapshot: oracle/SHA256SUMS-preparation + SHA256 `043345393a6a418aa2b9be99ca4c74452be218972e314ad91c63001af701cdbe`; + all16 payload hashes verified after copying without imports. +- Final native/resource source-review manifest SHA256 + `a74a2dd962582a2bd38cbb7575bd170c09a0f5dbcadae806fa30ffeae8a70645`; + all25 current source entries independently rechecked. Earlier review hashes + in compile receipts are historical observations, superseded by this freeze. + +## Gate disposition and evidence limits + +The continuum force/traction, original-coordinate references and work ledgers, +bounded Euclidean L1 and L2/traction norms, exact rank, full H1/L2 spectrum, +coefficient/error/refinement uncertainty, cross-phase reconstruction and targeted +controls are implemented prospectively. Read the independent readiness review +and source-review/review.md for assumptions, proofs and inspection scope. +Root completed the final source/command review and manifest verification. +Nested reviewer records stating pending parent freeze are preserved observations +from before this closure, not outstanding preparation blockers. + +All-nine static sizes/costs, fixed120dps untrusted generators, exact certificates, +Bernstein limits, bounded integer codec and hard process/RAM/output/time owners +are frozen before data. commands.json fixes exact executable/interpreter hashes, +all nine arguments, one native driver and the full three-mode evaluator/control +driver. Native, reference and controls are serialized. No precision/backend +fallback, support/pressure deletion, retry, finest-case omission or relaxed +criterion is admitted. Unmeasured runtime is a risk under fixed retained-stop +caps, not demonstrated feasibility or an extra benchmark approval requirement. + +Compilation, strict Clippy, formatting and the release build passed; Python +AST-only inspection passed14 files. No selected module was imported and no +selected numerical test, probe, native case, reference, rank, norm or spectrum +ran. The three new Rust numerical contracts are explicitly ignored/unrun. +All72 prospective normal/-O/-OO evaluator subprocess checks remain unrun. +No actual uncertainty certificate or numerical acceptance is claimed. + +## Protected scope and next slice + +CV1/CV2 worktrees and sealed archive hashes were rechecked unchanged; their +failed data remain retained. No production/Session/recording/UI/Cargo/shared +plan/source-admission code changed. Only the recorded private dimension guards +and new experiment/test/docs are part of this branch. No merge or cleanup. + +The next slice, if disposed by the lead, must first check this exact committed +manifest and commands, keep fresh outputs and retain every scientific result or +refusal. Tooling correctness cannot turn a negative scientific gate into a pass. +All5%/.9/1e-10/1% criteria remain unchanged. Static polygon results cannot admit +curved free surfaces, full mesh water, moving geometry/GCL, generic stability, +GPU/native-UI verification, impact physics or production. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/protocol.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/protocol.md new file mode 100644 index 00000000..6f5f0801 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/protocol.md @@ -0,0 +1,170 @@ +# CV3-A prospective protocol v1 — preparation, not execution admission + +All entries here precede selected numerical output. No scenario, phase, finest +level, integration budget or deciding metric may be removed after execution. +The exact source/oracle/resource freeze and independent reviews are recorded in +preparation-freeze.md. Their completion does not expand this handoff to execution. + +## Corpus, identities and coverage + +| Family | World polygon | Grid origin | n | +| --- | --- | --- | --- | +| rectangle-origin | CV1 rectangle | (0,0) |4,8,16| +| square-17-origin | CV1 square-17 | (0,0) |4,8,16| +| square-17-quarter | same square bytes | (h/4,h/4) |4,8,16| + +h=1/n. The computational box is origin+[0,1]^2; all component coordinates and +common half-cell knots use that origin, while the physical source and global +analytic fields stay fixed. Every vertex lies strictly inside both complete +component nodal hulls for every declared case. Derive this directly from the +vertex bounds at n4 (the largest h); shifting the square origin by h/4 retains +both margins. No physical edge coincides with a primal Cartesian plane. + +`cases.rs` pins vertex bit patterns to the exact CV1 source.csv files, including +square trigonometric results captured once in the prior immutable campaign. +Rectangle CSV SHA256: +`860b4140b7483797842e6c6bdeb1e661d1e8510fb0855cf9a69b772914208666`. +Square CSV SHA256: +`2a2938a1ae4b12bfcc6c33ff3cb8fc332fc55436e1247c32638e8b83fde1b6cc`. +Export and independently check actual bits, source CSV hash, case/grid/phase, +origin, material, dt, depth and field/basis/load/reconstruction versions. +All source/support/pressure decisions remain exact-positive-area admissions. + +SI primitives and continuum derivation are in [mathematics.md](mathematics.md). +Native M/B/K/geometry/support and selected solve come from the existing owners, +with separately reviewed dimension guards only. New body loads use existing +3x3Duffy volume quadrature; new traction loads use three-point Gauss after all +half-cell/P0 splits. Retain original two-point trace maps as existing flux maps, +not as the new traction integrator. Gv is the full vector H1 Riesz integral +of grad(phi):grad(phi)+Lref^-2 phi.phi, with the consistent mass term. + +## Raw custody and native observations + +One process per exact case, serialized in table order. Each creates a fresh +case directory and exports original source/geometry/bulk operators and maps, +all physical load points, body and boundary vectors separately, actual A, +all selected factor coordinates and iteration0,1,2,3 states with original +residuals flushed after each state. No CV3 unscaled baseline solve is selected. +Retain original full A, including any rounding asymmetry. No floor or fallback. + +Native deciding algebraic checks stay at1e-10: dimensionally normalized original +momentum/continuity, physical cell flux, forced work and residual-corrected work, +absolute residual work, direct physical versus nodal body/boundary power and +resultants/torques, rigid virtual-work momentum. Export each signed contribution +so body/boundary cancellation cannot conceal an omitted load. No unforced +energy-decrease gate. Exact defining formulas are the prospective source. +Independent factor identity checks retain CV2's1e-10 budget even though the +MMS exporter does not reuse CV2's fixture-coupled experiment/test adapter. + +## Independent solution and assembly comparison + +R1 reconstructs exact represented exported A/B/RHS. R2 independently integrates +exact rational represented-source geometry, Q1/P0 M/B/K/H1, continuum body force +and polynomial edge traction; it imports no native geometry/assembly/Gauss code +and uses no exported rounded operators as its own target. It uses the actual +binary64 primitives BEFORE coefficient products/sums. Preserve R1/R2 gap and +the native error against each. Fixed CV2 coefficient budgets remain1e-10 using +Uref=1 and Pref=rho Uref Lref/dt+mu Uref/Lref (distinct from tau_ref=1Pa). + +Native-versus-reference comparison alone is not a guaranteed bound. Select the +exact rational inverse-defect/residual certificate in mathematics.md for BOTH +targets. Candidate inverse generation is fixed highprecision LU; precision, +inverse representation, source hashes and commands require oracle freeze. +No failed certificate can be replaced with an estimated budget under v1. + +## Physical norms and conservative decisions + +For q=1,2, velocity relative error is +`||uh-u||_Lq(Omega) / ||u||_Lq(Omega)` with Euclidean vector magnitude; +pressure relative error is `||ph-p||_Lq(Omega)/||p||_Lq(Omega)` without mean +subtraction. Vector L2 uses the sum of component squares. Traction error is +`(integral_Gamma |sigma_h n-g|^q / length(Gamma))^(1/q) / tau_ref`. +Use liquid-side P0 pressure and the actual component-Q1 derivatives on each +common split piece, never averaged/extrapolated/re-fitted stress. Report normal +and tangential components and per-edge maxima separately. The prescribed g is +nonzero and is explicitly subtracted; no zero-traction claim follows. + +Independently integrate all L2 squared polynomial errors by exact moments. +For L1, use bounded polynomial-range/subdivision followed by outward-enclosed +square roots; mere Gauss sample agreement is not acceptance. Freeze its actual +algorithm, depth/work limits and absolute integration budget in the independent +oracle before execution. The selected v1 Bernstein algorithm has depth24, a +case-wide2,000,000-created-piece cap and256-bit outward square roots. Its +absolute L1 width is at most1e-8 times domain measure times the declared unit +velocity/pressure/stress scale, followed by the independent relative1% budget; +this internal measure scaling is not a claim of an exact polynomial L1 rule. Report L-infinity as a lower/upper supremum enclosure +from piecewise polynomial range bounds and point witnesses, with the exact +subdivision definition frozen, not as a claimed cut-face convergence order. + +Propagate coefficient, assembly, reference and integration uncertainty to every +error numerator, analytic denominator and traction norm by interval operations. +Each total numerical uncertainty must be at most1% of the positive lower bound +of its reported discretization error AND1% of the refinement difference +interval's distance from zero. A resolved negative coarse difference is reported +with its uncertainty; only the finest-pair order decides. An interval crossing +zero leaves the difference unresolved. A nonpositive analytic denominator +refuses the norm decision; no arbitrary positive floor is inserted. + +All six finest n16 family metrics (velocity/pressure/traction, L1/L2) must have +upper bounds<=.05. For each family and each metric report4->8 and8->16 orders; +the deciding pair is8->16. Its conservative lower order is +`log2(E8.lower/E16.upper)`, required>=.9 with positive quantities. Refinement +gap uncertainty includes both levels. Keep exact interval endpoints and the +unrounded conservative decision. Never replace unknown uncertainty with zero. + +At each n, also report both phases' norms and the same-domain reconstructed +origin-versus-quarter differences for velocity/pressure/traction. Partition at +the UNION of both grids' knots/P0 boundaries; normalize identically to analytic +field norms/tau_ref. These phase differences have no invented pass cutoff. + +## Rank and full H1/L2 diagnostics + +Keep every physical pressure row including the constant mode. Require exact +full row rank B, via the frozen exact algorithm. Freeze rank algorithm and +deterministic pivot identity before execution. Gv and Qp=positive exact cut-cell +volumes define `Qp^-1/2 B Gv^-1 B^T Qp^-1/2`; compute the complete spectrum, +minimum-mode pressure pattern and its square-root diagnostic with independently +bounded uncertainty. Fixed alternating pressure is `(-1)^(cell_i+cell_j)`, +Qp-normalized without mean subtraction; report its Rayleigh quotient and any +near-checkerboard mode overlap. Report constant pressure similarly. No beta +cutoff, row deletion, gauge or uniform inf-sup theorem. CV2 A/Schur scaling +spectra remain separate material/dt-dependent diagnostics. + +## Always-on evaluator guards and refusals + +Before evaluation freeze normal/-O/-OO guards and complete output/report shape. +Negative controls must reach named mathematical guards: omitted/reversed/wrong +pressure traction; wrong/omitted body force; wrong phase or source; wrong P0 +trace; two-point degree-four oblique traction; wrong final velocity with +internally consistent rewritten residual metadata. Keep unrelated invariants +valid; parser/nonzero-exit rejection alone is insufficient. Full normal/O/OO +scientific reports must be byte-identical. Retain every case/refusal/attempt. + +## Execution and stopping + +The [resource plan](resources.md) covers all nine cases before any selected +execution, including rank/highprecision/certificate/L1 cost. A hard cap, +rank/certificate failure or unresolved norm/order interval stops the campaign +with completed outputs retained. No coarsening, posthoc tolerance/precision +change, hidden backend fallback or selected-phase omission. No numerical +command is launched under this preparation-only continuation. + +## Prepared commands and interpreter evidence + +The native preparation checkpoint is b9ec50c779122587a5da30318b29b42e1825ec10. +Its copied release executable SHA256 is +`72f4245bf56a56da6e8a8c223c2a7a56220fc914491cf6997416c269945f9ad4`; +it has not been executed. `run_native.py` prepares one fixed nine-case sequence +with fresh output, per-case limits, total wall cap and retained stop receipts. +The three new Rust numerical contracts remain explicitly ignored in ordinary +CI; eventual admitted `cargo test ... -- --ignored` commands select them. + +The independent analyzer's prospective CLI is `analyze.py case CASE OUTPUT`, +`analyze.py audit CASE OUTPUT`, and `analyze.py aggregate RAW REPORTS OUTPUT`. +`check_oracle.py RAW FRESH_OUTPUT` prepares all nine full case calculations plus +aggregate in each of normal/-O/-OO (30 subprocesses), then14 targeted controls +in each mode (42 subprocesses). Full scientific reports must be byte-identical +even when the scientific method fails a gate. Tooling success cannot relabel a +scientific failure; all cases/modes remain retained. Actual fixed source hashes +and argv are in commands.json and SHA256SUMS-preparation. Check that snapshot +before any later admitted launch; no command here was numerically executed. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/replan.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/replan.md new file mode 100644 index 00000000..8aea3482 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/replan.md @@ -0,0 +1,46 @@ +# Bounded dimension-guard replan, before source edits + +PR141 explicitly anticipates the Layout n2..8 ceiling and authorizes a bounded +n16 extension. Actual source has two further independent limits: + +- `assembly.rs::Operators::build`: positive active basis length at most256. +- `solver.rs::validate` and `solver.rs::qr`: velocity row dimension at most256. + +The n16 rectangle alone needs275 coefficients with unchanged support rules. +For X velocity, positive hat support gives i=2..14 (13) and j=3..13 (11), +or143. For Y velocity, i=2..13 (12) and j=3..13 (11), or132. These strict +support inequalities are separated from the represented polygon endpoints; +no equality, floor or ambiguous tiny support is involved. Thus changing only +Layout cannot implement the admitted nine cases. This is source reasoning, +not a selected assembly, solve or numerical probe. + +Proposed smallest correction: retain the algorithms and formulas, extend the +private layout ceiling to16, the active-velocity and solver velocity ceilings +to the admitted full-grid upper bound544, and bound pressure rows by256. Add +checked n/node/dense-size arithmetic and above-ceiling refusal tests. Keep +the same Cholesky, QR, original full target and exactly three compensated +corrections. The full-grid KKT upper bound is800; no baseline KKT solve is +required for this pilot. Extend no production owner and select no new backend. + +Alternatives: silently coarsening to8 violates admission; copying a second +solver creates divergent ownership; deleting supports/pressures changes the +method. All are rejected. Frozen CV2 code remains at b0a9d52 and prior branch +head902f609; this child will receive a distinct source freeze if admitted. +It must not claim that the modified solver source is byte-identical to CV2. + +Disposition: pending independent prospective review. No dimension guard has +been changed at the time this replan was recorded. A review rejecting this +bounded extension stops source implementation and returns the exact write set +and reason to the repository lead. No numerical execution follows from writing +or committing this document. + +## Subsequent preparation disposition + +The section above is the immutable timing account recorded in bc82e92 BEFORE +source edits. The independent numerical reviewer subsequently accepted this +bounded cap replan for prospective preparation; its exact external report is +`/workspace/rheon-q2-static-mms-independent/preparation-proposal.md`. PR143 was +published at that documentation-only checkpoint to expose the shared write set +before edits. The child now contains the declared guard changes with the same +basis/assembly/solver arithmetic. No CV2 ancestor, frozen source or archive was +modified. Full source/oracle/resource readiness and execution remain separate. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/resource_supervisor.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/resource_supervisor.py new file mode 100644 index 00000000..0fe83a32 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/resource_supervisor.py @@ -0,0 +1,157 @@ +"""Prospective CV3-A child custody; importing this module launches nothing. + +Not an admission grant. Future fixed campaign commands must bind this source, +the child executable/oracle hashes and resource settings before numerical use. +""" +import hashlib +import json +import os +from pathlib import Path +import resource +import signal +import subprocess +import time + + +def require(condition, message): + if not condition: + raise RuntimeError('CV3 resource guard: ' + message) + + +def digest(path): + with Path(path).open('rb') as stream: + return hashlib.file_digest(stream, 'sha256').hexdigest() + + +def output_size(root): + total = 0 + for path in root.rglob('*'): + require(not path.is_symlink(), 'unexpected output symlink') + if path.is_file(): + total += path.stat().st_size + return total + + +def rss_bytes(pid): + try: + lines = Path(f'/proc/{pid}/status').read_text().splitlines() + except FileNotFoundError: + return 0 + for line in lines: + if line.startswith('VmRSS:'): + return int(line.split()[1])*1024 + return 0 + + +def run_child(argv, output_root, receipt, *, kind, frozen_files, total_deadline): + """Called only by a separately admitted, source-frozen serialized driver. + + Caller creates a fresh corpus root and owns all-nine case completeness. + Child owns one case, no subprocess descendants; each child gets a new group. + No retry, fallback, precision change or output deletion occurs here. + """ + require(kind in ('native', 'reference'), 'declared workload kind') + require(argv and all(isinstance(a, str) and a for a in argv), 'complete exact argv') + output_root = Path(output_root) + receipt = Path(receipt) + require(output_root.is_dir() and not output_root.is_symlink(), 'fresh owned corpus directory') + require(receipt.resolve().is_relative_to(output_root.resolve()), 'receipt/log within accounted output root') + require(not receipt.exists(), 'fresh receipt path') + require(frozen_files, 'nonempty source/executable freeze') + for path, expected in frozen_files.items(): + require(digest(path) == expected, 'frozen executable/oracle/source identity changed') + cpu_seconds, address_bytes, output_bytes = ( + (120, 4 << 30, 2 << 30) if kind == 'native' else (1800, 8 << 30, 8 << 30)) + wall_seconds = cpu_seconds + started = time.monotonic() + require(total_deadline > started, 'total wall resource exhausted before case') + original_mask = None + def child_limits(): + signal.pthread_sigmask(signal.SIG_SETMASK, original_mask) + resource.setrlimit(resource.RLIMIT_AS, (address_bytes, address_bytes)) + resource.setrlimit(resource.RLIMIT_CPU, (cpu_seconds, cpu_seconds)) + resource.setrlimit(resource.RLIMIT_FSIZE, (output_bytes, output_bytes)) + resource.setrlimit(resource.RLIMIT_CORE, (0, 0)) + env = os.environ.copy() + env.update({key: '1' for key in ('OPENBLAS_NUM_THREADS', 'OMP_NUM_THREADS', + 'MKL_NUM_THREADS', 'BLIS_NUM_THREADS', 'NUMEXPR_NUM_THREADS')}) + log = receipt.with_suffix('.log') + require(not log.exists(), 'fresh child log path') + record = {'argv': argv, 'kind': kind, 'status': 'starting', + 'frozen_files': frozen_files, 'cpu_seconds': cpu_seconds, + 'address_bytes': address_bytes, 'output_bytes': output_bytes, + 'wall_seconds': wall_seconds, 'clock': 'monotonic', 'peak_observed_rss': 0} + def retain(): + receipt.write_text(json.dumps(record, indent=2, sort_keys=True)+'\n') + retain() + child = None + with log.open('xb') as stream: + try: + original_mask = signal.pthread_sigmask(signal.SIG_BLOCK, {signal.SIGINT, signal.SIGTERM}) + try: + child = subprocess.Popen(argv, stdin=subprocess.DEVNULL, stdout=stream, + stderr=subprocess.STDOUT, env=env, start_new_session=True, + preexec_fn=child_limits) + finally: + # Pending termination is delivered only after the child handle + # has an owner; the child restores its own mask before exec. + signal.pthread_sigmask(signal.SIG_SETMASK, original_mask) + record.update(status='running', pid=child.pid) + retain() + reason = None + while child.poll() is None: + now = time.monotonic() + resident = rss_bytes(child.pid) + record['peak_observed_rss'] = max(record['peak_observed_rss'], resident) + size = output_size(output_root) + if now >= total_deadline: + reason = 'total wall resource refusal' + elif now-started >= wall_seconds: + reason = 'per-case wall resource refusal' + elif resident > address_bytes: + reason = 'RSS resource refusal' + elif size > output_bytes: + reason = 'aggregate output resource refusal' + if reason: + try: + os.killpg(child.pid, signal.SIGTERM) + except ProcessLookupError: + pass + try: + child.wait(timeout=2) + except subprocess.TimeoutExpired: + try: + os.killpg(child.pid, signal.SIGKILL) + except ProcessLookupError: + pass + child.wait() + break + time.sleep(0.1) + child.wait() + record.update(exit_code=child.returncode, elapsed=time.monotonic()-started, + output_bytes_observed=output_size(output_root), status='completed') + if reason: + record.update(status='refused', reason=reason) + elif time.monotonic() >= total_deadline: + record.update(status='refused', reason='final total wall resource refusal') + elif record['elapsed'] >= wall_seconds: + record.update(status='refused', reason='final per-case wall resource refusal') + elif child.returncode != 0: + record.update(status='refused', reason='child failure/resource signal') + elif record['output_bytes_observed'] > output_bytes: + record.update(status='refused', reason='final aggregate output resource refusal') + retain() + require(record['status'] == 'completed', record.get('reason', 'child refusal')) + except BaseException as error: + if child is not None and child.poll() is None: + try: + os.killpg(child.pid, signal.SIGKILL) + except ProcessLookupError: + pass + child.wait() + record.update(status='refused', reason=str(error), elapsed=time.monotonic()-started) + if child is not None: + record['exit_code'] = child.returncode + retain() + raise + return record diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/resources.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/resources.md new file mode 100644 index 00000000..33afb3e3 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/resources.md @@ -0,0 +1,99 @@ +# CV3-A all-case prospective resource gate + +Status: source-level resource design reviewed and frozen for preparation. +This records prospective ceilings, not measured runtime or execution admission. +No selected assembly, test, rank, inverse, spectrum or quadrature benchmark ran. + +## Source-derived sizes + +Full-grid upper bounds at n4/8/16 are respectively40/144/544 velocities, +16/64/256 pressure rows, and56/208/800 KKT rows. These bounds apply to every +fixture at that level, without a support count probe. Exact source/support +reasoning sharpens the rectangle counts: + +| rectangle n | velocity | pressure | KKT | +| --- | --- | --- | --- | +|4|40|16|56| +|8|98|36|134| +|16|275|120|395| + +For n16 square at both phases, the bounding box contains at most128 velocity +supports and49 primal cells, hence177 KKT rows; this is an upper bound, not an +executed active-space count. Thus395 is the largest actual-corpus KKT bound. +The old CV2 baseline is not selected, and its square-matrix ceiling544 is not +presented as permission for an800-row full-grid KKT baseline solve. + +Native binary64 dense storage at the universal bound is2.37MB per544-square +matrix,1.11MB per544x256 block and5.12MB per800-square KKT. The selected solver +does not form the KKT or a Gram solve. Its work is Cholesky O(nv^3), triangular +velocity-pressure work O(nv^2*np), QR/reconstruction O(nv*np^2), then exactly +three corrections. Native geometry/quadrature/CSV buffers and factor diagnostics +dominate these small matrix byte estimates. A conservative common-patch bound +is1024 patches at n16 with up to6 fan triangles and9 points/triangle:55,296 +points and442,368 local basis records before source-specific clipping reduces +them. These are storage/cost bounds, not measured memory use. + +Independent rational operator assembly/rank may incur coefficient growth. +395-square multiprecision inverse/LU generation and exact rational inverse-defect +checks dominate reference cost. Dense defect work is O(395^3) products per +target; using the exact target's known zeros reduces work without changing +the certificate. Support overlap bounds each velocity A row by25 entries and +its B-transpose row by6; each B row has at most12 entries. Thus +`nnz(C)<=31*nv+12*np`, at most9,965 for the largest rectangle, and the +streamed395-row defect needs at most3,936,175 exact products per target. +The same-component H1 stencil has at most9 entries per row, so its275-row +defect has at most680,625 exact products. Highprecision inverse generation +remains cubic; these structural counts imply neither runtime nor bit-growth guarantees. A bit-growth/RSS bound and demonstrated time feasibility do +not follow from binary64 storage or a small residual. Bounded L1 subdivision +and certified H1 spectrum add separately owned limits. Unmeasured runtime stays +a declared risk, not a measured feasibility claim or an extra approval ritual. +The admitted campaign may later stop at these frozen caps with outputs retained. + +## Inspected environment and proposed hard caps + +The current cgroup exposes16GiB RAM and4 CPU equivalents; host reports5 logical +CPUs, approximately22GiB available workspace disk. Only cgroup limits govern +admission. Installed Python3.12 has mpmath1.3.0, numpy2.3.5 and sympy1.14.0; +python-flint is not installed. Rust uses the existing1.92 toolchain/Cargo lock, +one compiler job. No dependency or Cargo change is admitted. + +| Stage | concurrent workers | address-space ceiling | new-output ceiling | per-case CPU/wall | total wall | +| --- | --- | --- | --- | --- | --- | +| native nine-case campaign |1|4GiB|2GiB|120s/120s|900s| +| independent case reference, each interpreter mode |1|8GiB|8GiB shared across modes|1800s/1800s|10,800s/mode;32,400s for normal/-O/-OO| +| evaluator controls/aggregation |1|8GiB|2GiB|1800s/1800s per subprocess|10,800s| + +Reserve remaining memory/disk for toolchain, lead-independent work and custody. +All three complete scientific interpreter reports use the same single native +corpus; full reference calculations are serialized in each mode, without +substituting aggregation of cached results for actual mode checks. The larger +prospective total follows this unchanged evidence requirement, before any data. +Raw native/reference/control caps sum to12GiB; reserve2GiB for the eventual +archive and2GiB for headroom (16GiB new allocation against about22GiB free). +A final archive exceeding2GiB is a custody refusal, not permission to delete +raw evidence or silently omit payloads. Native/reference/control workloads +never run concurrently. Negative controls copy one fixed n4 case, not nine +whole-corpus trees, and output links are refused by the resource supervisor. +Enforce CPU/address-space/per-file limits on children; parent owns wall timeout, +aggregate-output/RSS observation, process-group cancellation, wait/reap and +failure receipts. Stop at a cap, retain partial outputs and report the exact +case/stage. No automatic retry, precision/backend fallback or later-level skip. +Fresh output creation must fail on existing paths, never overwrite earlier data. +Binary/source/oracle/manifests and actual argv must be frozen before launch. + +## Preparation disposition + +The numerical-reference candidate and actual bounded L1/spectral/rank algorithms +are complete and source-reviewed. preparation-freeze.md and commands.json bind +all-case sizes/costs, supported algorithms, actual source hashes/commands and +enforceable CPU/RAM/output limits. scipy1.17.0 is also present for the untrusted +eigenvector generator; generator accuracy is never assumed. +Resource-design admission does not assert that every reference will finish in +its cap: the contract explicitly permits a retained resource refusal and then +replanning. No additional benchmark or user approval is required solely because +runtime is unmeasured. Known infeasibility or a mathematical inability to bound +the chosen uncertainty would block launch; neither has been established here. +The current handoff is preparation only, so no scientific corpus is run to +manufacture a feasibility result. If the later admitted campaign cannot establish +the guaranteed uncertainty within these caps, return to the lead for a separately +reviewed backend/protocol decision. The1% bound and5%/.9 physics criteria remain unchanged. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/run_native.py b/docs/plans/fluid-accuracy-composition/q2-static-mms/run_native.py new file mode 100644 index 00000000..5762ad98 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/run_native.py @@ -0,0 +1,64 @@ +"""Prospective serialized CV3-A native campaign owner; never runs on import. + +This driver is prepared, not executed, under the preparation-only handoff. +An eventual run uses the separately reviewed complete preparation snapshot. +""" +import hashlib +import json +from pathlib import Path +import sys +import signal +import time +from resource_supervisor import require, run_child + +CASES = tuple(f'{family}-n{n}' for family in ( + 'rectangle-origin', 'square-17-origin', 'square-17-quarter') for n in (4, 8, 16)) +BINARY = Path('/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference') +BINARY_SHA256 = '72f4245bf56a56da6e8a8c223c2a7a56220fc914491cf6997416c269945f9ad4' + + +def main(): + require(len(sys.argv) == 2, 'usage run_native.py FRESH_NATIVE_ROOT') + root = Path(sys.argv[1]).absolute() + require(not root.exists(), 'new native campaign path required') + require(BINARY.is_file() and not BINARY.is_symlink(), 'frozen ordinary native executable') + require(hashlib.sha256(BINARY.read_bytes()).hexdigest() == BINARY_SHA256, 'native preparation binary identity') + root.mkdir() + receipts = root # receipt/log files stay inside the accounted corpus root + deadline = time.monotonic()+900 + inventory = {'native_preparation_checkpoint': 'b9ec50c779122587a5da30318b29b42e1825ec10', + 'binary': str(BINARY), 'binary_sha256': BINARY_SHA256, + 'cases': list(CASES), 'completed': [], 'status': 'starting'} + path = root/'campaign.json' + def retain(): + path.write_text(json.dumps(inventory, indent=2, sort_keys=True)+'\n') + retain() + try: + for case in CASES: + argv = [str(BINARY), str(root/case), case] + run_child(argv, root, receipts/(case+'-receipt.json'), kind='native', + frozen_files={str(BINARY): BINARY_SHA256}, total_deadline=deadline) + inventory['completed'].append(case) + inventory['status'] = 'running' + retain() + require(len(inventory['completed']) == 9, 'complete fixed nine-case corpus') + inventory['status'] = 'native-completed-independent-qualification-pending' + except BaseException as error: + inventory.update(status='stopped', reason=str(error)) + raise + finally: + retain() + + +if __name__ == '__main__': + def terminated(signum, frame): + raise InterruptedError('CV3 native campaign termination requested') + previous = signal.signal(signal.SIGTERM, terminated) + try: + try: + main() + except Exception as error: + print(str(error), file=sys.stderr) + sys.exit(1) + finally: + signal.signal(signal.SIGTERM, previous) diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/source-review/review.md b/docs/plans/fluid-accuracy-composition/q2-static-mms/source-review/review.md new file mode 100644 index 00000000..25bf1b45 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/source-review/review.md @@ -0,0 +1,52 @@ +# Independent CV3-A native source / protocol review + +**Disposition: source-reviewed preparation is complete and coherent for the bounded CV3-A candidate, subject to the root's final complete-source/command custody freeze. No selected execution or numerical acceptance is claimed.** The prior test, supervisor-control and lifecycle findings are closed. The independent oracle source and fixed resource design are now complete prospective components, replacing the earlier unfinished-source disposition. Unmeasured runtime and integer-growth cost remain explicit risks under enforced stop limits, not a requirement for another benchmark or user approval. + +Native checkpoint is `b9ec50c779122587a5da30318b29b42e1825ec10`; the copied, unexecuted binary SHA256 is `72f4245bf56a56da6e8a8c223c2a7a56220fc914491cf6997416c269945f9ad4`. Dependency remains exact PR139 `902f6092de6044419d028f92dabd8e59ae7a87ba`, admission PR141 `38c40ca7b4b2401e0ac802f12c647f7229072f52`. Updated [source-manifest.json](source-manifest.json) records observed native algorithm/resource bytes, final commands.json and relevant protocol/resource documents. Root is updating lifecycle documents concurrently; plan/issues/ledger/replan are deliberately excluded from this final hash set. Documentation hashes are observations, not authority to prevent subsequent status updates. + +The final independent preparation manifest is `043345393a6a418aa2b9be99ca4c74452be218972e314ad91c63001af701cdbe` (`/workspace/rheon-q2-static-mms-independent/SHA256SUMS-preparation`). I read its final README and readiness review and checked that all 16 listed hashes match. This is source custody, not execution or a new independent proof of every oracle theorem. The independent numerical owner and root's complete-source review own those mathematical implementation dispositions; this review covers native formulas, integration/solve interface, resource lifecycle and the separately authored harness contract. + +No build, numerical test, native assembly, solve, oracle calculation, rank, spectrum, quadrature probe or benchmark was run by this reviewer. The oracle owner reports AST-only source parsing without scientific imports. All numerical results, certificates, orders, optimized-mode identities and mutation outcomes remain unknown. + +## Findings and correction recheck + +1. **Closed by source recheck — final wall deadlines.** The original prospective `resource_supervisor.py` checked deadlines only inside its polling loop. The corrected completion path now refuses when the final monotonic time reaches the total deadline or recorded elapsed time reaches the per-case limit. I read the complete corrected file; no timing experiment was run. + +2. **Closed by source recheck — redirected child-log accounting.** The corrected source requires `receipt.resolve().is_relative_to(output_root.resolve())`; the `.log` shares that parent, so both belong to the recursively accounted root. The always-on guard precedes log/receipt creation and launch. The final all-nine driver/path/limit contract is now source-reviewed; root custody freeze remains. This is inspection, not observed disk growth. + +3. **Closed by source recheck — lifecycle records reconciled.** `replan.md` preserves its original pre-edit timing account and appends the subsequent independent preparation acceptance with the external report identity. Issues, plan and ledger now record the implemented guard changes, compile-only failure/repairs and owner-reported cargo-check/strict-Clippy/formatting passes, with the preparation-only execution boundary retained; the later final independent source/resource disposition supersedes that earlier in-progress status. No further user confirmation is invented. This reviewer did not rerun the reported compile-only checks. + +4. **Superseded preparation status — oracle and resource source now complete.** The final independent snapshot contains native parsing/audit, full R1/R2 and H1 certificates, bounded L1/L2/supremum norms, cross-phase reconstruction, conservative aggregation and the normal/−O/−OO harness. The resource design now declares all-case commands/costs and enforceable limits rather than requiring a selected benchmark to demonstrate runtime. A cap, failed exact certificate, rank or unresolved integration interval will remain a retained stop if a later admitted attempt encounters it. No known infeasibility was established by this source review. Final root snapshot/command freeze is still required; the current handoff remains preparation only. + +**Closed during review:** the original Cholesky cap test used nonsquare 545×1 data. The owner changed it to a valid 545×545 identity matrix. I read the corrected source; it now isolates the dimension guard. No test was executed. Iterator/enumerate changes in vertex and load-CSV export were also re-read and do not change the reviewed formulas. + +No additional blocking defect in the continuum forcing, native integration or forced-work formulas was identified by inspection. That statement is bounded to the hashed source and is not evidence that nine cases will satisfy any numerical criterion. + +## Source and mathematics assessed + +- `cases.rs` declares exactly the admitted three families × n4/8/16, moves only the grid origin for the quarter phase, and pins the same polygon vertex bits and expected source-CSV hashes across levels. It never regenerates square vertices using trigonometry. `experiment.rs` exports primitives/vertex bits, case, phase and version identities before assembly. The literal expected CSV hash is metadata; actual source-file byte/hash/bit agreement still requires the independent evaluator. This reviewer did not generate a source CSV or rerun prior custody. +- `field.rs` implements the admitted quadratic divergence-free velocity, absolute nonconstant pressure, symmetric Newtonian stress, `f=(rho/dt)u-div(sigma)` and outward `g=sigma n`. The signs agree with the written derivation: `div(sigma)=(2mu U/L²−tau(1+Y)/L, −2mu U/L²−tau(2+X)/L)`. Constants derive from represented MU and other primitives rather than separately rounded .2/.4 coefficients. `u_star=0`, unit depth and positive stress scale are explicit. This is symbolic/source reasoning, not evaluated field data. +- `loads.rs` forms continuum body and boundary vectors separately; no desired discrete field is used to manufacture the RHS. The three-point traction integrator visits the inherited **global** physical-edge records, already split at all common half-cell planes (including P0 planes). It evaluates the component basis on those segments with outward normal times integration measure. The old two-point flux/constant-stress trace owner is untouched. Degree-four load products are covered by the new three-point edge rule in real arithmetic; the existing 3×3 Duffy volume rule is sufficient for the stated polynomial degrees. This does not certify native rounding or physical traction error. +- The H1 matrix includes same-component full gradient dot products plus consistent `Lref^-2 phi_i phi_j`, multiplied by depth. It is not symmetric-strain energy and is not CV2's A-dependent scaling diagnostic. Exact Qp, B-rank and certified H1/L2 spectral results belong to the independent oracle and do not exist yet. +- The original full A is built as M/dt+K and retained by `Factor`; the selected Cholesky/Householder-QR/map-back formulas and exactly three compensated original-residual corrections are unchanged against the dependency. All states 0..3 are exported, with the lower KKT residual sign explicitly distinguished from the correction API's desired `g=-Bu`. No unscaled baseline call, pressure gauge, support floor, pressure-row deletion, stabilization, Gram solve or fallback was added. +- Original momentum/continuity, physical cell flux, forced raw/residual-corrected work, absolute residual work and direct-versus-nodal body/boundary powers are separately checked at the fixed native budget. Rigid translations/rotation compare inertia against both continuum load contributions; direct and nodal resultants/torques are exported separately. The forced identity is consistent with `r=A U−B^T P−F`: `2E+dt(U^T K U−bodypower−boundarypower)=dt(P^T B U+U^T r)`. No unforced energy-decrease gate was carried over. Native direct/nodal agreement shares native integration and cannot replace independent exact load or traction validation. + +## Diff and scope review + +Against exact `902f609`, existing private Rust changes are limited to the three declared helpers: Layout n≤16 with bounded checked node allocation; active velocity≤544 and pressure≤256 with checked dense size; selected-solver velocity validation/QR≤544 and explicit pressure≤256. I inspected the actual diff: existing basis/support/M/B/K, trace, clipping, geometry and solve arithmetic were not changed. The shared `validate()` ceiling also bounds the inherited diagnostic baseline helper; the CV3 executable never selects or calls that baseline, and the resource document correctly disclaims an 800-row baseline campaign. + +The fresh-directory executable preserves partial output and refusal reasons and flushes states as observed. The prospective `run_native.py` pins the actual binary hash, uses exactly the nine fixed case names and 900s total wall budget, and retains campaign stop state without retry. Receipts/logs are files inside the accounted raw root, preserving exactly nine case directories for the independent parser. The final supervisor contains child CPU/address-space/file limits, final wall checks, aggregate output/RSS observation and scoped process-group custody. Final `ProcessLookupError` handling around TERM/KILL tolerates a child exiting during cancellation while still waiting/reaping and retaining a refusal. Native-driver and harness SIGTERM handlers raise into existing exception/finally cleanup; SIGINT/SIGTERM are masked during Popen creation until the parent owns the handle, and restored in the child before exec. These are source-level lifecycle observations, not executed cancellation tests or a SIGKILL recovery claim. + +The independently authored `check_oracle.py` prepares 30 complete reference/aggregate calls and 42 controls (10 mathematical plus four malformed, each in normal/−O/−OO). It retains scientific negatives across every complete case/mode, compares scientific report bytes separately from scientific acceptance, requires an untouched target guard to pass before claiming a mutation discriminator, and rechecks original raw hashes after success or refusal. Mathematically wrong final velocity retains recomputed original residual metadata and must fail the actual R1 accuracy gate. Fixed hard copies preserve the declared square-n4 basename; no source symlinks are used. Bounded integer codec policy is 1,000,000 decimal characters and 3,000,000 bits; the analyzer's order-display dyadic enclosures do not change exact threshold decisions. + +Source caps are native one worker/4GiB AS/2GiB output/120s per case/900s total; full references one worker/8GiB AS/8GiB shared output/1800s per child/10800s per mode/32400s total; controls one worker/8GiB AS/2GiB output/1800s per child/10800s total. Native/reference/control payload ceilings total 12GiB, plus 2GiB archive and 2GiB headroom, against the inspected approximately22GiB free. These are planned limits, not measured use or guaranteed completion. Actual mathematical/resource failure stops without fallback or evidence deletion. No Cargo, Session, provider, recording, SQLite, UI or production-owner edits were introduced by this review. + +## Protocol assessment and required next gate + +The protocol keeps continuum physical reconstruction, prescribed-traction subtraction, absolute pressure, exact represented R2 versus rounded-export R1 targets, fixed coefficient accuracy, conservative 5%/.9 norm/order decisions and the 1% numerical-uncertainty budget distinct. It explicitly refuses unresolved intervals rather than replacing them with zero and keeps phase comparisons separate from invented pass thresholds. The exact inverse-defect proposal is mathematically coherent: for `E=I−RC` with exact `||E||∞<1`, the original-target error is bounded by `||R(b−Cz)||∞/(1−||E||∞)`. Citing this identity is not an executed certificate; both target certificates and propagated physical bounds must actually succeed under the frozen resources. + +The three new numerical contracts now each have an explicit `#[ignore]` reason requiring frozen oracle/resource execution admission. Ordinary test selection will therefore skip those new contracts; later resource-bound named commands must explicitly select them with `--ignored`. They remain unrun and unqualified. Inherited helper unit tests are separate; this source review executed none. + +Final preparation boundary: root completes the source/protocol/resource command and custody freeze, then decides any selected execution within the existing admitted scope. No extra benchmark or new user approval is required merely because runtime is unmeasured. The present continuation runs nothing. Later cap/certificate/rank/integration failures retain the exact stage and return for a separately reviewed method/backend/resource decision. Actual physical errors, 1% uncertainty budgets, 5%/.9 decisions, all optimized reports and controls remain unverified until that bounded attempt. No literal disk, generic PDE/cut-stability, oblique Dirichlet, moving surface/transport/GCL, GPU/native-UI or production claim follows from preparation. + +Only this external review directory and the already owned CV3-A local preparation map were written. The earlier CV1/CV2 visuals and evidence were not altered, and no screenshot deliverable was created. diff --git a/docs/plans/fluid-accuracy-composition/q2-static-mms/source-review/source-manifest.json b/docs/plans/fluid-accuracy-composition/q2-static-mms/source-review/source-manifest.json new file mode 100644 index 00000000..5712e660 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2-static-mms/source-review/source-manifest.json @@ -0,0 +1,210 @@ +{ + "review_kind": "Final read-only native/interface/resource preparation source review; no selected execution or numerical acceptance", + "worktree": "/workspace/Rheon-q2-static-mms", + "observed_head": "b9ec50c779122587a5da30318b29b42e1825ec10", + "dependency": "902f6092de6044419d028f92dabd8e59ae7a87ba", + "admission": "38c40ca7b4b2401e0ac802f12c647f7229072f52", + "disposition": "Preparation source reviewed and complete subject to root final complete-source/command custody freeze. Runtime risk is unmeasured, not a required extra benchmark or approval. Current handoff remains preparation only.", + "scope": "Native/private algorithms, declared test adapter, build identity files, mathematical/protocol/resource contracts, native driver/supervisor and final command metadata. Not a complete crate/binary custody manifest.", + "concurrent_document_note": "Lifecycle plan/issues/ledger/replan intentionally excluded. Included protocol/resources/commands hashes are observed reviewed bytes; later owning-source status updates require a refreshed freeze rather than changing this snapshot implicitly.", + "independent_preparation_reference": { + "manifest": "/workspace/rheon-q2-static-mms-independent/SHA256SUMS-preparation", + "sha256": "043345393a6a418aa2b9be99ca4c74452be218972e314ad91c63001af701cdbe", + "listed_entries": 16, + "all_listed_hashes_checked": true, + "review_sources": [ + "README.md", + "readiness-review.md" + ], + "scope": "Owner/root-reviewed prospective oracle source; custody checking only, no numerical proof execution." + }, + "binary_reference": { + "path": "/workspace/rheon-q2-static-mms-evidence/grid_static_mms_reference", + "sha256": "72f4245bf56a56da6e8a8c223c2a7a56220fc914491cf6997416c269945f9ad4", + "checkpoint": "b9ec50c779122587a5da30318b29b42e1825ec10", + "selected_execution": "UNRUN" + }, + "python_reference": { + "path": "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "sha256": "fa67443527ed9647f760d807e2a38f26340757123e643c4639cf273ed15d5ea7", + "metadata_hash_checked": true, + "execution": "Not invoked by this review" + }, + "files": [ + { + "path": "Cargo.lock", + "bytes": 104956, + "sha256": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "base_sha256": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "same_as_base": true + }, + { + "path": "Cargo.toml", + "bytes": 2433, + "sha256": "fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409", + "base_sha256": "fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409", + "same_as_base": true + }, + { + "path": "docs/plans/fluid-accuracy-composition/q2-static-mms/admitted-contract.md", + "bytes": 11857, + "sha256": "8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "docs/plans/fluid-accuracy-composition/q2-static-mms/commands.json", + "bytes": 8485, + "sha256": "cece8bc5cefeea53096cbad355dc6b25004ff52fa88adbbf68d9ee5d66d0b2e3", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "docs/plans/fluid-accuracy-composition/q2-static-mms/mathematics.md", + "bytes": 4786, + "sha256": "2961ac10ae69b860f3fd9bb71d93b6cb88536c4492b64081cb989648b56697da", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "docs/plans/fluid-accuracy-composition/q2-static-mms/protocol.md", + "bytes": 10392, + "sha256": "778dc5d55174e3ea623593d5c4c9eef9a0b617e8304ab17c55f27499d8fb0a80", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "docs/plans/fluid-accuracy-composition/q2-static-mms/resource_supervisor.py", + "bytes": 7061, + "sha256": "4d742c04931e246baddc21dd77254ce78364540c3a719a0721b58259f0eb560b", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "docs/plans/fluid-accuracy-composition/q2-static-mms/resources.md", + "bytes": 6262, + "sha256": "89082c76e2c4e07ffb36325e8c246c429f69245629ee808fca94ceae4c010762", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "docs/plans/fluid-accuracy-composition/q2-static-mms/run_native.py", + "bytes": 2662, + "sha256": "20bc38740bdbe9df427bac2247f7b4f3932122d8668a5acb7a7291709a252599", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "examples/grid_cut_coupled_reference/solver.rs", + "bytes": 13524, + "sha256": "09656e1f1f7baca393e4c4119cc1e0b7d09a1464f6bfd5f6ee6df113b6200116", + "base_sha256": "c11dc0a117515c43d7a5862ef5ffe957b18b45c24eb28bf22a336ef1d0fe4e4b", + "same_as_base": false + }, + { + "path": "examples/grid_cut_variational_reference/assembly.rs", + "bytes": 9043, + "sha256": "99b833914669019e2d19398a696ea4426be297b71ad116678f0952188e20e8cd", + "base_sha256": "b1071a627eeb9017f3a30816b29be5ac45f179a9838b2c18e291c731cb78074c", + "same_as_base": false + }, + { + "path": "examples/grid_cut_variational_reference/basis.rs", + "bytes": 8164, + "sha256": "eda120b04a35726d8b77c4ac9671f601b3b647479d47bf7dd582eadd954ae6eb", + "base_sha256": "04bb024a4d5e527bedb81c5530082ee7d53bbc36336852125f2651582b593069", + "same_as_base": false + }, + { + "path": "examples/grid_cut_variational_reference/clip.rs", + "bytes": 6889, + "sha256": "c7b688bf56300078c2d81c64fdbadd45d36c8492f33b10391470dedeb18a70b4", + "base_sha256": "c7b688bf56300078c2d81c64fdbadd45d36c8492f33b10391470dedeb18a70b4", + "same_as_base": true + }, + { + "path": "examples/grid_cut_variational_reference/export.rs", + "bytes": 10095, + "sha256": "e7cb49d4d868ab6a95097d57d1078af246d23fd615815d6392b82b5db542b0c7", + "base_sha256": "e7cb49d4d868ab6a95097d57d1078af246d23fd615815d6392b82b5db542b0c7", + "same_as_base": true + }, + { + "path": "examples/grid_cut_variational_reference/observe.rs", + "bytes": 11071, + "sha256": "8fa6a15fe1a894fca20a0bf57526f80710b662ad8f2649af28e0a4479efc60df", + "base_sha256": "8fa6a15fe1a894fca20a0bf57526f80710b662ad8f2649af28e0a4479efc60df", + "same_as_base": true + }, + { + "path": "examples/grid_cut_variational_reference/trace.rs", + "bytes": 7618, + "sha256": "1d7b76b36a7cf2e7bcdfe8be0557567c8945411016a27aa946d360db8be39153", + "base_sha256": "1d7b76b36a7cf2e7bcdfe8be0557567c8945411016a27aa946d360db8be39153", + "same_as_base": true + }, + { + "path": "examples/grid_geometry_reference/exact.rs", + "bytes": 7896, + "sha256": "9e1ecc2cfdf4d3473eb6ba39eec94854c8c45ca90cb51d2722c23fd029b106d2", + "base_sha256": "9e1ecc2cfdf4d3473eb6ba39eec94854c8c45ca90cb51d2722c23fd029b106d2", + "same_as_base": true + }, + { + "path": "examples/grid_geometry_reference/geometry.rs", + "bytes": 12501, + "sha256": "2f4f4f119e5a848558f92231d17e418c5898164c5bc5d24075e9a3f812297056", + "base_sha256": "2f4f4f119e5a848558f92231d17e418c5898164c5bc5d24075e9a3f812297056", + "same_as_base": true + }, + { + "path": "examples/grid_static_mms_reference.rs", + "bytes": 4551, + "sha256": "f11ea9047c926b1f91cb1fb3abaeb255aee781763dec694382eaab71f9efa177", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "examples/grid_static_mms_reference/cases.rs", + "bytes": 1791, + "sha256": "0dc27434dfe4db52519d676a0a0bd04cbd761b7d01574f7b6b99416ba287d3c1", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "examples/grid_static_mms_reference/experiment.rs", + "bytes": 13647, + "sha256": "68fa852963907bbb05613520295d648258d6b5f25de046bc75ecb79dc32ad53d", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "examples/grid_static_mms_reference/field.rs", + "bytes": 1545, + "sha256": "450a601bd2af115fbbfafc4f5ecb4cafd24b2183e86234861c36332fecd2f8ea", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "examples/grid_static_mms_reference/loads.rs", + "bytes": 4083, + "sha256": "62ba68bf93586c3ce465f9484f6de6a51a4dece5fc7350be100ef8e9347ad00f", + "base_sha256": null, + "same_as_base": null + }, + { + "path": "rust-toolchain.toml", + "bytes": 86, + "sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "base_sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "same_as_base": true + }, + { + "path": "tests/grid_static_mms_reference_contract.rs", + "bytes": 90, + "sha256": "71b1e309a7379a060d001c81e0e45ff9195049bfdc4568323db611707988c1eb", + "base_sha256": null, + "same_as_base": null + } + ] +} diff --git a/docs/plans/fluid-accuracy-composition/q2/admission.md b/docs/plans/fluid-accuracy-composition/q2/admission.md new file mode 100644 index 00000000..1f1bae2e --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/admission.md @@ -0,0 +1,44 @@ +# Q2 geometry prerequisite admission + +Authority: adopted user Q1→Q2 route; canonical PR120/8422f77 plan and linked +architecture/mathematics/verification/qualification; stopped P1 PR121/123/124. +Source parent Q1/f019bb6, scientific freeze b9a9d4c. Q1 completed aligned channel +replay, 12 coarse transport trajectories, then refused n64 source geometry under +fixed criteria. Retain this failure; no positive finest transport admission. + +Exclusive write set declared before editing: examples/grid_geometry_reference.rs, +examples/grid_geometry_reference/*, tests/grid_geometry_reference_contract.rs, +this q2/ directory. Isolated branch implementation/q2-grid-geometry-reference-20261020, +/workspace/Rheon-q2. No existing production/G1/Session/recording/UI/shared lifecycle, +lib exports, dependency, proof or old evidence writes. Fresh origin/main remains +bc2f472787060d9a69cb619ed2c2fea10fd754b6. No AGENTS.md found. Standards pin0fc92a2 +and previously routed numerical/Rust/architecture/implementation guidance apply. + +Lifecycle: Active bounded geometry/reference implementation. This is a private +verification dependency, not another production family or full coupled solver. +Source/protocol/evaluator and independent review freeze before selected tests or +scientific execution. Native polynomial flux/stress identities do not substitute +for full MMS velocity/pressure/physical-traction convergence or water hydrostatics. +Parent/repository lead reconciles canonical shared lifecycle with G1 and controls +merges; no unilateral cleanup, merge or root-plan overwrite. + +Reuse existing GridGeometry indexing/units. Existing StaticObstacleGeometry only +admits closed axis-aligned obstacle boxes; AlignedStrain shares that envelope. +Do not alter those promises or pretend a clipped fluid polygon represents the +exterior of an oblique solid. This reference defines the source moments needed +before selecting extension/active DOFs, B/M/S/W assembly, small-cell policy and +solver. SubmarineStokes dense4096 cap is not a large MMS backend selection. + +Primary source grounding: Larionov–Batty–Bridson2017 supplement eqs5–15 requires +coupled pressure/strain variation and natural full traction, with nonzero disk +interface pressure. Batty–Bridson2007 discusses dual-volume inertia; replacing +mass alone is not geometry accuracy. Our planar clipping/moment reference is an +explicit prerequisite, not a claim of implementing either full solver. +- https://cs.uwaterloo.ca/~c2batty/papers/Larionov2017/supplemental.pdf +- https://www.cs.ubc.ca/~rbridson/docs/batty-siggraph2007-variationalcoupling.pdf + +Final bounded lifecycle: native finite-error geometry/integration campaign and +independent checks complete; see qualification.md/review.md. Exact native topology +is blocked by five retained aperture artifacts before B/M/S/W assembly. Full Q2 +and production water remain unadmitted. No further method/native rerun or widening +is undertaken. Shared canonical lifecycle reconciliation remains parent-owned. diff --git a/docs/plans/fluid-accuracy-composition/q2/analyze.py b/docs/plans/fluid-accuracy-composition/q2/analyze.py new file mode 100644 index 00000000..77f88593 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/analyze.py @@ -0,0 +1,34 @@ +"""Frozen Q2 geometry-only gates; no coupled PDE acceptance.""" +import csv,json,math,pathlib,sys +# Evaluator tooling v2. Frozen scientific criteria and original bytes are +# retained under ../evaluator-tooling/. Guards remain active under -O / -OO. +def require(condition, message): + if not condition: + raise SystemExit("evaluator input refused: " + message) + +root=pathlib.Path(sys.argv[1]) +rows=list(csv.DictReader((root/'summary.csv').open())) +require(len(rows)==24, 'q2: input contract at original line 5') +results=[] +for row in rows: + r={k:(v if k=='case' else float(v)) for k,v in row.items()} + a=r['area']; exact=r['exact_area']; mu=r['mu'] + defects={k:r[k] for k in ['normal_closure','linear_closure','cubic_defect','solenoidal_defect','traction_defect','face_mismatch','dual_relative_defect']} + geometry=[abs(a-exact)/exact,abs(r['mx']-r['exact_mx'])/exact,abs(r['my']-r['exact_my'])/exact,abs(r['radial_second']-r['exact_radial_second'])/exact] + geometry.extend(abs(r[k]-r['exact_'+k])/exact for k in ['mxx','mxy','myy']) + control=[abs((r['wrong_force_x']-r['force_x'])-mu*a)/(mu*a),abs((r['wrong_force_y']-r['force_y'])+3*mu*a)/(mu*a)] + item={'case':r['case'],'n':int(r['n']),'mu':mu,'local_geometry_pass':all(math.isfinite(v) and v<=1e-10 for v in defects.values()),'defects':defects,'min_positive_volume':r['min_positive_volume'],'negative_pressure_control_pass':max(control)<=1e-10,'area_error':geometry[0],'radial_error':abs(r['radial_second']/r['exact_radial_second']-1),'first_second_moment_scaled_errors':geometry[1:],'flux_error':abs(r['flux']/r['exact_flux']-1),'force_errors':[abs(r['force_x']/r['exact_force']-1),abs(r['force_y']/r['exact_force']-1)],'global_geometry_pass':max(geometry[1:3]+[geometry[5]])<=1e-10 if r['case']=='disk' else max(geometry)<=1e-10} + results.append(item) +convergence=[] +for mu in [.1,.001002]: + group=sorted([r for r in results if r['case']=='disk' and r['mu']==mu],key=lambda r:r['n']) + require(len(group)==3, 'q2: input contract at original line 19') + for metric in ['area_error','radial_error','flux_error']: + errors=[r[metric] for r in group] + p=[math.log(a/b,2) for a,b in zip(errors,errors[1:])] + convergence.append(dict(mu=mu,metric=metric,errors=errors,orders=p,pass_gate=errors[-1]<=1e-4 and all(1.8<=v<=2.2 for v in p))) + for d in range(2): + errors=[r['force_errors'][d] for r in group];p=[math.log(a/b,2) for a,b in zip(errors,errors[1:])] + convergence.append(dict(mu=mu,metric=f'force_{d}',errors=errors,orders=p,pass_gate=errors[-1]<=1e-4 and all(1.8<=v<=2.2 for v in p))) +positive=all(r['local_geometry_pass'] and r['negative_pressure_control_pass'] and r['global_geometry_pass'] for r in results) and all(r['pass_gate'] for r in convergence) +print(json.dumps(dict(native_geometry_candidate=positive,independent_cellwise_geometry_gate='REQUIRED',results=results,convergence=convergence,coupled_stokes_mms_or_production_water_admitted=False),indent=2,allow_nan=False)) diff --git a/docs/plans/fluid-accuracy-composition/q2/c1b1-interface-note.md b/docs/plans/fluid-accuracy-composition/q2/c1b1-interface-note.md new file mode 100644 index 00000000..fa620be7 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/c1b1-interface-note.md @@ -0,0 +1,19 @@ +# C1-B1 interface coordination + +Parent relay: PR128, tested sourcef161d1a and documentation43a084a, stacked on +PR125. Read-only inspection of PR128 file list and actual projection.rs atf161d1a +confirms no shared write/API conflict with Q1/PR126 or this Q2/PR127 slice. + +C1-B1 adds composition/projection.rs, projection_tests.rs, its module declaration +and c1b1reports. Consumed PressureOperator/ProviderWorkspace/GridGeometry and +declared SessionIdentity APIs are unchanged. Q1's only existing numerical write is +src/liquid_volume.rs; Q2 adds private reference examples/tests/docs only. Neither +changes C1-B1's pressure/velocity/representation contracts or pressure formulas. +Native Y-face x-fastest indexing in Q2 matches GridGeometry and the C1 metadata. + +C1-B1 sealed stationary pressure projection does not gain periodic Q1 transport, +free-surface/obstacle/moving-wall support or future coupled Stokes applicability. +Its supplied immutable array witness is not candidate runtime execution, Session +adoption or custody. No combined-branch build, C1-B/R trajectory or workflow claim +is made by this interface inspection. Lead owns dependency/CI/integration and +canonical ledger reconciliation; no C1/G1 files were edited or branches merged. diff --git a/docs/plans/fluid-accuracy-composition/q2/issues.md b/docs/plans/fluid-accuracy-composition/q2/issues.md new file mode 100644 index 00000000..37d0395f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/issues.md @@ -0,0 +1,22 @@ +# Q2 bounded reference open gates + +1. **Exact topology/ownership — open before B/M/S/W.** Five positive native face +apertures correspond to exactly zero-measure intersections of actual exported +source polygons. Largest9.7077e-19m; fixed finite-error gates pass but that does +not authorize connectivity/active-DOF decisions. Preserve raw artifacts and exact +rational audit; select/review a robust predicate and common classification before +public geometry/operator promotion. No numerical cutoff/mass floor is selected. +2. **Unsupported primitive envelope.** Convex fluid polygon only, fixed source +cases, one-metre extrusion; finite primal source-edge/grid-plane coincidence and +other unresolved cuts refuse. No arbitrary tiny continuous topology guarantee, +solid exterior, disconnected cut region,3D imported mesh or moving wall support. +3. **Full coupled Q2.** Common active DOFs/velocity extension, positive M,B,S,W, +boundary lift, exact component/gauge handling, small-cell policy, scalable backend, +independent dense assembly and full native residual/work are pending. Then fixed +coupled disk/annulus MMS, rescaled water and oblique hydrostatic/physical-traction +gates are still required. Existing split preview remains unchanged. +4. **Transport.** Q1 source64 exhaustion,3Full refusals and measured donor +smearing remain unadmitted evidence. No geometric transport selection has run. +5. **Scientific/UI claims.** No independent experimental water observations, +GPU/native UI claim or new Lean/Rust geometric correspondence proof. Existing +exact-real Stokes work theorem is not credited as this unassembled solver. diff --git a/docs/plans/fluid-accuracy-composition/q2/manifest.json b/docs/plans/fluid-accuracy-composition/q2/manifest.json new file mode 100644 index 00000000..bf43375b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/manifest.json @@ -0,0 +1,39 @@ +{ + "scientific_v1": "652383e0b9f59c39bfd6a6367f324fa2c0d4fcf0", + "scientific_v2": "8b9c3b294c63527db33c8f5faccfb24f19b4217f", + "v1_native_exit": 1, + "v2_native_exit": 0, + "v2_case_count": 24, + "focused_debug_release_passed": 4, + "strict_clippy_exit": 0, + "archive": { + "path": "/workspace/rheon-q2-grid-geometry-8b9c3b2.zip", + "bytes": 19457063, + "sha256": "e386b3991b444d86600a68a403965a579b3a84db4f0e7d5b88af41771d45351f" + }, + "library": { + "library_file_id": "libfile_c610792d49f08191b36364e767442556", + "file_id": "file_000000009a5882308de3e76f89210c83", + "version": 0 + }, + "binary_v1": { + "sha256": "c6306956e2d43b4fdc8a7981c0143dfde307940db4bc414731f8ab541144eb3a", + "bytes": 695288 + }, + "binary_v2": { + "sha256": "899f2fdf3ba38503c08710a245aca8fd5810b0d6b3899fb6771423e6fc4d39d3", + "bytes": 699656 + }, + "independent": { + "review.md": "9e9a746577a758a5466ba427c719666c332c7447abc90eeaf16623232e5c35dc", + "reconstruct.py": "497c3dd3634dc495ac7714f59ff742115ddda1a5cf609c58ca53c3e0f71dbfa3", + "summary.json": "56ce5f2c77f0879b867288e362d7388b971dafad6875c3d456b679df917bddc6", + "tangent_audit.py": "d812b9600b54f76edf82b916dfc8800ef89783de6db7207ffcd4f18d440a6cab", + "tangent-audit.json": "a540735452913a6a9e91b9e81a3e92319dc683fb3251315ef0b0b0c1506b92ee" + }, + "finite_error_geometry_supported": true, + "native_exact_topology_artifacts": 5, + "exact_topology_or_active_dof_admitted": false, + "B_M_S_W_or_coupled_stokes_or_production_water_admitted": false, + "no_numerical_campaign_retry": true +} diff --git a/docs/plans/fluid-accuracy-composition/q2/pre-run-review.md b/docs/plans/fluid-accuracy-composition/q2/pre-run-review.md new file mode 100644 index 00000000..0334baca --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/pre-run-review.md @@ -0,0 +1,29 @@ +# Independent Q2 pre-run review + +Existing independent reviewer `/root/p1_numerical_review`, 2026-10-20 UTC; +read-only source/mathematics/protocol/evaluator review before selected execution. + +Verified source halfplanes, +/- shared-face indexing, oriented physical traction, +quadratic velocity/stress divergence, pressure-control defect, polynomial Gauss +flux, clipped dual partitions and no production coupling claim. Requested fixes +verified before freeze: dimensional/nonzero moment normalization; exact-coincidence +refusal/source-edge IDs; global vertex uniqueness/doubled-loop negative contract; +translated moment accumulation and unresolved cut refusal; native X/Y MAC ordering; +all global second moments and explicit radial convergence. Clippy strict passed. + +Final disposition: no remaining blocker to freeze and run ONE bounded geometry +prerequisite campaign. Independent post-run per-cell polygon/face/dual/boundary +and ledger reconstruction remains necessary. No coupled Stokes/MMS, exterior +obstacle, certified arbitrary tiny topology or production-water admission. +Reviewer ran no tests or candidate numerical experiments and edited no source. + +## Independent version2 prefreeze review + +After v1's retained refusal, reviewer independently reconstructed the exact-zero +axis tangent. Verified v2's exact area0 AND exact equal-coordinate predicate, +retained tiny-positive dyadic triangle, continued oblique zero/negative/nonfinite +refusal, preconstruction input export/flush and diagnostic context. Disk zero +first/cross moment checks and scales verified before v2 data. Final disposition: +no blocker to freeze one separate v2 campaign into a fresh output; v1 stays failed. +No tolerance/floor, general robust-predicate or full solver claim. Post-run +independent per-cell/face/dual/flux/stress reconstruction remains necessary. diff --git a/docs/plans/fluid-accuracy-composition/q2/protocol-v1.md b/docs/plans/fluid-accuracy-composition/q2/protocol-v1.md new file mode 100644 index 00000000..54b401f3 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/protocol-v1.md @@ -0,0 +1,107 @@ +Q2 first bounded reference/geometry implementation proposal (no selected test runs yet) + +Trigger: Q1 b9a9d4c native CPU campaign stopped on fixed sphere depth exhaustion; +all 12 completed 16/32 transport trajectories diffuse strongly, 3 Full controls +refuse. Do not promote transport; use only dependency-ready geometry prerequisite. + +Exclusive proposed files: examples/grid_geometry_reference.rs, +examples/grid_geometry_reference/*, tests/grid_geometry_reference_contract.rs, +docs/plans/fluid-accuracy-composition/q2/*. No existing production edits, G1, +root canonical lifecycle, proof, dependencies or lib exports. GridGeometry reused. + +Private CPU reference version1, not an alternative production family or solver: +convex CCW polygon clipped to existing GridGeometry's Cartesian cells (one metre +extrusion; planar XY velocities only). One source shape supplies cell volume / +first and second moments, unique X/Y open-face segments and first moments, +clipped staggered-face dual volumes, normal-strain cell volumes, shear-strain +vertex dual volumes and physical-boundary oriented segments / first moments. +Keep every computed positive cut, no flooring/merging/sliver deletion. +Native clipping is not a certified topology oracle for arbitrary underresolved +continuum cuts; only the fixed source cases and retained independent errors are +qualified. Moment accumulation uses a translated local origin; nonempty cuts with +three or more represented vertices and zero area, negative fan orientation or +nonfinite moments are refused as unresolved, never converted into empty fluid. Record zero +open faces whose dual volume is positive without choosing active velocity DOFs; +that extension/assembly decision belongs to later B/M/S operator admission. + +Method: rectangle half-plane polygon clipping, exact-real polynomial polygon +moments from Green's formula in native f64; clipped line intervals independently +computed from the original source convex halfplanes for each unique grid face. +Shared grid-face flux records consumed with opposite cell signs. Physical segments +come from parameter-clipped original source edges with retained IDs and are separate, including nonzero prescribed +traction. No pressure gauge or pressure=0 free boundary is introduced. + +Cases: supplemental disk R=.75, origin0, domain[-1,1]^2, n32/64/128, inscribed +regular polygon with8n segments. Exact disk geometry is a separate reference; +polygon approximation is method geometry error, not quadrature uncertainty. +Rotated .3m square at0/17/31 degrees, center(.537,.479), domain[0,1]^2, +n16/32/64, 1m extrusion. A fluid convex polygon is a geometry primitive only; +it does not represent the plan's fluid exterior of an obstacle or full hydro run. + +Predeclared prerequisite gates (not replacements for canonical Q2 criteria): +finite nonnegative volumes/quadrature weights; all per-cell closed-boundary vector +and first-moment identities normalized by h and h^2 respectively <=1e-10; +global analytic rotated-source area/first/second moment relative error <=1e-10; +unique-face intervals agree with independently clipped cell-face edges <=1e-10h; +global sum dual volumes for each velocity/stress association equals source volume +within1e-10 relative (grid domain contains source). + +CPU flux checks use u=(x^3,y^3): integrate unique grid-face flux and physical +segments with 2-point Gauss; per-cell flux vs3*(moment_xx+moment_yy) <=1e-10 +normalized by h^2 times fixed source scale. Also quadratic divergence-free +u=(x^2+2xy,-2xy-y^2) checks geometry/flux closure, not incompressible solve. +Stress check uses same divergence-free u, mu=.1 or .001002 and nonzero absolute +p=1+mu*x-3mu*y. sigma=-pI+2muD(u), div sigma=(mu,mu). Native integrated traction +from shared boundary moments equals mu*V per component, normalized by fixed +nonzero stress scale times h^2, <=1e-10. Retain scalar pressure and full traction; +negative control setting p=0 must produce the analytically predicted defect. +Disk geometry area / radial second-moment / cubic-flux / linear-stress force error +<=1e-4 finest and pairwise orders1.8..2.2; this tests analytic curved-shape +approximation convergence, not MMS velocity/pressure/stress accuracy. + +Require independent read-only discretization review before source freeze, then +focused debug/release tests, Clippy and ONE actual release CPU campaign. Independent +vertical-slice/positive integration per-cell oracle against polygon coordinates +and source analytic disk/rotated source moments; tolerance1e-10 normalized h^2; +all native raw table counts, signs and flux/stress ledgers reconstructed. +No full-suite rerun after reference-only addition unless new production changes. +Full coupled disk/annulus MMS, water hydrostatic obstacle, physical traction, +B/M/S/W dense oracle/component/gauge/solver selection remain pending. No Lean +claim; existing plan StokesWork exact-real proof remains relevant only after actual +coupled assembly exists. Parent owns canonical Q2 lifecycle reconciliation. + +Prefreeze clarifications from independent mathematical review: +- All polynomial formulas use numerical coordinates x/Lref,y/Lref, Lref=1m, + Uref=1m/s, extrusion Href=1m. Functions return SI velocity; cubic coefficients + are Uref/Lref^3 and quadratic coefficients Uref/Lref^2. Pressure is + p0 + mu*Uref/Lref*(x/Lref-3y/Lref), p0=1Pa. tau_ref=1Pa is a fixed nonzero + normalization reference; global nonzero force scale mu*Uref/Lref^2*Vsource. +- Areas times Href are represented volumes. Oriented segment measures times Href + are physical areas; stress integrals are forces. Normal closure scales h*Href, + first/flux closure h^2*Href with Lref/Uref factors numerically1 in SI; + traction closure tau_ref*h^2. These geometry budgets are NOT volume-normalized + incompressibility or full physical-traction criteria. +- Global first and second moment errors use A_exact*Lref and A_exact*Lref^2, + respectively, including zero disk moments. No division by exact-zero moments. +- Retain full source vertices and original source-edge IDs for each physical + segment. Unique grid-face intervals are computed independently by source + halfplanes; physical pieces use source-edge parameter clipping, not reclassified + cut-cell polygon edges. All staggered dual boxes are width h centred at their + association with one-metre extrusion; they may overhang the containing grid. +- Finite source edges exactly coincident with a primal grid plane are explicitly + unsupported by reference v1 and refused before geometry publication. A focused + negative contract covers this ownership ambiguity; there is no double counting. + Point tangencies have zero measure. Main shifted square/disk cases have no + finite coincident source edge. A later coincident-boundary support policy needs + separate admission; this reference does not establish it. +- p=0 control must reproduce wrong-minus-correct total force + (mu,-3mu)*Vsource (SI coefficients above), not merely produce a different value. + Disk flux/stress convergence largely measures the same polygon-moment geometry + approximation, explicitly not independent PDE-error evidence. + +Final prefreeze source clarifications: source vertices must be globally unique, +not just adjacent-distinct; doubled winding is refused by a negative contract. +X/Y face arrays both use native GridGeometry indexing (x fastest); shear vertices +are x fastest with counts(n+1,n+1,1). Export all global mxx/mxy/myy and compare each +against the analytic source at the fixed nonzero moment scale, independently of +radial moment convergence. Radial convergence is also evaluated explicitly. diff --git a/docs/plans/fluid-accuracy-composition/q2/protocol.md b/docs/plans/fluid-accuracy-composition/q2/protocol.md new file mode 100644 index 00000000..04fbbc87 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/protocol.md @@ -0,0 +1,137 @@ +Q2 first bounded reference/geometry implementation proposal (no selected test runs yet) + +Trigger: Q1 b9a9d4c native CPU campaign stopped on fixed sphere depth exhaustion; +all 12 completed 16/32 transport trajectories diffuse strongly, 3 Full controls +refuse. Do not promote transport; use only dependency-ready geometry prerequisite. + +Exclusive proposed files: examples/grid_geometry_reference.rs, +examples/grid_geometry_reference/*, tests/grid_geometry_reference_contract.rs, +docs/plans/fluid-accuracy-composition/q2/*. No existing production edits, G1, +root canonical lifecycle, proof, dependencies or lib exports. GridGeometry reused. + +Private CPU reference version1, not an alternative production family or solver: +convex CCW polygon clipped to existing GridGeometry's Cartesian cells (one metre +extrusion; planar XY velocities only). One source shape supplies cell volume / +first and second moments, unique X/Y open-face segments and first moments, +clipped staggered-face dual volumes, normal-strain cell volumes, shear-strain +vertex dual volumes and physical-boundary oriented segments / first moments. +Keep every computed positive cut, no flooring/merging/sliver deletion. +Native clipping is not a certified topology oracle for arbitrary underresolved +continuum cuts; only the fixed source cases and retained independent errors are +qualified. Moment accumulation uses a translated local origin; nonempty cuts with +three or more represented vertices and zero area, negative fan orientation or +nonfinite moments are refused as unresolved, never converted into empty fluid. Record zero +open faces whose dual volume is positive without choosing active velocity DOFs; +that extension/assembly decision belongs to later B/M/S operator admission. + +Method: rectangle half-plane polygon clipping, exact-real polynomial polygon +moments from Green's formula in native f64; clipped line intervals independently +computed from the original source convex halfplanes for each unique grid face. +Shared grid-face flux records consumed with opposite cell signs. Physical segments +come from parameter-clipped original source edges with retained IDs and are separate, including nonzero prescribed +traction. No pressure gauge or pressure=0 free boundary is introduced. + +Cases: supplemental disk R=.75, origin0, domain[-1,1]^2, n32/64/128, inscribed +regular polygon with8n segments. Exact disk geometry is a separate reference; +polygon approximation is method geometry error, not quadrature uncertainty. +Rotated .3m square at0/17/31 degrees, center(.537,.479), domain[0,1]^2, +n16/32/64, 1m extrusion. A fluid convex polygon is a geometry primitive only; +it does not represent the plan's fluid exterior of an obstacle or full hydro run. + +Predeclared prerequisite gates (not replacements for canonical Q2 criteria): +finite nonnegative volumes/quadrature weights; all per-cell closed-boundary vector +and first-moment identities normalized by h and h^2 respectively <=1e-10; +global analytic rotated-source area/first/second moment relative error <=1e-10; +unique-face intervals agree with independently clipped cell-face edges <=1e-10h; +global sum dual volumes for each velocity/stress association equals source volume +within1e-10 relative (grid domain contains source). + +CPU flux checks use u=(x^3,y^3): integrate unique grid-face flux and physical +segments with 2-point Gauss; per-cell flux vs3*(moment_xx+moment_yy) <=1e-10 +normalized by h^2 times fixed source scale. Also quadratic divergence-free +u=(x^2+2xy,-2xy-y^2) checks geometry/flux closure, not incompressible solve. +Stress check uses same divergence-free u, mu=.1 or .001002 and nonzero absolute +p=1+mu*x-3mu*y. sigma=-pI+2muD(u), div sigma=(mu,mu). Native integrated traction +from shared boundary moments equals mu*V per component, normalized by fixed +nonzero stress scale times h^2, <=1e-10. Retain scalar pressure and full traction; +negative control setting p=0 must produce the analytically predicted defect. +Disk geometry area / radial second-moment / cubic-flux / linear-stress force error +<=1e-4 finest and pairwise orders1.8..2.2; this tests analytic curved-shape +approximation convergence, not MMS velocity/pressure/stress accuracy. + +Require independent read-only discretization review before source freeze, then +focused debug/release tests, Clippy and ONE actual release CPU campaign. Independent +vertical-slice/positive integration per-cell oracle against polygon coordinates +and source analytic disk/rotated source moments; tolerance1e-10 normalized h^2; +all native raw table counts, signs and flux/stress ledgers reconstructed. +No full-suite rerun after reference-only addition unless new production changes. +Full coupled disk/annulus MMS, water hydrostatic obstacle, physical traction, +B/M/S/W dense oracle/component/gauge/solver selection remain pending. No Lean +claim; existing plan StokesWork exact-real proof remains relevant only after actual +coupled assembly exists. Parent owns canonical Q2 lifecycle reconciliation. + +Prefreeze clarifications from independent mathematical review: +- All polynomial formulas use numerical coordinates x/Lref,y/Lref, Lref=1m, + Uref=1m/s, extrusion Href=1m. Functions return SI velocity; cubic coefficients + are Uref/Lref^3 and quadratic coefficients Uref/Lref^2. Pressure is + p0 + mu*Uref/Lref*(x/Lref-3y/Lref), p0=1Pa. tau_ref=1Pa is a fixed nonzero + normalization reference; global nonzero force scale mu*Uref/Lref^2*Vsource. +- Areas times Href are represented volumes. Oriented segment measures times Href + are physical areas; stress integrals are forces. Normal closure scales h*Href, + first/flux closure h^2*Href with Lref/Uref factors numerically1 in SI; + traction closure tau_ref*h^2. These geometry budgets are NOT volume-normalized + incompressibility or full physical-traction criteria. +- Global first and second moment errors use A_exact*Lref and A_exact*Lref^2, + respectively, including zero disk moments. No division by exact-zero moments. +- Retain full source vertices and original source-edge IDs for each physical + segment. Unique grid-face intervals are computed independently by source + halfplanes; physical pieces use source-edge parameter clipping, not reclassified + cut-cell polygon edges. All staggered dual boxes are width h centred at their + association with one-metre extrusion; they may overhang the containing grid. +- Finite source edges exactly coincident with a primal grid plane are explicitly + unsupported by reference v1 and refused before geometry publication. A focused + negative contract covers this ownership ambiguity; there is no double counting. + Point tangencies have zero measure. Main shifted square/disk cases have no + finite coincident source edge. A later coincident-boundary support policy needs + separate admission; this reference does not establish it. +- p=0 control must reproduce wrong-minus-correct total force + (mu,-3mu)*Vsource (SI coefficients above), not merely produce a different value. + Disk flux/stress convergence largely measures the same polygon-moment geometry + approximation, explicitly not independent PDE-error evidence. + +Final prefreeze source clarifications: source vertices must be globally unique, +not just adjacent-distinct; doubled winding is refused by a negative contract. +X/Y face arrays both use native GridGeometry indexing (x fastest); shear vertices +are x fastest with counts(n+1,n+1,1). Export all global mxx/mxy/myy and compare each +against the analytic source at the fixed nonzero moment scale, independently of +radial moment convergence. Radial convergence is also evaluated explicitly. + +## Separately selected geometry reference version2 + +Version1 source652383e was frozen/reviewed and tested, then its single native +campaign exited1 before any case rows. Preserve source-v1/native-v1/execution and +independent diagnostic in the v1 evidence archive. No v1 rerun or positive result. +The independent exact-rational reconstruction identifies the first refusal at +primal cell111(i15,j3), disk32, x[-.0625,0],y[-.8125,-.75]: three distinct +represented clip points all have y=-.75, and the exact f64-source intersection is +a single tangent vertex. This is zero measure, not a positive sliver. Native +source vertices were unavailable in v1, so the diagnostic's trig reconstruction +assumption remains explicit. Version2 exports input vertices before construction. + +Method-selection correction: if computed area is exactly0 AND all represented +vertices have exactly equal x OR exactly equal y, return exact zero moments. +Coordinate equality proves that represented polygon has zero2D measure. No epsilon, +volume floor, clamp, positive-cut deletion or physical threshold relaxation. Other +>=3vertex zero-area cuts, negative fan orientation and nonfinite moments still +refuse. Positive represented slivers remain retained. General oblique exact-zero +classification and certified arbitrary continuous topology remain unsupported. +Version2 adds exact tangent/tiny-positive contracts and construction-stage context. +All convergence/flux/stress/independent budgets and cases are unchanged. Freeze +new source and independent pre-run review, then ONE separate v2 native campaign +into a fresh output root, preserving v1. Any new failure is retained and returns +to method selection, never silently retried under v1 or v2. + +Disk zero first/cross global moments use A_exact*Lref or A_exact*Lref² and must +remain within1e-10; positive diagonal moments are retained componentwise against +analytic disk moments for independent review, with radial geometry convergence +controlling their aggregate. Rotated-square all individual moments remain1e-10. diff --git a/docs/plans/fluid-accuracy-composition/q2/qualification.md b/docs/plans/fluid-accuracy-composition/q2/qualification.md new file mode 100644 index 00000000..257cb945 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/qualification.md @@ -0,0 +1,47 @@ +# Q2 bounded geometry qualification + +Version1/652383e is a retained failed campaign, not silently corrected evidence. +Version2/8b9c3b2 was independently reviewed/frozen before ONE separate native run. + +A1: four focused contracts pass debug/release; final selected strict Clippy passes. +Contracts cover polynomial moments/flux, orientation/repeated source winding, +finite coincident boundaries/domain refusal, exact zero-axis tangent versus tiny +positive dyadic area, and nonzero pressure versus wrong-pressure traction. +No existing production source changed in Q2; Q1's full release regression613pass, +0fail,3existing asset ignores is retained and not represented as a full Q2 rerun. + +A2:24native CPU cases complete, fixed finite geometry gates pass. Raw source +vertices are flushed before construction; cell/dual/shear moments, unique MAC +faces, physical source-edge pieces, per-cell flux/stress and negative pressure +ledgers are retained. Fine disk geometry/flux/force errors1.26e-5 or below, +orders~2; worst normalized local native defect1.43e-12 against1e-10. This is +polygon geometry integration, not a solution of PDE unknowns. + +A3: independent positive vertical-slice integration checks all152780 unique +moment records across12source geometries (both viscosities share geometry); +maximum normalized moment discrepancy7.883e-15. All24case ledgers,75264cell rows +and5930physical pieces are reconstructed with distinct polynomial integral +formulas. Pressure and the predeclared wrong-pressure control are checked. +Independent endpoint/line and exact-rational tangent audits distinguish native +artifacts from the independent floating oracle's own presence ambiguities. +Final review.md and raw summary/tangent audit own the precise counts and limits. + +**Supported:** bounded finite-error common geometry/moment/flux/stress integration +reference under its stated cases and tolerances. No public production geometry or +exact topology admission. Five positive native apertures occur on exactly +zero-measure source faces, notwithstanding tiny error within the finite budget. +This is an explicit blocker before exact connectivity/active-DOF/B/M/S/W assembly. +Return the predicate/ownership decision to bounded method selection; no clamp, +floor, further native rerun or larger solver implementation is introduced here. + +**Pending:** true solid-exterior/cut topology, velocity extension, small-cell policy, +common discrete operator and boundary lift, component/gauge correspondence, +scalable backend and independent dense solve, actual native coupled work, disk/ +annulus MMS, rescaled water hydrostatics and independently reconstructed physical +traction, and conservative transport selection. Original plan thresholds unchanged. +No physical experiment, GPU/native UI or new Lean correspondence claim. Existing +exact-real StokesWork proof is relevant only once actual operators satisfy its +assumptions; it is not credited as this unassembled code's scientific evidence. + +Parent/repository lead reconciles shared canonical status with G1 and controls +integration/merges. Q1 and all three P1 evidence archives/worktrees remain intact. diff --git a/docs/plans/fluid-accuracy-composition/q2/results.md b/docs/plans/fluid-accuracy-composition/q2/results.md new file mode 100644 index 00000000..1d794d74 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/results.md @@ -0,0 +1,64 @@ +# Q2 common geometry reference results + +Version1 source652383e0b9f59c39bfd6a6367f324fa2c0d4fcf0: retained native exit1, +zero case rows, independent exact-rational tangent diagnosis. See version1-result.md. +Version2 source8b9c3b294c63527db33c8f5faccfb24f19b4217f: separately reviewed and +frozen before selected execution; native exit0,24case rows, native fixed gates pass. +No native retries or threshold changes within either frozen method version. + +Four focused contracts pass debug/release. Selected strict Clippy passes. Native +Linux CPU f64 reference uses exact-roundtrip exported source polygons, existing +GridGeometry MAC indexing, shared face intervals and one-metre extrusion. Circle +R.75 source is an8n-sided inscribed polygon on n32/64/128 grids; rotated fluid +squares at0/17/31degrees use n16/32/64. Both viscosity scales .1 and .001002Pa s +are geometry/stress integration checks, not water MMS or a coupled solve. + +| Native normalized maximum | Measured | Fixed ceiling | +|---|---:|---:| +| Closed normal measure | 1.422e-14 | 1e-10 | +| First-moment closure | 6.721e-13 | 1e-10 | +| Cubic flux/divergence moment defect | 2.379e-13 | 1e-10 | +| Quadratic solenoidal flux defect | 1.009e-12 | 1e-10 | +| Linear full-stress traction defect | 1.429e-12 | 1e-10 | +| Independent shared-face/cell-edge mismatch | 1.766e-14 | 1e-10 | +| Velocity/shear dual partition defect | 1.885e-15 | 1e-10 | + +Smallest retained positive volume1.27963e-7m³; no volume floor or global mass +renormalization. Other unresolved topologies and finite source-edge/grid-plane +coincidence remain refused. No certified arbitrary underresolved geometry claim. + +| Disk relative geometry error | n32 | n64 | n128 | +|---|---:|---:|---:| +| Volume / linear-stress integrated force | 1.00396e-4 | 2.50995e-5 | 6.27491e-6 | +| Radial second moment / cubic flux | 2.00779e-4 | 5.01983e-5 | 1.25498e-5 | + +All pairwise geometry orders lie near2 (1.99990–1.99999). Finest errors meet the +fixed1e-4 prerequisite budget. Pressure p=1+mu*x−3mu*yPa is retained; p=0 negative +control gives the predeclared wrong-minus-correct force(mu,−3mu)*Vsource, showing +that dropping pressure is detectable in this integration fixture. + +These flux/stress convergence curves largely measure polygon moment geometry +error, not independent PDE discretization error. No velocity/pressure unknowns +were solved; no B/M/S/W assembly, pressure-component gauge, small-cell solver, +free-surface MMS/annulus, exterior-obstacle hydrostatics or physical boundary +traction convergence is admitted. Independent post-run correspondence and final +qualification are recorded separately. Only a bounded geometry prerequisite can +advance; canonical full Q2 criteria remain unchanged and pending. + +## Exact topology finding — carry before operator assembly + +Independent exact-rational half-plane intersection using the ACTUAL exported +f64 polygon identifies five native positive apertures on exact-source zero-measure +faces: disk32/Y143=9.70770e-19m; disk64/X2088=1.87503e-20m; disk128/X8272= +1.78856e-20m,Y2111=2.68284e-20m,Y14400=8.94279e-21m. The maximum aperture/h is +1.55324e-17, below the unchanged1e-10 interval-error budget. The finite numerical +geometry gates pass, but exact connectivity/active-DOF semantics are UNADMITTED. +These are native artifacts, distinct from independently audited float-oracle +presence mismatches. Full source-derived rational bounds and input hashes are +retained, not suppressed by a tolerance or clamped native field. + +Stop widening here. Before B/M/S/W assembly, return source-topology predicate and +ownership decisions to method selection and independently verify exact-zero face +classification alongside cut volumes and velocity extension. A tiny positive +native aperture must not become an exact connectivity/DOF decision. No version3, +native rerun or production geometry promotion is made by this slice. diff --git a/docs/plans/fluid-accuracy-composition/q2/review.md b/docs/plans/fluid-accuracy-composition/q2/review.md new file mode 100644 index 00000000..c6fcb129 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/review.md @@ -0,0 +1,129 @@ +# Independent Q2 geometry v2 disposition + +Frozen numerical source: `8b9c3b294c63527db33c8f5faccfb24f19b4217f`. +The one native v2 campaign completed with24 case rows. Version1's exit1 and +header-only campaign remain separate and unadmitted. No candidate/source/campaign +file or criterion was edited or rerun by this reviewer; writes are confined to +this independent evidence subtree. + +**The frozen finite-error geometry, moment, interval, polynomial flux and stress +integration criteria pass independent reconstruction. Exact connectivity and +active-DOF admission remain blocked by five native positive apertures on exact +zero-measure tangent faces.** This is a bounded private geometry prerequisite, +not completion of coupled Stokes, MMS, exterior-obstacle or production water. + +## Independent coverage and method + +Twelve distinct source geometries are checked against actual exported source +vertices, with no trigonometric reconstruction assumption. Two viscosities make +24 case rows. Source/moment/face files are byte-identical across the viscosity +pair; geometry is independently integrated once per source case and both copies +are verified. Counts below are unique geometry records unless stated otherwise: + +| Association / diagnostic | Records checked | +|---|---:| +| Primal cells | 37,632 | +| X-face velocity duals | 38,192 | +| Y-face velocity duals | 38,192 | +| Vertex shear duals | 38,764 | +| All moment records, six components each | 152,780 | +| Unique native Cartesian face queries, including zero intervals | 76,384 | +| Native positive face records | 22,321 | +| Physical source-edge pieces | 2,965 unique / 5,930 across viscosities | +| Native cell-ledger rows across viscosities | 75,264 | + +`reconstruct.py` integrates the convex source with a separate positive vertical +slice construction. Lower/upper source chains are piecewise affine; clipping +their ordinate interval against each primal/dual box produces positive lengths. +Two-point positive quadrature exactly integrates the resulting degree≤3 moment +polynomials in real arithmetic. This does not use native rectangle polygon +clipping or Green/shoelace moment formulas. Native X/Y MAC indices, overhanging +dual boxes and shear associations are explicitly reconstructed. + +All six per-region moments (volume, mx,my,mxx,mxy,myy) are compared at the frozen +h², h²L_ref and h²L_ref² scales, numerically h² for L_ref=Href=1m. Maximum error +is 7.883e-15, below1e-10. Separate association maxima are 7.883e-15 primal, +7.106e-15 X/Y dual and 6.440e-15 shear. The oracle is an independent binary64 +calculation of polynomial integrals, not a formal roundoff enclosure. + +Direct source-edge/line intersections independently check all Cartesian face +intervals at scale h; maximum discrepancy is 7.106e-15. Every physical piece's +original edge ID, native cell assignment, endpoints, outward normal and first +boundary moments are reconstructed. Segment fluxes use analytic cubic/quadratic +polynomial means, independently of the native Gauss implementation. Full linear +stress is reconstructed as tau*n-p*n, alongside pressure and the p=0 control. +Every cell's signed shared-face/physical-boundary assembly and ledger are checked. + +Largest differences between native diagnostics and reconstruction are 3.553e-14 +for solenoidal flux/h² and 2.865e-14 for full traction/h². Direct reconstructed +closure maxima remain within all1e-10 gates: normal1.422e-14, first moment +6.721e-13, cubic2.396e-13, solenoidal1.009e-12 and traction1.432e-12. Different +polynomial evaluation orders explain rounding differences from native maxima. +The reconstructed negative-pressure control agrees with (mu,-3mu)*V_source to +1.265e-12 relative to the fixed nonzero force scale. The constant1Pa pressure +and smaller mu=.001002 stress scale make cancellation visible; no pressure term +is silently removed or reset. + +All native summary geometry/zero-moment/rotated-square gates and disk convergence +criteria are independently reapplied using the analytic source formulas. Finest +disk area error is6.274914e-6; radial/cubic-flux error is1.254978e-5. Pairwise +orders range1.999902–1.999992. These are polygon geometry integration errors, +not solved-velocity/pressure or physical-traction PDE errors. The smallest +retained positive native cell volume is1.27963e-7m³. Native records also expose +727 positive velocity duals with absent open faces; no active-DOF policy follows +from a positive dual volume. + +## Exact tangent audit: finite-error pass does not certify topology + +Ordinary floating edge intersections initially suggested four extra intervals +where the native face was absent: two at disk32 and two at disk64. Exact rational +intersections of the exported source prove each is a zero-length tangent and +confirm the native absence. These four were independent-oracle arithmetic +artifacts, not native topology errors. They remain recorded under face_ambiguities. + +A separate audit then queries every native positive aperture smaller than the +frozen1e-10*h interval budget. This threshold only selects diagnostic queries; +no aperture is changed. Exact Fraction half-plane intersections of the actual +exported f64 operands find five genuinely native positive-aperture artifacts: + +| Grid | Axis / native face index | Native positive length(m) | Exact source length | +|---|---|---:|---:| +| 32 | Y / 143 | 9.7076998531e-19 | 0 | +| 64 | X / 2088 | 1.8750264125e-20 | 0 | +| 128 | X / 8272 | 1.7885576809e-20 | 0 | +| 128 | Y / 2111 | 2.6828365213e-20 | 0 | +| 128 | Y / 14400 | 8.9427884043e-21 | 0 | + +All retain the declared positive-axis normal orientation. Each exact rational +lower bound equals its upper bound. Maximum length error/h is1.554e-17, so these +artifacts are consistent with the passing finite interval-error budget. There +are five unique geometry artifacts and ten repeated raw records across the two +viscosities; they must not be hidden by a floating agreement statement. + +Their native dual volumes are positive: about1.89649e-3m³ at32,4.81208e-4m³ at64, +and1.21186e-4m³ at128. In each case the face touches an empty primal cell and a +nonempty one; all exact bounds, endpoints, signs, dual volumes and adjacent +cell volumes are retained in tangent-audit.json. A future B/pressure graph or +velocity-extension choice could therefore misinterpret the tiny aperture as +connectivity even while every finite flux integral is accurate. + +## Admission boundary and handoff + +Accept only the stated finite-error geometry/integration evidence. Carry the +five native tangent artifacts as an explicit blocker before exact topology, +active-DOF selection, B/M/S/W assembly or a public production geometry owner. +The next mathematical selection needs a consistent robust source-face predicate +and ownership rule that preserves actual positive cuts; a numerical aperture +floor or epsilon clamp would not discharge this issue. No v3 or native rerun is +part of this review. + +Even after that predicate/ownership question, coupled algebra, gauge/component +handling, small-cell policy, solver selection, disk/annulus MMS, true solid +exterior geometry, hydrostatics and geometric interface transport remain pending. +Keep all P1/Q1/v1 findings intact. No physical, GPU or UI claim follows. + +Replay `python3 tangent_audit.py RAW_DIR OUTPUT_DIR`, then +`python3 reconstruct.py RAW_DIR OUTPUT_DIR`. The scripts import no candidate +or native evaluator. summary.json retains every raw CSV hash, case/association +counts, numerical maxima, convergence and tangent audit. Oracle moment arrays +for each source are retained as oracle-CASE-nN.npz. diff --git a/docs/plans/fluid-accuracy-composition/q2/route-handoff.md b/docs/plans/fluid-accuracy-composition/q2/route-handoff.md new file mode 100644 index 00000000..7a9ee5a0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/route-handoff.md @@ -0,0 +1,39 @@ +# Parent-owned canonical lifecycle reconciliation + +Concrete shared write handoff; this instance edits only its declared q2/ owner. +Parent/repository lead coordinates these fields with G1 before root-plan changes. +Frozen plan120/audit119 and earlier P1 evidence remain immutable. + +- P1 selection: stopped by adopted user decision, no production winner or new + timestep envelope; PR121/123/124 and failed screens remain evidence. +- Q1 bounded work: PR126, scientificb9a9d4c, periodic boundary/transaction API and + aligned-channel resolved envelope verified. Full release613pass0fail3existing + checkpoint-asset ignores. Native12/18 transport,7/9 sourcefields,12/18 controls; + depth64 exhaustion and3 Full refusals retained. Interface accuracy unadmitted. +- Q2 bounded geometry prerequisite: PR127. V1/652383e retained failure; separately + reviewed v2/8b9c3b2 implements common source moments/unique faces/staggered duals/ + boundary provenance and actual CPU polynomial flux/stress integration. Final + evidence/independent qualification lives here; it cannot close full Q2/Q-S. +- Full Q2 remains Active/blocked at explicit operator/backend admission: active + velocity extension/DOFs, common B/M/S/W and boundary lift, independent dense + assembly oracle, full approximate momentum/continuity/work, correct free-traction + absolute pressure versus sealed-component gauges, small-cell policy and solve + backend. Existing split/aligned previews retain names/envelopes. No mass-only swap. +- Then unchanged32/64/128 disk/annulus coupled MMS and rescaled-water criteria, + 16/32/64 rotated obstacle hydrostatics, physical reconstructed traction and + transport method-selection gates are required. Geometry curves alone do not + satisfy them. Geometric advection needs its own bounded method selection; + do not silently replace the donor comparator or reinterpret mass as shape. +- P2 variable-volume initialization remains selected-quadrature-dependent; no + third material family or equal-volume seeding workaround introduced. +- G1/native workflow and later C1 retain their separate owner and write set. + No Session/recording/UI/provider edits, root-plan overwrite, merge, rebase or + branch cleanup performed by this numerical instance. + +New material blocker before operator assembly: independent rational audit finds +five native positive apertures on exact-source zero-measure disk faces. Magnitudes +pass finite numerical1e-10h interval criteria, but exact connectivity/DOF support +is unadmitted. See results.md / final independent review and tangent-audit.json. +Return robust source-topology/ownership decisions to bounded method selection +before activating B/M/S/W, rather than flooring masses or treating all positive +native apertures as connections. This instance stops widening at that gate. diff --git a/docs/plans/fluid-accuracy-composition/q2/version1-result.md b/docs/plans/fluid-accuracy-composition/q2/version1-result.md new file mode 100644 index 00000000..1ae90bb4 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/q2/version1-result.md @@ -0,0 +1,22 @@ +# Preserved geometry reference version1 failure + +Frozen source652383e0b9f59c39bfd6a6367f324fa2c0d4fcf0. Three focused contracts +pass debug/release; selected strict Clippy and native release build pass. The +ONE native campaign exits1 before anycase rows: unresolved zero-area cut with +three or more represented vertices. The frozen evaluator also exits1 on empty +matrix. This is not a successful convergence/flux/stress campaign. + +Independent evidence-only reconstruction locates primal cell111(i15,j3) in the +first disk32 geometry: x[-.0625,0], y[-.8125,-.75]. The represented clipped points +are (-1.3877787807814457e-16,-.75),(-1.3777276490407724e-16,-.75),(0,-.75). +Exact rational fan determinants are0; separate rational clipping of the +reconstructed f64 source gives one tangent vertex with zero area. Native source +vertices were not exported before refusal, so matching source trig/system-libm +reconstruction is an explicit diagnostic assumption, not a native input receipt. + +Version1 source/binary/logs/empty summary/protocol and independent diagnostic are +retained under the v1 evidence root. No v1 rerun. Method selection returns to an +explicit version2: exactly axis-collinear represented zero polygons can have zero +moments without deleting any positive represented volume. No epsilon or threshold +relaxation. Other unresolved cuts still refuse. Separate prefreeze review and +fresh output/native run required; this document asserts no version2 result. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1-readiness.md b/docs/plans/fluid-accuracy-composition/reports/c1-readiness.md new file mode 100644 index 00000000..e9f2a8e2 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1-readiness.md @@ -0,0 +1,40 @@ +# C1 bounded composition readiness + +Status: **C1-A locally qualified / integration pending** at `ac6ed17`; [qualification](c1a-qualification.md), [frozen protocol](c1a-protocol.md) and [independent reviews](c1a-review.md). PR125 is stacked on unmerged PR122; hosted CI/integration and merges remain with the repository lead. This readiness document retains the bounded sequence. C1-B/C and transfers remain planned, and C1-R is not accepted. Repository lead coordinates shared declarations, plan status and integration with the separate numerical instance. + +## Selected boundary and sequence + +Reuse PR115/D1 immutable configured intent, runtime pins, Session publication, supervised process owner, recording custody and exact comparison selection. Preserve pressure v1 and RCP2/RCP3/RCP4/RCT1/RCT2 meanings. A facade delegates to existing numerical state owners; it neither schedules a second simulation nor stores a second accepted history. + +| Slice | Concrete direction | Admission boundary | +| --- | --- | --- | +| C1-A — locally qualified | Closed typed stage/native-family boundary; adapt pressure v1 and delegate native baseline calls to existing owners. Distinct MAC/particle requests and snapshots retain their own fields and precision. | No new method, provider support outside pressure v1, persisted profile, interpreter or implicit conversion. Subgraph/whole-candidate variants stay explicitly unavailable until their gates execute. | +| C1-B | Existing sealed-MAC pressure/projection subgraph: tentative cell pressure/staggered velocity, actual RHS/dt, geometry/operator/gauge and projection witnesses. | Host recomputes actual equations/constraints. Shape compatibility is insufficient. This is existing projection, not newly qualified traction-coupled Stokes. Freeze residual/roundoff criteria before evaluation. | +| C1-C | Whole existing sealed-MAC interval candidate, tentative native carrier/tracer/pressure/fraction state and history. Classical fixtures precede learned assets. | Session remains sole publisher. Full native-state, actual interval, mass/source, momentum/operator and history gates precede advertised support. Invariants do not confer accuracy. | +| Separate transfer admission | Versioned MAC→particle or particle→MAC operators with explicit support/reconstruction/budgets. | Initially unavailable. No facade/archive/comparison silently converts families. Implementing transfer requires its own frozen protocol and review. | + +Particle variants delegate only the existing native owner/preview capability; type presence does not qualify substitution or select wall/EOS/kernel methods. P1 owns that selection and transaction-ready adapter. Stokes, geometry, transport, capillarity and physical validation retain P/Q/V gates. Native numerical studies execute directly and are not blocked by C1-A/B/C. + +## Frozen first-slice write set + +C1-A may add `src/solver_provider/composition.rs`, adjacent focused tests, `src/native_family.rs` and adjacent focused tests. `src/solver_provider.rs` and `src/lib.rs` may change only for declarations/re-exports. Plan/protocol/review docs under this plan are included. Use existing public pressure, Session and particle-owner interfaces. Do not modify particle formulas, private numerical storage, recording schemas, process supervision or desktop flows in C1-A. If discovery requires another owner, record the concrete replan before editing and coordinate shared files with the lead. + +C1-B/C are sequenced work, not unbounded source admission. Their protocols must freeze exact native request/candidate/transaction contracts and additive intent/custody versions before edits/evaluation. Expected owners are existing `provider_step`, `simulation`/`liquid_step`, `session`, configured provider/runtime, recording and exact selection consumers. No registry or tensor engine is admitted. Adapt pressure v1; never reinterpret it as subgraph/whole-family support. + +## Contract facts and lifecycle + +Bind family/formulation/version, native association/layout/precision, exact accepted generation/input digest, actual shortened interval, geometry/operator/component/gauge, SI material/force/flux units, supported boundaries and explicit transfer identity. Unknown/incompatible inputs are typed refusals before invocation. Declared metadata and observed runtime facts stay distinct. + +Candidates are tentative native state. All fallible allocation, external work and qualification precede publication. Stateful candidates need tested prepare/abort or snapshot semantics for history/RNG, disposable prepared state and infallible local adoption. Prepare/abort failure or uncertain external commit terminates/invalidates the instance; retry requires accepted-history reconstruction and demonstrated replay/identity equivalence. Fallback uses identical immutable input/dt/operators. Existing caller-owned pressure v1 gains no promise to roll back arbitrary hidden provider state. + +Retain failed/cancelled attempts separately from accepted rows and preserve accepted-but-unrecorded tails. New persisted variants must be additive and cold-inspectable without runtime assets; G1 profiles retain exact meanings. No I/O/model execution enters cached paint. + +## Fixed qualification obligations + +Use existing [replacement gates](verification.md#replacement-contract-gates), not looser thresholds. Before evaluation, commit the C1 protocol, fixture constants, coefficients, tolerances, resource bounds and source/runtime identities. For the initial sealed reference, reuse G1 fixed grid/material/force/dt/pressure controls; compare adapter/facade with the same direct native path over 100 accepted intervals. Freeze bitwise comparison when invoking the same algorithm/order. This is contract equivalence, not water validation. + +At every admitted stage/subgraph/family level test correct candidates; nonfinite/range/shape/unit/version/operator mismatch; unsupported geometry; wrong shortened dt/generation; plausible wrong fields including divergence-free wrong dynamics; refusal/error/budget/runtime failure; cancellation around candidate/commit; immutable accepted state/history; same-input fallback; prepare/abort/uncertain-commit failure and invalidation. Recompute required intermediate/full residual witnesses. Independently qualify trajectory accuracy before claiming it. + +Later transfer admission needs positive mass, closed-domain binary64 relative mass/momentum defect ≤1e-12, translated/rotated constant/linear reconstruction tests, separately measured energy/work and target reconstruction order ≥0.9. No exact-energy/reversibility or index-based physical particle identity is implied. + +Architecture/contracts review qualifies C1-A; persistence/native UI reviewers join custody/consumer work; independent numerics review owns method-specific gates. C1-A is locally qualified within this bound and published in draft PR125, integration pending. C1-B/C require their separately frozen protocols and evidence before implementation; C1-R acceptance remains pending. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1a-manifest.json b/docs/plans/fluid-accuracy-composition/reports/c1a-manifest.json new file mode 100644 index 00000000..26e82589 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1a-manifest.json @@ -0,0 +1,166 @@ +{ + "profile": "rheon-c1a-local-qualification-v1", + "claim": "C1-A bounded adapter/facade locally qualified; integration pending, C1-R incomplete", + "pull_request": "https://github.com/MrScripty/Rheon/pull/125", + "branch": "implement/c1a-typed-native-boundary-20261020", + "base": "67ef1e9f1b7e741c3fb06b7c037b874aa8d5be75", + "frozen_admission": "e5b1f8811ce3c4f6519d70fc2c8e2de149f587bc", + "initial_implementation": "5c9fb96d7ebbc49638afbe812ac1db69b5dfc643", + "final_source": "ac6ed17003279e7078751a4390f2ee28200d4d5f", + "final_patch_runtime_semantics": "Unchanged: local enum lint annotation and test-only refinements", + "coding_standards": "0fc92a24279f3a4574c80af0a2f31ea347a21597", + "rust": "1.92.0", + "source_sha256": { + "src/lib.rs": "c208229fd3f1d15a1597a2f85ec95c51a305b92232a1bfdd18a30d57e45f5510", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/solver_provider/composition.rs": "f754b4ec78cfca408239687b4ddee2b39170835cdf7800370cb640a4d8daf9e8", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c" + }, + "protocol_sha256": "d101561280391aeafc945ce2fb7397a1b101da1942605096401cb6e7d49e1d8e", + "evidence_root": "/workspace/rheon-c1a-evidence", + "evidence": [ + { + "file": "pressure-initial.log", + "sha256": "ba9a1dff91df9300cb81a7b055bc1b5e179511bb3aebd15c3f71cd775988e3cf", + "source": "pre-5c9fb96 working tree; differs from checkpoint only in lib.rs declaration ordering", + "result": "PASS preliminary pressure-only 2 tests" + }, + { + "file": "c1a-no-default.log", + "sha256": "0938c49f4965ad5e221187bf413b8ce2716986ef4e504f78f72df054888b5544", + "source": "pre-5c9fb96 working tree; differs from checkpoint only in lib.rs declaration ordering", + "result": "PASS 12 tests, 0 failed, 49.05s" + }, + { + "file": "c1a-default.log", + "sha256": "a5d8609f26e71f9773538f10319287aeb64e2c3c20e7cd749f9b66f73fc1b342", + "source": "5c9fb96d7ebbc49638afbe812ac1db69b5dfc643", + "result": "PASS 12 tests, 0 failed, 53.49s" + }, + { + "file": "existing-contracts.log", + "sha256": "eb4e963193df0497979f10f17867073bc084e2d4d2f6c8c02664d22a451415ab", + "source": "5c9fb96d7ebbc49638afbe812ac1db69b5dfc643", + "result": "PASS 33 tests, 0 failed, 3 real-model tests ignored" + }, + { + "file": "rustdoc.log", + "sha256": "5ceba9475aa21c89601d10bd4e276a4d61fcb258aef30d15249b350f31e1638c", + "source": "5c9fb96d7ebbc49638afbe812ac1db69b5dfc643", + "result": "PASS 2 borrow compile-fail tests" + }, + { + "file": "fmt-initial.log", + "sha256": "1e154d8cadd5b89b41face3ee2f0ba2f969f1e01f547be09f098277f58ccbe94", + "source": "working-tree before 5c9fb96", + "result": "FAIL declaration ordering; repaired before 5c9fb96" + }, + { + "file": "clippy-initial.log", + "sha256": "b73a8b756aa6382d73962d0f8f3281a8ecedd52f820a24dd43a126a807ebdb82", + "source": "5c9fb96d7ebbc49638afbe812ac1db69b5dfc643", + "result": "FAIL large enum and test tuple complexity; repaired in ac6ed17" + }, + { + "file": "c1a-final-no-default.log", + "sha256": "dcef3c14c7b13b311590760923841235803d505ac2af96f1d76861951fd3ce7e", + "source": "ac6ed17003279e7078751a4390f2ee28200d4d5f", + "result": "PASS 11 affected tests, 0 failed, 2.34s; unchanged 100-interval test excluded" + }, + { + "file": "c1a-final-default.log", + "sha256": "bb21b6018621fa46b021dced1b2d97d20829c7d90d6e26afa916e6da83d948a6", + "source": "ac6ed17003279e7078751a4390f2ee28200d4d5f", + "result": "PASS 11 affected tests, 0 failed, 1.17s; unchanged 100-interval test excluded" + }, + { + "file": "clippy-core-final.log", + "sha256": "be368bf1e232bb5db679a2e7313bc02f717d3761be9b71269a34758ddef2b7d4", + "source": "ac6ed17003279e7078751a4390f2ee28200d4d5f", + "result": "PASS no-default all-target -D warnings" + }, + { + "file": "clippy-desktop-final.log", + "sha256": "d7835f5a3f7bed075320b2b31d5ab82443c1ee21487b2153664fdb2f4ff43fd0", + "source": "ac6ed17003279e7078751a4390f2ee28200d4d5f", + "result": "PASS desktop all-target -D warnings" + }, + { + "file": "fmt-final.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "source": "ac6ed17003279e7078751a4390f2ee28200d4d5f", + "result": "PASS" + }, + { + "file": "commands.txt", + "sha256": "1ec7811d709b8f812bf8870d9cca8e9ba35e8d9179d6acb228a792233f9c2af2", + "source": "5c9fb96 then ac6ed17", + "result": "Exact commands and environment" + }, + { + "file": "c1a-final-100-no-default.log", + "sha256": "6f758a1d0400e3024d5777fba320fe4444c1de00e5810606b8bbb35088965083", + "source": "ac6ed17003279e7078751a4390f2ee28200d4d5f", + "result": "PASS 1 deciding 100-interval test, 0 failed, 46.94s; combined with final 11-test run covers all 12 C1-A cases" + }, + { + "file": "c1a-final-100-default.log", + "sha256": "1cb7925be2e92c4d014d224f28010c874835da992be7b2be0f8fea4f5332227a", + "source": "ac6ed17003279e7078751a4390f2ee28200d4d5f", + "result": "PASS 1 deciding 100-interval test, 0 failed, 48.26s; combined with final 11-test run covers all 12 C1-A cases" + } + ], + "independent_reviews": { + "architecture": "PASS at ac6ed17", + "contracts": "PASS at ac6ed17", + "reviewers_authored_implementation": false, + "reviewers_ran_duplicate_tests": false + }, + "exclusions": [ + "merged/release acceptance", + "C1-R", + "subgraph candidates", + "whole-family candidates", + "transfers", + "arbitrary provider hidden-state rollback", + "learned-model qualification", + "new physical accuracy", + "GPU", + "new native GUI", + "new performance" + ], + "integration": "Repository lead owns hosted CI, stacked dependency integration and merges. No merge/rebase/cleanup performed.", + "final_source_results": { + "no_default": { + "passed": 12, + "failed": 0, + "logs": [ + "c1a-final-no-default.log", + "c1a-final-100-no-default.log" + ] + }, + "default": { + "passed": 12, + "failed": 0, + "logs": [ + "c1a-final-default.log", + "c1a-final-100-default.log" + ] + }, + "existing_contracts": { + "passed": 33, + "failed": 0, + "ignored": 3 + }, + "borrow_doctests": { + "passed": 2, + "failed": 0 + }, + "clippy_core": "PASS", + "clippy_desktop": "PASS", + "fmt": "PASS" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1a-protocol.md b/docs/plans/fluid-accuracy-composition/reports/c1a-protocol.md new file mode 100644 index 00000000..3a8df18c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1a-protocol.md @@ -0,0 +1,36 @@ +# C1-A typed native boundary protocol + +Frozen before source implementation or fixture evaluation, 2026-10-20. Canonical authority: `docs/plans/fluid-accuracy-composition/plan.md`, operation `start` on the user-authorized C1-A Planned slice. Admitted revision/base: `67ef1e9f1b7e741c3fb06b7c037b874aa8d5be75`; fetched main remains `bc2f472787060d9a69cb619ed2c2fea10fd754b6`. Branch: `implement/c1a-typed-native-boundary-20261020`, stacked on retained PR122. G1 passed local qualification at f6b7c8c; PR122 is unmerged, draft and subject to hosted CI/integration. Local qualification is not merged/release acceptance. + +## Outcome, ownership and exact write set + +Implement a finite pressure-v1 adapter and borrowed native-family facade using existing public numerical/Session APIs. No graph executor, registry, universal tensor/state, numerical formula, geometry, physical fixture, serialization, process or UI change. Numerical Q1 verification and future Q2 shared geometry/coupled Stokes remain independently owned; no grid operator/fixture or particle-formula edits are admitted. + +New files: `src/solver_provider/composition.rs`, `src/solver_provider/composition_tests.rs`, `src/native_family.rs`, `src/native_family/tests.rs`. Existing `src/solver_provider.rs` and `src/lib.rs`: module declarations/re-exports only. Plan, ledger, issues and reports under this plan are included. Root owns pressure adapter, shared declarations, canonical status and integration; native-family worker owns only its two new files. Independent architecture and contracts reviewers author no implementation. Shared interfaces were reported before edits: unchanged `ProviderWorkspace::solve`, `SimulationSession::step_with_pressure_provider`, `MaterialSession::step` and their native snapshots/reports. MaterialSession is the existing identity/quota/deadline/publication adapter around the particle preview, not a new owner. + +Repository lead/parent is serial integration owner across outstanding proposals. Compare admitted source/plan and bounded scope before shared edits and final handoff. The existing Git commit/revision is the supported mechanism; no leases, queues, second coordination store, rebase, merge or cleanup is introduced. Preserve audit119, plan120, pressurewarmstart59, PR122 and unrelated branches. Report any extra required owner before expansion. + +## Closed contracts + +`ReplacementContract` selects pressure v1, existing sealed-MAC projection, whole sealed MAC or whole particle preview. Only pressure-v1 selection constructs a `PressureStageV1` borrowing the caller's existing `ProviderWorkspace`; all other well-formed selections return typed `ReplacementUnavailable` without touching workspace or calling providers/callbacks. This does not advertise replacement support for unavailable variants. + +The pressure adapter delegates the actual `PressureRequest`, settings, optional existing `PressureProvider` and cancellation directly to `ProviderWorkspace::solve`. Successful `QualifiedPressureV1` borrows workspace pressure immutably and owns the unchanged ProviderReport; the borrow prevents another solve while that view is used. This means existing host-qualified pressure only, not corrected f32 velocity, Session publication, new metadata admission, native generation authority, physical accuracy or provider hidden-state rollback. Metadata remains descriptive and old candidate/fallback/settings/error semantics remain unchanged. Do not add validation that silently changes pressure-v1 behavior (including path-specific iteration-limit handling). + +`NativeSession` is a closed borrowed enum over existing mutable `SimulationSession` and `MaterialSession`. Requests distinguish MAC `LiquidStepInputs`/`ProviderStepWorkspace` from particle `MaterialStepControls`; callbacks distinguish real MAC stage from a particle cancellation poll, without invented stages. Each request supplies expected caller-declared SessionIdentity (run id and source revision) and generation; compare family, identity, then generation against the actual owner before any native invocation/callback/workspace use. Identity guards detect wrong declared source, not authenticity or cryptographic full-state identity. Candidate/input-digest contracts outside existing pressure v1 remain deferred to B/C. + +MAC baseline delegates `step_with_pressure_provider(..., None, ...)`; particle preview delegates `MaterialSession::step`. Preserve native deadline, cancellation, errors, actual shortened dt, native reports and publication semantics. Snapshot variants wrap original borrowed SessionSnapshot/MaterialSnapshot; no field conversion, copied accepted history or independent clock/quota. Particle preview stays visibly preview; this selects no particle method. `TransferOperator` names versioned MAC→particle and particle→MAC operations; `require_transfer` always returns typed unavailable. Wrong-family requests cannot trigger implicit transfer. Whole/subgraph/stateful candidates are not callable in C1-A. + +## Fixed deciding fixtures + +All fixtures are classical CPU contract references, not physical/numerical convergence claims. Toolchain Rust 1.92.0, existing locked dependencies, unchanged precision (MAC f32 carrier/f64 pressure/fractions; particle native f64 fields). Keep logs outside Git with compact source/command/result hashes. + +1. Pressure adapter: reuse existing `tests/solver_provider_contract.rs` algebraic fixture, grid [4,3,2], spacing [.25,.3,.4] m, origin zero, density 1.25 kg/m³, dt .01 s; pressure `sin(.3*i)` and RHS from actual `PressureOperator::apply_full`. Settings relative 1e-10, absolute 1e-12 m³/s², predicted divergence 1e-8 s⁻¹, max 1000 iterations, workspace 100000 bytes. Direct original dispatcher is the deciding oracle; compare pressure bits, selected/rejection, numerical candidate/accepted diagnostics (exclude wall-clock timing equality). Correct exact candidate must accept; short writes/nonfinite/wrong gauge/wrong field, support refusal and execution failure must match original rejection/fallback on both existing native implementations. Spy providers observe the identical actual grid/density/dt/RHS. Invalid grid/length/nonfinite/incompatible RHS/density/dt/settings and cancellation match original errors and do not become qualified success. Unsupported replacement factory preserves seeded workspace pressure. Test path-sensitive v1 semantics rather than silently tightening them. +2. Native MAC facade: existing G1 fixed 16³/1 m³ fixture, density/represented density 998.2 kg/m³, fraction .5, acceleration [.001,0,0] m/s², requested dt .001 s, Jacobi PCG, no viscosity/model. Pressure relative 1e-10, absolute 1e-12, predicted divergence 1e-8, actual divergence 1e-5, max 2000 iterations, max Courant 1, 16 MiB caps, quota at least 100. Compare 100 accepted facade intervals with the identical direct Session path bit-for-bit for every native field, stamp, pressure, fraction and time; compare numerical reports and source/interval/frame identities, excluding elapsed-time equality. This is adapter equivalence, not new solver accuracy. +3. Native particle preview facade: reuse `tests/material_session_contract.rs`: grid4³, spacing .25, origin0, samples4, max512 particles, 1 MiB cap, EmittedFluid fill, gravity0, remaining default preview configuration. Four calls with dt .001/no emitter; additionally reuse its shortened dt .2 s, source id9/source version generation and default RotatingCylinderEmitter with pressure heads [0,0]. Direct MaterialSession is the oracle. Compare native particles/time/generation, numerical reports, accepted controls, diagnostics/evaluation time/stage and actual shortened dt. No wall/EOS/kernel or geometry-selection study is introduced. +4. Refusals/failures: wrong family, same-generation other run, same run/different source revision, stale generation, unavailable replacement/transfer, invalid input, stopped/quota/expired deadline, and cancellation before/at final native commit checkpoints. Guards precede callbacks. Fingerprint complete accepted native fields, publication/source/interval/frame/provider reports and particle controls/diagnostics; no failure may relabel prior accepted history. Native-owner numerical failure semantics remain authoritative. No invented rollback for arbitrary external side effects. + +## Required verification and claim limits + +New focused tests use `c1a_` names for one deciding run. Run no-default and supported default CPU configurations, affected existing solver-provider/provider-step/Session/material/configured Session contracts, Rustdoc borrow/API checks, formatting and strict all-target library/desktop Clippy. Avoid repeating unrelated physical suites or G1 native display work: no UI/source custody changed. Independent final contracts/architecture review must dispose material findings. No new performance, process-system, native GUI, GPU, learned or physical claim is made by C1-A; existing G1 evidence is preserved separately. + +After tests, source moves Active → Implemented → Verifying and can be locally Accepted only for these C1-A claims. C1-R stage/subgraph/whole-family acceptance remains incomplete; B/C and transfer qualification remain future gates. Publish a focused PR stacked on PR122 and hand off hosted CI and merges to the lead. No merge or branch cleanup. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1a-qualification.md b/docs/plans/fluid-accuracy-composition/reports/c1a-qualification.md new file mode 100644 index 00000000..15361403 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1a-qualification.md @@ -0,0 +1,36 @@ +# C1-A typed native boundary qualification + +Status: **C1-A locally qualified / integration pending**. Frozen protocol `e5b1f8811ce3c4f6519d70fc2c8e2de149f587bc`; implementation checkpoint `5c9fb96d7ebbc49638afbe812ac1db69b5dfc643`; final source `ac6ed17003279e7078751a4390f2ee28200d4d5f`. [Draft PR125](https://github.com/MrScripty/Rheon/pull/125) is stacked on unmerged draft PR122. Neither local qualification nor this report means merged/release acceptance. + +## Implemented boundary + +`PressureStageV1` delegates the actual existing pressure-v1 request, settings, provider and cancellation to ProviderWorkspace. `QualifiedPressureV1` borrows the pressure slice and retains the original ProviderReport. This preserves old error, candidate and fallback semantics; it does not validate new metadata or promise corrected velocity, Session publication, native generation authority or arbitrary provider state rollback. + +`NativeSession` borrows either the existing SimulationSession or MaterialSession owner. Requests and snapshots retain their native family, fields and precision. Family, declared SessionIdentity (run id and source revision), and generation guards precede callbacks/workspace/native stepping. MAC calls the existing pressure-provider path with no preferred candidate; particle preview calls the existing MaterialSession. Owners retain quota, deadline, actual shortened interval, cancellation and accepted-history publication. No accepted history is copied or converted. Subgraph/whole-family candidates and both versioned transfer directions return explicit unavailable errors. + +Existing production changes are only module declarations in lib.rs and solver_provider.rs. No numerical formula, private storage, geometry, existing particle method/physical fixture, persisted profile, process or UI changes. New adapter tests reuse the fixed native fixtures. Q1/Q2 numerical work remains independent. + +## Source-bound evidence + +Rust 1.92.0, unchanged Cargo.lock; fixed CPU fixtures and tolerances are in the protocol. Raw command logs are retained outside Git at `/workspace/rheon-c1a-evidence`; the compact manifest records their SHA256 and source identities. + +| Check | Result | Source / scope | +| --- | --- | --- | +| Initial focused no-default C1-A tests | 12 passed, 0 failed, 49.05 s | Pre-5c9fb96 working tree; differs only by module declaration ordering; includes 100 bitwise MAC intervals | +| Focused default-feature C1-A tests | 12 passed, 0 failed, 53.49 s | 5c9fb96; same fixed fixtures | +| Existing eight contract targets | 33 passed, 0 failed, 3 ignored | 5c9fb96; configured/material/pressure/provider-step/Session/configuration/interval/solver-provider | +| Borrow compile-fail Rustdoc | 2 passed | 5c9fb96; pressure view and native snapshot prevent overlapping mutation | +| Final affected test reruns | 11 passed in each configuration, 0 failed | ac6ed17; no-default 2.34 s, default 1.17 s; test refinements and annotation only | +| Final exact-source 100-interval equivalence | 1 passed in each configuration, 0 failed | ac6ed17; no-default 46.94 s, default 48.26 s; completes all 12 final-source cases per configuration | +| Strict no-default/desktop all-target Clippy and formatting | PASS / PASS / PASS | ac6ed17; both Clippy commands use `-D warnings` | +| Independent architecture and contracts review | PASS / PASS | ac6ed17; [dispositions](c1a-review.md) | + +The final patch contains only a local report-enum lint allowance, a named test observation struct and a stronger exact cancellation assertion. It changes no runtime operation. Final affected-test runs cover 11 cases; separate passed 100-interval runs bind the deciding equivalence case to exact ac6ed17 source in each feature configuration. The initial no-default run preceded a declaration-order formatting repair, so it is retained with its precise attribution rather than treated as an exact committed-source result. No physical or G1 GUI suite is presented as new evidence. + +Pressure tests compare the original dispatcher on both native implementations: exact classical candidate, short/nonfinite writes, wrong gauge/field, support/execution/cancellation refusal, same-input fallback, invalid inputs/settings and original path-sensitive zero-iteration behavior. Native tests fingerprint every accepted native field and publication/source/interval/frame/report fact, particle accepted controls and diagnostics; they check wrong family/run/revision/generation, invalid native input, quota/stop/deadline, early/final cancellation and retry. Pressure report timings are excluded only for cross-run numerical equivalence; unchanged-history fingerprints retain them. No arbitrary external side-effect rollback is asserted. + +Three ignored existing tests require `RHEON_AI_EXPORT` from the hash-pinned checkpoint: real checkpoint replay/corruption, frozen-model selection/fallback and 24 production intervals. No real-model result is claimed. Classical adversarial providers are identified as test fixtures, not AI. C1-B/C, transfer qualification, broader family substitution/C1-R, native GUI, GPU, performance and physical accuracy remain outside this result. + +## Integration custody + +Branch `implement/c1a-typed-native-boundary-20261020` preserves G1 PR122 at67ef1e9 and tested f6b7c8c source. Main bc2f472, plan120 at8422f77, frozen audit119 and pressurewarmstart59 remain untouched. No merge, rebase or branch cleanup. Repository lead owns stacked dependency handling, hosted CI and all merge decisions. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1a-review.md b/docs/plans/fluid-accuracy-composition/reports/c1a-review.md new file mode 100644 index 00000000..36d7561b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1a-review.md @@ -0,0 +1,19 @@ +# C1-A independent implementation review + +Reviewed source: `ac6ed17003279e7078751a4390f2ee28200d4d5f`, including the final annotation and test-only refinements over `5c9fb96`. Reviewers did not author implementation or run duplicate builds/tests. The coordinating owner retains deciding logs under `/workspace/rheon-c1a-evidence`. + +## Architecture — PASS + +Independent architecture reviewer confirmed pressure-v1 delegates the existing dispatcher and returns its original report with a borrowed immutable pressure slice tied to the stage borrow. Unavailable replacement scopes do not touch workspace. NativeSession stores exclusive owner references only; family, caller-declared run/source identity and generation checks precede delegation, native callbacks and workspace use. Existing owner methods retain deadline, publication, fields and precision. Snapshots borrow original arrays, with no second clock, scheduler or history. + +The focused differential tests substantiate 100 native MAC intervals, particle preview with nonempty/shortened intervals, adversarial pressure candidates/fallback on both implementations, and accepted-state preservation across native refusals/failures. Final test refinements strengthen the exact first cancellation checkpoint/error. A local `large_enum_variant` allowance retains by-value native reports and avoids adding heap allocation after the owner's publication; it establishes no performance claim. No substantive architecture finding or remaining blocker. + +## Contracts — PASS + +Independent contracts reviewer confirmed unchanged pressure-v1 delegation, protected result borrows and legacy path-specific validation/fallback behavior, including exact classical candidate acceptance with zero native iteration allowance. Metadata remains descriptive; no native-generation or hidden-state rollback authority is added to pressure v1. Native source/generation/family guards precede invocation and preserve native accepted history. Unavailable subgraph/whole-family and transfer paths have no provider or callback route. + +Reviewer inspected coordinated evidence: 12 focused tests pass in each feature configuration, 33 existing contract tests pass, and two borrow compile-fail doctests pass. Three real-model tests remain ignored because their pinned artifact is absent; those are exclusions, not passing learned-model evidence. Final patch disposition at ac6ed17: PASS, no material source/test hole, no reviewer writes/builds or remaining blocker. + +## Scope retained + +These reviews accept only the bounded C1-A adapter/facade architecture and contracts. They do not accept C1-R, projection/whole-state substitution, transfers, arbitrary provider rollback, particle method selection, learned deployment, physical accuracy, GPU behavior, new native GUI behavior or performance. Existing G1 evidence remains separate. Hosted CI, dependency integration and merges belong to the repository lead. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b1-manifest.json b/docs/plans/fluid-accuracy-composition/reports/c1b1-manifest.json new file mode 100644 index 00000000..a51914c9 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b1-manifest.json @@ -0,0 +1,201 @@ +{ + "profile": "rheon-c1b1-local-qualification-v1", + "claim": "Stateless supplied-array sealed projection qualification foundation only; full C1-B/C1-R/integration pending", + "branch": "implement/c1b1-projection-qualification-20261020", + "base": "91b20381d4c717299303ac228ffb927af0892256", + "pull_request": "https://github.com/MrScripty/Rheon/pull/128", + "admission": "ea37b6040b8fb2c5973170e4379565e47357727d", + "pre_evaluation_fixed_gate_amendment": "aa3c4352402aeeb2d8873074ede897b0317a1b98", + "exact_tested_source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "coding_standards": "0fc92a24279f3a4574c80af0a2f31ea347a21597", + "rust": "1.92.0", + "source_sha256": { + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "e9a717ffc318c2345a4863369ff426c1f6d86f6ae4c3a5d312f2bfc459d33e4d", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c" + }, + "protocol_sha256": "2847dc9490824ee21f0959ba5a0ce5d2b374d599769653e301b18cbba1b7c26b", + "evidence_root": "/workspace/rheon-c1b1-evidence", + "evidence": [ + { + "file": "check-initial.log", + "sha256": "c80cf81a8f9039d69726399f8347fd493ca542a0c1a617aaec2ea2cd0dec36ae", + "source": "pre-checkpoint preliminary working source", + "result": "PASS preliminary compile, pre-checkpoint source; not deciding qualification" + }, + { + "file": "fmt-initial.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "PASS, exact Rust bytes checkpointed at f161d1a" + }, + { + "file": "c1b1-no-default.log", + "sha256": "1491dad84cba03f7d45f57d8f7d4e3d690f8cc735aa4a87198620ca64488598c", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "PASS 11 tests, 0 failed, 0 ignored; 0.14s" + }, + { + "file": "c1b1-default.log", + "sha256": "3e7e4dace809da4f982b14a7e0b090ea5257fee2687bb6c00c63cc58f069f7b5", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "PASS 11 tests, 0 failed, 0 ignored; 0.06s" + }, + { + "file": "existing-contracts.log", + "sha256": "602af7b0633e3c405b0c918b4928d2bd37cff56385c6a63bbf02dc4e9f07613a", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "PASS 41 tests, 0 failed, 2 pinned-model tests ignored" + }, + { + "file": "c1a-compatibility.log", + "sha256": "f0541f737422452344fe836d18b3dafa11d5a29de87b374bfbfdaf3bc607b47e", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "PASS 1 preserved pressure-v1/unavailable-scope contract" + }, + { + "file": "rustdoc.log", + "sha256": "5a8d2c5bd1ae7b7e11ff7f00baac71013af9623223dadec634fe6011e895e854", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "PASS 3 compile-fail borrow contracts" + }, + { + "file": "clippy-core.log", + "sha256": "18687389fb375aca1f086316d58cc1795e1ca8bafa0e84d9eb4b9a52cc2d444d", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "PASS no-default all-target -D warnings" + }, + { + "file": "clippy-desktop-initial.log", + "sha256": "5a573eaf5e351e59c513f4cd583ebf11d8dd8d9c2ed60459808b82859e026fd2", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "PASS desktop all-target -D warnings" + }, + { + "file": "commands.txt", + "sha256": "e252e2d06a9a65e7b2905d35d7d94094f6310176bcde91c3f16a074db382d1a8", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "result": "Exact commands/environment and attribution" + } + ], + "native_test_executables": { + "/workspace/rheon-core-target/debug/deps/rheon-2c0b8f9f964eff45": { + "sha256": "7ba041f9d3cf95fdecfac5104bbe8512bef8c599f6d89c6b2f55a7455d08c5f6", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "c1a-compatibility.log" + }, + "/workspace/rheon-core-target/debug/deps/rheon-d293312d0455f2e1": { + "sha256": "68e91c1681a0d2ac511e77109d5429fb081e51531cec3f5cc08aa034aab8639c", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "c1b1-default.log" + }, + "/workspace/rheon-core-target/debug/deps/configured_provider_session_contract-7a47e2a64e933952": { + "sha256": "da10dc71a87c20246b00fd5cc22085fc2ea97d0649050041efb0b347722e8c97", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "existing-contracts.log" + }, + "/workspace/rheon-core-target/debug/deps/operator_contract-690eb3a5f446bc90": { + "sha256": "1a3551a38b2fcc06234dad80435929a924cbfa7a935622acec560100bf96f3e6", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "existing-contracts.log" + }, + "/workspace/rheon-core-target/debug/deps/pressure_context_contract-86284562eb2314a6": { + "sha256": "a7b68008f6172417c4b989bb07c37c5eaecb790096353f916edb0a515c187b91", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "existing-contracts.log" + }, + "/workspace/rheon-core-target/debug/deps/pressure_contract-a752af99edbd98ea": { + "sha256": "340c76130a203a940f00f5e1b1449a5d19cbeb0b43a124009e456c7c9b193120", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "existing-contracts.log" + }, + "/workspace/rheon-core-target/debug/deps/provider_step_contract-024046052e7e09fc": { + "sha256": "35dfa902cbefc69468e6e28aae8e66bba54ff7f1ec7349b928e9575a7124ec4a", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "existing-contracts.log" + }, + "/workspace/rheon-core-target/debug/deps/session_contract-07a33dc1a656083f": { + "sha256": "88b8c14d1f0fa40d066565b258495fdc2841475277854539c76fc47e50483bfc", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "existing-contracts.log" + }, + "/workspace/rheon-core-target/debug/deps/solver_provider_contract-4f9ffb3b3a91bb87": { + "sha256": "99c5bbfd0bcf5890e5dfe1b7599e42b8aa576a72fe5cbda9a5c4780aedde1796", + "source": "f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a", + "evidence_log": "existing-contracts.log" + } + }, + "results": { + "focused_no_default": { + "passed": 11, + "failed": 0, + "ignored": 0 + }, + "focused_default": { + "passed": 11, + "failed": 0, + "ignored": 0 + }, + "existing_contracts": { + "passed": 41, + "failed": 0, + "ignored": 2 + }, + "c1a_compatibility": { + "passed": 1, + "failed": 0 + }, + "borrow_doctests": { + "passed": 3, + "failed": 0 + }, + "clippy_core": "PASS", + "clippy_desktop": "PASS", + "fmt": "PASS" + }, + "independent_review": { + "architecture": "PASS at f161d1a", + "contracts": "PASS at f161d1a", + "reviewer_edits_or_builds": false + }, + "fixture_limits": { + "grid_nonzero": [ + 4, + 3, + 2 + ], + "spacing_m": [ + 0.25, + 0.3, + 0.4 + ], + "rho_kg_m3": 1.25, + "dt_s": 0.01, + "relative_pressure_residual": 1e-10, + "absolute_pressure_residual": 1e-12, + "predicted_divergence_per_s": 1e-08, + "actual_divergence_per_s": 1e-05, + "max_native_iterations": 1000, + "managed_array_cap_bytes": 1048576, + "wrong_dynamics_loop_m_s": 0.125, + "actual_divergence_candidate_pressure_Pa": 1e-13, + "exact_actual_gate_per_s": 0 + }, + "claim_limits": [ + "100 repetitions are independent kernel requests, not integrated trajectories", + "declared input source is consistency, not accepted-Session authentication", + "supplied arrays only, no candidate provider execution", + "no Session adoption", + "no persisted intent/attempt/custody version", + "no stateful prepare/abort or external runtime qualification", + "no learned-model evidence", + "no physical/GPU/native-GUI/performance claim", + "allocation failure injection not performed" + ], + "canonical_plan_or_ledger_changed": false, + "integration_owner": "repository lead 01a13f94-5c63-7243-abfc-f5474da1902d", + "coordination_transport": "Direct lead/Q1 thread messages returned agent not found; exact interface/write set recorded for parent relay. No numerical-owner edits required.", + "next_gate": "Freeze native invocation/Session publication and additive intent/attempt/custody contracts before integrated C1-B edits; execute real 100-interval substitution and applicable lifecycle/persistence/native-consumer gates.", + "cleanup_or_merge_performed": false +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b1-protocol.md b/docs/plans/fluid-accuracy-composition/reports/c1b1-protocol.md new file mode 100644 index 00000000..132ea281 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b1-protocol.md @@ -0,0 +1,45 @@ +# C1-B1 stateless projection qualification protocol + +Frozen before implementation and evaluation, 2026-10-20. Canonical plan: docs/plans/fluid-accuracy-composition/plan.md; operation: start the smallest dependency-ready C1-B foundation under the explicit continuing implementation instruction. Proposal base/admitted plan revision: `91b20381d4c717299303ac228ffb927af0892256` (PR125); qualified Rust prerequisite `ac6ed17003279e7078751a4390f2ee28200d4d5f`. Safely fetched main is bc2f472787060d9a69cb619ed2c2fea10fd754b6. New branch: implement/c1b1-projection-qualification-20261020, target PR125 branch. No mandatory merge prerequisite appears in the frozen C1 sequence; local C1-A qualification permits stacked development, not integration/release acceptance. Independent architecture and contracts admission reviews agree. Hosted CI and all serial merges remain with lead thread 01a13f94-5c63-7243-abfc-f5474da1902d. + +## Bounded outcome and responsibility + +C1-B1 is Active: a host qualifier for immutable **supplied** pressure/staggered-velocity arrays for the existing sealed stationary constant-density box. It executes no candidate provider, process or model, adopts no Session state and writes no archive. Full C1-B, C1-C and C1-R remain pending their integration, transaction, custody and trajectory gates. Existing C1-A PressureStageV1 selection semantics remain unchanged; its projection variant continues unavailable. This foundation is not an advertised Session/subgraph replacement capability. + +Exact write set: new src/solver_provider/composition/projection.rs and projection_tests.rs; src/solver_provider/composition.rs only module declaration and scope documentation; report/protocol/qualification/review/manifest files with c1b1 prefix under this reports directory. No canonical plan/ledger/claim-register edit: the repository lead owns reconciliation. No lib.rs, solver_provider.rs, numerical operator/geometry, particle, existing physical fixture, Session, process, recording, UI, Cargo or lockfile edit. Root owns implementation/integration of this proposal; independent reviewers author no implementation. Native worker may author only the new projection_tests.rs after receiving the frozen contract. No other owner is required by the existing public pressure/correction/divergence APIs. + +Shared interfaces reported before edits: unchanged PressureOperator::{new,build_rhs,correct_candidate_in_place,divergence}, its existing crate-visible validate_cells/validate_velocity seams, ProviderWorkspace::{new,solve,pressure,allocated_bytes}, GridGeometry accessors and SessionIdentity as caller-declared source tags. Q1/Q2 thread 01a1569b-5cbb-711f-935f-0ccef3cae00c owns its numerical write set. Direct collaboration transport cannot reach either separate thread (agent not found); the proposal and commentary carry exact interface/write-set facts for parent/lead relay. This proposal requires no edits to their modules or canonical authority. Compare branch/source revision and fetched shared authority before the declaration edit and lead integration. If a new numerical/shared owner is needed, stop that expansion and report the concrete gate. No merges, rebase, cleanup or second coordination store. + +## Closed request, supplied candidate and result + +The request retains immutable borrowed actual provisional f32 x/y/z faces, grid, f64 density, actual shortened dt and interval_start, PressureSettings and separate actual f32 divergence limit. It includes a declared SessionIdentity/generation and an explicit domain. Only SealedStationaryBox is admitted; free-surface, embedded-obstacle and moving-wall domain labels refuse before execution. These source tags prove consistency of supplied inputs, not authenticity or a verified accepted Session generation. Constructor validates field shape/finiteness/fixed-wall normals using the existing sealed operator, positive finite interval and density, finite nonnegative limits, positive max_iterations (the new API promises a usable native fallback), and bounded nonempty source revision. No pressure-v1 validation policy changes. + +SHA256 input identity uses a fixed domain-separated projection-v1 contract/operator/gauge/SI/layout/precision identifier, count/spacing/origin, source run/revision/generation, interval_start, actual dt, density, all pressure settings, actual_divergence_limit and every provisional f32 face bit in x/y/z order, with explicit lengths. Hash actual immutable inputs; RHS is always built by the host from those inputs. Candidate headers carry exact input identity, version/operator, cell-f64-Pa and each staggered-face-f32-m/s representation (shape/layout/scalar/units), and bounded declared algorithm/version/source identity. Unknown/mismatched representation, input binding or malformed identity is a typed refusal without fallback. Metadata is declared, not observed runtime provenance. + +Candidate arrays are borrowed immutable data, with no prepare/commit/abort or hidden provider state to roll back. Shape/nonfinite/fixed-wall/gauge/pressure quality/correction-witness/actual-divergence failure is a typed candidate rejection with the declared compatible native fallback. Unsupported candidate execution, runtime errors, stateful transactions, arbitrary external side effects and uncertain commits are unavailable, not tested as passing. Their full C1-B/C/R gates remain required before such invocation exists. + +Use only the existing pressure dispatcher for full compensated residual/gauge/predicted-divergence gates and original numerical diagnostics. A private supplied-array bridge copies pressure into that dispatcher; its identity says supplied projection pressure witness, never model execution. Use existing correct_candidate_in_place on scratch copied from the actual immutable f32 provisional input; compare candidate velocity bits exactly against that host correction. This preserves valid signed-zero walls/interiors instead of silently substituting correct_velocity's +0 walls. This strict f32 witness admits the current discretization/order only, not arbitrary approximate reconstruction. Host recomputes actual all-cell divergence with the same separate frozen limit. Divergence-free wrong dynamics must fail the correction witness. + +Every fallback discards all candidate pressure/velocity and reconstructs native pressure and correction from the identical original immutable provisional fields, dt, density, grid and settings. A pressure-dispatcher rejection that already ran fallback is retained with its actual report; do not relabel fallback output as supplied-candidate acceptance. If candidate pressure was accepted but its actual divergence fails, rerun the native path from immutable input, retaining the candidate rejection. Native/fallback failure returns its typed error and no qualified result. No compatible fallback is guessed outside the sealed domain. + +Success returns an immutable pressure/velocity view borrowed from caller-owned disposable workspace with original pressure report, explicit supplied/native-baseline/native-fallback selection, declared candidate identity/rejection and measured actual divergence. The borrow prevents overwrite while used. All errors/cancellation return no qualified view; scratch may be invalid and is never accepted state. No copied accepted history or publication. Cancellation is cooperative before solve, through existing pressure solve and after qualification/before returning; no preemption or hard deadline claim for synchronous operator loops. + +Preallocate and cap aggregate Vec capacities: existing ProviderWorkspace plus host RHS/divergence (two f64 cell arrays) and three f32 face witness/output arrays. Checked count/byte arithmetic, try_reserve_exact and final actual-capacity accounting. Caller inputs/candidate arrays, metadata, allocator overhead and stack are excluded explicitly; no per-attempt Vec allocation. Return typed budget/allocation errors. No process, file or runtime work. + +## Fixed deciding fixtures and refusal cases + +Rust 1.92.0, locked unchanged dependencies, native CPU f32 faces/f64 pressure. Raw logs outside Git at /workspace/rheon-c1b1-evidence, compact committed hashes. Freeze numerical criteria now: + +1. Nonzero host-RHS fixture: grid [4,3,2], spacing [.25,.3,.4], origin zero, rho1.25, interval_start0, actual dt.01; all wall-normal faces +0, each interior axis face value `(0.001 * sin(0.3 * flat_index)) as f32`. Pressure settings relative1e-10, absolute1e-12, predicted divergence1e-8, max1000, actual f32 divergence1e-5; cap1MiB. Declared source run101/revision c1b1-frozen-reference/generation0. Host builds actual RHS. Direct existing ProviderWorkspace::solve(None) plus copied-input correct_candidate_in_place is the deciding oracle for both PressureImplementation::ALL. Classical supplied candidate uses that direct path's pressure/velocity; compare accepted native fields bitwise and pressure numerical reports (timings excluded across calls). Repeat100 independent fixed requests with monotonically declared generation/interval_start and unchanged actual arrays; this is kernel repeatability/differential evidence, not an integrated trajectory or accepted-history gate. +2. Wrong-dynamics fixture: sealed grid4³, spacing.25, rho1.25, dt.01, zero provisional faces and pressure. Add exactly representable .125/- .125 loop to candidate: x(2,1,1)=+.125, y(2,2,1)=+.125, x(2,2,1)=-.125, y(1,2,1)=-.125. Existing divergence must be exactly zero everywhere; pressure-only residual also zero. Exact correction witness must reject, native fallback must return all original zero dynamics. +3. Signed-zero fixture: same closed box with -0 provisional wall and interior faces, zero RHS/pressure. Host correction must match the existing in-place path bitwise; candidate that replaces preserved -0 wall with +0 fails the strict witness, proving the selected finite-precision contract. Include gauge -0 (legacy pressure gauge permits it) without weakening witness checks. Actual-divergence two-call fixture: on the zero-input 4³ box, pressure cell1=1e-13 Pa, others0, exact host-corrected candidate velocity, actual divergence limit0, remaining original strict settings. Its full integrated pressure residual is below1e-12, but its nonzero corrected divergence must reject; native zero-pressure fallback must pass0 and retain the discarded candidate pressure report separately from the final native report. Native actual-gate failure fixture: nonzero fixture1 input, relative1/absolute1/predicted1, actual divergence0; zero-iteration native pressure meets these deliberately loose pressure settings while actual divergence fails. These are fixed negative-gate fixtures, not relaxed accuracy criteria. +4. Mutate one fact at a time: actual dt, interval start, declared source run/revision/generation, density, grid origin/spacing/counts, pressure settings, actual divergence limit, one provisional face bit. Input identity must differ; cross-linked candidate refuses. Version/operator/layout/scalar/units/shape mismatch, invalid identity and unsupported domain refuse. Shape/nonfinite/gauge/wall/finite wrong pressure or velocity candidates reject and fallback identically to native. Corrupt candidate scratch cannot contaminate later calls. Invalid native input/settings never become fallback success. +5. Cooperative cancellation before dispatch, in native solve, after candidate qualification and before result; quota is not invented for this raw qualifier. Native failure/iteration budget exhaustion, construction cap exhaustion, failed result then repeated good call, immutable input/candidate preservation and negative compile-fail borrowed-result overwrite. If platform allocation-failure injection is unavailable, claim checked allocation path only, not injected allocator evidence. + +No tolerance changes after evaluation. Tests call existing production operators; no new physical formulas or convergence study. Tests prefix c1b1_ for deciding runs in no-default and supported default features, plus existing provider/pressure/operator/Session contracts, Rustdoc, strict no-default/desktop all-target Clippy and formatting. Independent final architecture/contracts review is required. No repeated native GUI or particle/numerical study. + +## Exit and remaining integration gates + +Active → Implemented → Verifying → locally qualified only for this supplied-array qualification foundation. Publish a focused draft PR stacked on PR125 with exact tested source, commands/results and failure dispositions. Lead owns canonical state reconciliation, dependency freshness, hosted CI, serial merges and any cleanup. Existing G1 and C1-A evidence/protected PRs remain intact. + +Full C1-B still requires real native invocation and tentative-state integration at the existing owner, additive intent/attempt/custody versions chosen before those edits, request authority tied to actual accepted Session inputs, exact-source 100-interval integrated substitution, actual provider/fallback provenance, every applicable lifecycle/process error, accepted-history/no-publication-on-failure tests and persistence/native consumer review. C1-C additionally needs complete native state/history and whole-interval gates. Stateful candidates need the frozen prepare/abort/uncertain-commit protocol and observed replay/reconstruction. None is bypassed or claimed by C1-B1. Numerical repairs continue independently. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b1-qualification.md b/docs/plans/fluid-accuracy-composition/reports/c1b1-qualification.md new file mode 100644 index 00000000..fb239a91 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b1-qualification.md @@ -0,0 +1,38 @@ +# C1-B1 supplied projection qualification + +Status: **locally qualified foundation / integration pending**. Exact source f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a. Frozen admission ea37b6040b8fb2c5973170e4379565e47357727d, fixed-gate amendment aa3c435; [protocol](c1b1-protocol.md). [Draft PR128](https://github.com/MrScripty/Rheon/pull/128) targets the preserved PR125 branch at91b2038. Local qualification permits dependent development; it is not hosted-CI, merged, release or full C1-B/C1-R acceptance. + +## Delivered boundary + +ProjectionRequest immutably binds actual f32 provisional faces, grid, density, actual dt/interval start, declared source/generation, pressure settings, actual divergence limit and exact version/operator/gauge/representation units/precision/layout. Host builds RHS. Unknown support, mismatched source/input fingerprint or representation and invalid identity are typed refusals before callbacks. Source tags prove consistency of supplied data, not authenticity of an accepted Session state. + +ProjectionWorkspace qualifies immutable supplied pressure/f32 staggered-velocity arrays with the original pressure dispatcher, production in-place correction witness and actual divergence. Exact witness comparison preserves signed-zero wall bits and rejects wrong dynamics even when divergence and pressure residual are zero. Numerical candidate failures explicitly select compatible native fallback from identical original input; no partially corrected candidate is reused. The two-pressure-call path retains the discarded accepted candidate-pressure report and final native report separately. Cancellation/native failure returns no qualified view. Success borrows disposable capped scratch; it adopts no Session state/history. + +Only composition.rs declaration/scope documentation and two new projection source/test files changed production/test source. Numerical/geometry owners, existing physical fixtures, particle, Session, recording, process, UI, Cargo and lockfile remain untouched. C1-A PressureStageV1 still refuses its projection variant. This API executes no candidate provider or external runtime and has no stateful lifecycle; supplied identity is declared provenance only. + +## Exact-source results + +Rust1.92.0, unchanged locked dependencies, representative native CPU. Fixed criteria/inputs are in the protocol. Every result below uses f161d1a Rust source; no repair/reinterpretation after evaluation. Logs and captured executable hashes are retained under /workspace/rheon-c1b1-evidence, bound by [manifest](c1b1-manifest.json). + +| Check | Result | Evidence | +| --- | --- | --- | +| Focused C1-B1 no-default | 11 passed, 0 failed, 0 ignored; .14s | c1b1-no-default.log | +| Focused C1-B1 default | 11 passed, 0 failed, 0 ignored; .06s | c1b1-default.log | +| Seven existing operator/pressure/context/provider/Session targets | 41 passed, 0 failed, 2 real-model tests ignored | existing-contracts.log | +| Preserved C1-A selection/v1 behavior | 1 passed | c1a-compatibility.log | +| Borrow compile-fail Rustdoc | 3 passed, including new projection output borrow | rustdoc.log | +| Strict all-target Clippy, no-default and desktop | PASS / PASS, -D warnings | clippy-core.log / clippy-desktop-initial.log | +| Formatting / diff check | PASS / PASS | fmt-initial.log / coordinating check | +| Independent architecture / contracts review | PASS / PASS at f161d1a | [review dispositions](c1b1-review.md) | + +All eleven focused tests cover both native pressure implementations: exact native/supplied fields, 100 independent fixed-input requests per method, wrong divergence-free dynamics, signed-zero wall/gauge behavior, every request binding and representation field, unsupported domains/header identity, field/gauge/pressure rejection, actual-divergence-triggered fallback with both reports, native actual-divergence failure, iteration exhaustion, cancellation around qualification and inside iteration1, retry/immutability and exact aggregate array capacity. The 100 requests do not advance a Session or establish integrated trajectory accuracy. Array equality is asserted by the source-bound native test executables; the logs are not standalone scientific field exports. + +Two existing tests remain ignored: real checkpoint replay/corruption and real-model 24-interval Session advance require RHEON_AI_EXPORT from the pinned checkpoint. No learned assets were supplied or synthesized. Platform allocator failure was not injected; checked try_reserve paths and explicit array-cap rejection are the selected evidence. No hard preemption/deadline or arbitrary external-effect rollback is claimed. + +## Lifecycle, integration and exact next gate + +C1-B1 Active → Implemented at f161d1a → Verifying → locally qualified for the frozen stateless foundation only. No canonical plan, ledger or claim-register edit: serial reconciliation belongs to repository lead01a13f94-5c63-7243-abfc-f5474da1902d. Parent/lead must relay interface notices to numerical owner01a1569b-5cbb-711f-935f-0ccef3cae00c; direct collaboration attempts returned agent not found because those threads are outside this agent tree. This did not require numerical-owner edits or block isolated implementation. + +The next C1-B integration slice must first freeze its native invocation/publication write set and additive immutable-intent/attempt/custody versions. It must bind authority to actual accepted Session input, retain observed candidate/fallback facts, execute applicable failure/transaction/runtime tests and the real 100-interval integrated substitution oracle, and receive persistence/native consumer review where those owners change. B1 does not satisfy those gates. Stateful candidates additionally require tested prepare/abort, uncertainty invalidation and reconstruction/replay before reuse; C1-C retains full native-state/history and whole-interval gates. No missing learned assets block classical integration work. No numerical repair depends on this composition sequence. + +Branch implement/c1b1-projection-qualification-20261020 is separate and dependent on retained PR125/PR122/PR120. No merge, rebase, canonical status overwrite, protected-source edit or branch cleanup. Lead owns dependency freshness, hosted CI, all merges and cleanup. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b1-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b1-review.md new file mode 100644 index 00000000..12642151 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b1-review.md @@ -0,0 +1,23 @@ +# C1-B1 independent review dispositions + +Reviewed source: f161d1ad9f8a4acfb1e1d86c63c6a875fca3182a. Protocol/admission ea37b60 and fixed-gate amendment aa3c435 preceded deciding evaluation. Reviewers authored no implementation and ran no duplicate builds/tests. + +## Architecture — PASS + +Independent admission review found local C1-A qualification sufficient for a stacked stateless supplied-array foundation; it does not bypass merge, hosted-CI or full C1-B/C1-R gates. The exact existing in-place correction, rather than separate-output correction, is required to preserve signed-zero wall behavior. Freeze complete request/representation identity, actual divergence limit, same-input fallback, scratch limits and borrowed output. These requirements were implemented. + +Final source/test review at f161d1a found no substantive defect. Actual immutable input fingerprint and header refusal precede callbacks and scratch use; numerical quality failures retain typed rejection and reconstruct fallback from the original input on both existing native pressure methods. The exact correction witness rejects divergence-free wrong dynamics. Signed-zero walls and gauge are tested. The two-dispatch actual-divergence fixture retains discarded candidate-pressure and final native facts separately. Cancellation, iteration/cap exhaustion, immutable input/candidate preservation, retry and compile-fail borrowing match the contract. + +Review finding disposed: the interface inventory now explicitly lists reused crate-visible operator validation seams; their owner/public behavior was not changed. The 100 repetitions are independent fixed-input kernel requests, not integrated trajectory substitution. Reviewer inspected the coordinated 11-test no-default pass log; no builds or writes. Architecture PASS at the stable source. + +## Contracts and adversarial behavior — PASS + +Independent review verified binding/representation/identity refusal before callbacks, host-built RHS, pressure residual and exact signed-zero-aware correction witness, actual divergence qualification and native fallback reconstructed from original input. Successful results borrow disposable scratch; failures return no qualified view. Aggregate actual Vec capacities are capped and no per-attempt Vec is added. + +Report clarification disposed before deciding tests: the final selected pressure dispatch and the earlier accepted supplied pressure discarded by actual divergence are separate original reports. The deterministic tiny-pressure two-call fixture and native actual-divergence failure fixture were frozen before evaluation. Header inconsistency refuses; field/numerical failure rejects with declared compatible native fallback; no candidate execution or arbitrary hidden-state rollback is implied. + +Final review inspected all eleven tests: both native methods, 100 independent kernel requests, wrong divergence-free velocity, signed-zero walls/-0 gauge, changed actual bindings, representation/source/domain refusal, numerical rejection paths, pressure-iteration failure/cancellation, retry and exact aggregate capacity. Coordinated no-default result: 11 passed, 0 failed, 0 ignored. No material source/test hole, reviewer builds/writes or remaining review blocker. + +## Acceptance boundary + +PASS covers the supplied-array qualification foundation only. Supporting default/contract/Rustdoc/Clippy/fmt results are recorded by the coordinating owner in c1b1-qualification.md and c1b1-manifest.json. No Session adoption, integrated trajectory acceptance, runtime/stateful provider lifecycle, persisted provenance, full C1-B/C1-R, learned-model, physical, GPU, native GUI or performance claim. Lead owns canonical reconciliation, hosted CI, stacked integration and merges. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.json new file mode 100644 index 00000000..d01c637d --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.json @@ -0,0 +1,320 @@ +{ + "all140_match_tested70da_and_final_d3e": true, + "counts_vs_fixed133": { + "added": 5, + "changed": 11, + "removed": 0, + "total": 140, + "unchanged": 124 + }, + "decision": "APPROVED_EXACT_EIGHT_PREPARED_PATHS_AND_EXECUTION_DRIVER_FOR_CLEAN_COMMIT_AND_FRESH_QUALIFICATION", + "delta_vs_approved136": { + "src/bin/desktop/workflow_inspector_tests.rs": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4" + }, + "driver_assessment": "Suitable for this scoped serial qualification. Actual completed counts/ignores must be independently audited afterward; successful command exits do not establish unexecuted contract/physical coverage. Nonzero child exits retain failure record and stop; unexpected process/IO exceptions cannot reach finalPASSED and require disposition, not resuming/overwriting evidence.", + "findings": [], + "frozen_predecessor_review_exact_prefix": true, + "local_links": [ + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/recording-compressible-integration/reports/dependency-licenses.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/approved-pins.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/preflight-followup.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/preflight-approved-pins.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md", + "target": "source-review/readiness-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md", + "target": "source-review/g1-cancel-followup.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md", + "target": "source-review/readiness-review.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md", + "target": "source-review/g1-cancel-followup.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md", + "target": "source-review/source-map-review-input.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.md", + "target": "g1-cancel-followup.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.md", + "target": "readiness-review.json" + } + ], + "prepared_path_sha256": { + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md": "212456439c1f52bd340d85b27d52f176efd126d2bd81f8c5fbd82a665d0d55d1", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.json": "59b5d1e63c82386320cc1b45a7ee6b383fa6ae51d5ba50ddfd805552ac1ad867", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.md": "0cf3d8106faac94f4fb280f254afe9aaac3beecd39216a807ba2500e097f7823", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.json": "aa789ea2b34a51fc38292f15c8cc3147d2a3e6ec2ed952c0130031e7f2908f21", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.md": "ecc88ca5532256e4c49ad1d5ba7c55558550f72fb2c2474154cbe493423880d6", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/source-map-review-input.json": "46ecf09aa2b44f444fb03e15b5ec429bd4a2b63f82e9af9de749c538bf1100e2" + }, + "preserved_mechanism_and_Cargo_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "resolved_driver_findings": [ + "Decisive source/output/receipt/hash guards are explicit require/RuntimeError, active under Python optimization.", + "Initial journal/log/native-copy writes are exclusive; journal updates check source_head/start identity and retained ELF dedup checks exact hashes.", + "Packet logs must report exactly26 and bareOK before success, excluding skipped/zero-test results.", + "Committed locked Cargo metadata and format steps precede unchanged18-command qualifier." + ], + "reviewed_external_scripts": { + "/tmp/prepare_c1b2_repaired_admission.py": { + "assert_nodes": 0, + "parsed_and_compiled_optimize2_without_execution": true, + "sha256": "e0ae6bc0c1f85f7bd3374851218db70ad61bf43eb3b0072e407ee69279e5f6a7" + }, + "/workspace/rheon-c1b2-admission-20261020-evidence/run-fresh-qualification.py": { + "assert_nodes": 0, + "parsed_and_compiled_optimize2_without_execution": true, + "sha256": "ff037b2d9d81282f0afd4c815a53a1a9ee9169cbe11002e21b6f3834e370c8e3" + } + }, + "schema": "rheon-independent-final-c1b2-admission-review-v1", + "scope_limits": [ + "This is source/admission/prospective driver review, not execution or merge approval.", + "Immutable native candidate/B1 witness/atomic Session/capped RPS1/RPP1/RPT1 scope follows preserved independent source review; no arbitrary/stateful/external/optional-viscosity/whole-family/physical acceptance.", + "Three-line legacy cancellation receipt repair changes classification only; original9c/9a/e56 history and old archivedFailed labels remain unchanged.", + "Q2 Cargo/reference/CV1 and later branches excluded; prior separate qualified subjects remain intact.", + "No driver/preparation execution, build/test/campaign or repository/ref/PR mutation performed; only metadata inspection and in-memory syntax compilation." + ], + "selected_source_map_sha256": "08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6", + "selected_source_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "src/bin/desktop/settings.rs": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/forces.rs": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/projection_step.rs": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "src/recording/carrier.rs": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/material.rs": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "src/recording/projection.rs": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24", + "src/recording/projection_tests.rs": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338", + "src/recording/provider.rs": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "src/session/projection.rs": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc", + "src/session/projection_tests.rs": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "source_review_copies_byte_exact": true, + "subject": { + "component_head": "d3e62377acde6641c8133cf9a9356cc046cfd02a", + "component_tree": "f8be6e0ef85a6a965545b2882bff11500c7f1dfd", + "prepared_metadata_uncommitted": true + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.md new file mode 100644 index 00000000..205f41df --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.md @@ -0,0 +1,31 @@ +# Final C1-B2/PR137 admission and prospective-driver review — 2026-10-20 + +Approved the exact eight prepared admission/protocol/source-review paths and the reviewed external execution driver for clean commit and fresh qualification. No unresolved finding remains in this bounded review. Exact per-file and script hashes are in review.json. This is prospective admission/driver approval, not execution, public merge or full replacement acceptance. + +## Source and history binding + +Component checkpoint `d3e62377acde6641c8133cf9a9356cc046cfd02a`, tree `f8be6e0ef85a6a965545b2882bff11500c7f1dfd`, is the reviewed stable subject. All140 regular nonsymlink selected files match both current/committed d3e and tested `70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52` blobs. Under the unchanged selector, the delta from fixed PR133 is five added, eleven changed,124 unchanged, zero removed. Canonical map SHA256 is `08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6`. + +Against prior approved PR136/e56 there are exactly three changed selected inputs: configured Session classification, workflow recording tests and desktop workflow tests; the other137 are exact. The sole production repair adds the nested advection-cancellation matcher. It changes Failed→Cancelled for actual velocity/tracer cancellation without changing numerical arithmetic/order, accepted-state publication, cold codecs or historical archive labels. Existing genuine failures stay Failed. Prior9c/9a/e56 defect evidence and qualifications remain historical; no old receipt is reinterpreted. + +The preserved independent source review supplies the remaining B2 ownership/contract rationale: closed immutable native invocation reuses existing producer, B1 qualification, Liquid downstream gates and atomic Session commit; bounded RPS1/RPP1/RPT1 custody reuses SQLite. Mixed-witness fallback remains a truthful refusal, and existing desktop/comparison refuse the new profile. No arbitrary/stateful/external provider, optional viscosity, whole-family/transfer or scientific accuracy acceptance follows. Raw owner tests/campaigns were not rerun by this reviewer. + +The old bound review at SHA256 `9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c` is an exact prefix. v3 schema/base/predecessors, frozen v1/v2 bytes, Cargo/toolchain, selector/checker/oracle/qualifier/packet and refusal tests remain fixed PR133 identities. Q2 Cargo/reference/CV1 inputs are not silently mixed into this separate branch. All five copied source-review/input files equal their external originals. Prepared changes are exactly eight paths; all local file links resolve and fences balance. + +Approved inventory SHA256: `a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df`. +Approved appended review SHA256: `caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941`. +Approved protocol SHA256: `212456439c1f52bd340d85b27d52f176efd126d2bd81f8c5fbd82a665d0d55d1`. + +## Driver findings resolved + +The initial wrappers used optimization-sensitive assertions for decisive source/output/receipt guards. Both now use explicit require/RuntimeError. Static AST inspection found zero Assert nodes and in-memory optimize=2 compilation succeeds; neither script was executed. + +The driver now creates its initial journal, logs and native ELF copy exclusively, updates only the same head/start journal, and permits retained executable deduplication only when exact hashes match. Failed child exits are recorded and stop. Unexpected IO/process exceptions cannot reach final PASSED and require a separate disposition; do not resume by overwriting previous evidence. + +The real-packet commands must each report exactly26 tests and bare OK before success, excluding skipped or zero-test results. Committed locked metadata and format steps are explicitly recorded before the unchanged18-command qualifier. Driver self-hash is recorded at startup. Final driver SHA256 is `ff037b2d9d81282f0afd4c815a53a1a9ee9169cbe11002e21b6f3834e370c8e3`; preparation script SHA256 is `e0ae6bc0c1f85f7bd3374851218db70ad61bf43eb3b0072e407ee69279e5f6a7`. + +The proposed fresh target/output, pinned environment, normal/-O real-packet runs, whole no-default library, public projection differential, declared legacy/recording/volume and borrow tests are suitable for the stated boundary. The actual100 intervals per method are a native contract-equivalence test, not fluid-accuracy evidence. Count actual completed top-level tests and explicit artifact-dependent ignores from retained logs afterward; command success or overlapping owner executions are not unique test counts. No default/desktop/release/Lean/model/GUI/performance/physical claim follows. + +Commit the exact approved metadata/protocol before execution, record the resulting actual clean full head/tree, and freeze source plus bound admission files throughout qualification. Preserve failed attempts, actual ELF/log/receipt/archive identities and original owner evidence. Qualifier18 does not execute all140 module behaviors. Outcomes belong in separate source-bound reports; later documentation descendants do not become newly executed sources. + +Only outside-Git receipts were written. No build, test, driver/preparation execution, simulation, model, evaluator campaign, repository/target/ref/PR mutation or blocked public-merge retry occurred. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/later-owner-status-review/review.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/later-owner-status-review/review.json new file mode 100644 index 00000000..34babfb1 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/later-owner-status-review/review.json @@ -0,0 +1,364 @@ +{ + "PR139_source_and_scope": "Frozen numerical b0a9d52; no experiment/test/Cargo/src changes before d857. Source-pinned qualification/independent review support fixed24static CV2 reference PASS,15debug+15release contracts and45evaluator checks; stale pending PR body not treated as final scientific disposition. Owner-attributed only, no new raw/campaign audit.", + "PR140_source_and_scope": { + "changed_selected_paths_vs_PR137": [ + "src/bin/desktop/inspector.rs", + "src/bin/desktop/workflow_inspector_tests.rs", + "src/projection_step.rs", + "src/recording/projection.rs", + "src/recording/projection_tests.rs", + "src/recording/provider.rs", + "src/session/projection.rs", + "src/session/projection_tests.rs" + ], + "core": "4af3802", + "final_delta": "one desktop test API correction", + "independent_source_admission_or_local_acceptance_granted": false, + "observed_head": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "same_selected_count": 140, + "status": "Implemented/Verifying; full qualification pending after retained94pass/1failure refusal-category regression and bounded ingress repair/14focused persistence passes" + }, + "deciding_criteria_preserved": true, + "decision": "APPROVED_EXACT_SIX_DOCUMENT_FOLLOWUP_PATHS", + "findings": [], + "frozen_metadata_sha256": { + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md": "212456439c1f52bd340d85b27d52f176efd126d2bd81f8c5fbd82a665d0d55d1", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json": "26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9" + }, + "local_links": [ + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/integration-20261020.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md#standards-and-composed-design-admission" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md#standards-and-composed-design-admission" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1a-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1-readiness.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#replacement-contract-gates" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#particle-wall-and-equilibrium-gates" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/integration-20261020.md#retained-numerical-evidence-and-selected-route" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1-readiness.md#frozen-first-slice-write-set" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#claim-register" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/mathematics.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/workflow-preview.html" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "issues.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "execution-ledger.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "c1a-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "source-review/readiness-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "source-review/g1-cancel-followup.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "final-admission-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "qualification.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "qualification-186dc0a-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../c1b2-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../g1-advection-cancel-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../g1-advection-cancel-next-readiness.md" + } + ], + "original_eleven_published_review_pins_preserved": true, + "original_review_artifact_sha256": { + "review.json": "d73fb2b4533e716a1d007c9a01e36d8e935cabd68f3097f8c2c47719277b74fd", + "review.md": "b2a4a7b838b91d43e3bcbfc7e01ccbf56affd61bb946658e1b80c26bcdfc7d65" + }, + "pinned_external_links": [ + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/3d2bc4ea76dc71dfbb063afec5059d437f8826ce/docs/audits/general-fluid-20261019/report.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/dfcc693bf8b66678a924e4a92d299127f6746526/docs/plans/fluid-accuracy-composition/q1/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a64d4d3c610d2ea30f2c734e61e86c4bf2bd25c4/docs/plans/fluid-accuracy-composition/p1/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/bc2573f2ba8d51f9f473fb11285b0c26840e4f18/docs/plans/fluid-accuracy-composition/p1-adjoint/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/9d84f66a5bace9be7fd2f44b40c014c692daf099/docs/plans/fluid-accuracy-composition/p1-material/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/9d84f66a5bace9be7fd2f44b40c014c692daf099/docs/plans/fluid-accuracy-composition/p1-material/route-decision.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/dfcc693bf8b66678a924e4a92d299127f6746526/docs/plans/fluid-accuracy-composition/q1/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/9ddf8d2fd860c73bbcc35a077e08099d894db07a/docs/plans/fluid-accuracy-composition/reports/c1b3-protocol.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/d8575238464a5b3f2ea0465bf6da2f71d621413d/docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/d8575238464a5b3f2ea0465bf6da2f71d621413d/docs/plans/fluid-accuracy-composition/q2-cut-solve/independent-review.md" + } + ], + "prepared_document_sha256": { + "docs/plans/fluid-accuracy-composition/execution-ledger.md": "358590b99b8d822ddd15b0ea776c207ef69b92fdc25b900ac27b3e03540f5ffa", + "docs/plans/fluid-accuracy-composition/issues.md": "0c782ed926292f5b74f331d1b0f93469926a794c2ec257475ad77cfcc6400db9", + "docs/plans/fluid-accuracy-composition/plan.md": "aebd70cf22447f6fb15632ea604d97638b72599de4d24c41212b12194bbb147c", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md": "06488dfd8581b8ca9a6079cdb8d9216ff6fb79f8b0e2c346df4e63bd1942c8b2", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md": "7e6a7198d59b3a9ec3c8e0202d9bb24e8ef2e95bfa03b7985c917e0fe5e769be", + "docs/plans/fluid-accuracy-composition/reports/verification.md": "5d4e3454e90d35fa716f6fa3659289da6a3145fbaf4f4666a269c5c63d2f8463" + }, + "published_base_tree": "08afb09322f99a32248017256908ae9c257623d3", + "published_document_base": "1409ab072c54b3c7ff34ff3a09743e33b5fc22f3", + "qualified_source_remains": "186dc0a18f787748eb723d91321e44ffd0e374d5", + "resolved_status_completeness": "Current Q2 milestone/issues/Q-S now explicitly include attributed fixed24-case CV2 conditioning/solve resolution, retaining generic stability/PDE/evolving geometry/production gates.", + "reviewed_primary_document_sha256": { + "9ddf8d2fd860c73bbcc35a077e08099d894db07a:docs/plans/fluid-accuracy-composition/reports/c1b3-protocol.md": "02c29af1a7ba5b8f18f1414422fdf696f8d022b9b912376ee620fa4bca3c30c6", + "d8575238464a5b3f2ea0465bf6da2f71d621413d:docs/plans/fluid-accuracy-composition/q2-cut-solve/independent-review.md": "34a437a5018efe908cf49e3fdfe829fb118e290049b13bd9aaf81625d8b6c477", + "d8575238464a5b3f2ea0465bf6da2f71d621413d:docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md": "31077d62b98a8ecc712cc986cd7ab9a917628b1879ce357c8b41bce82363323e" + }, + "saved_exact_head_observations": { + "pr139.json": { + "head": "d8575238464a5b3f2ea0465bf6da2f71d621413d", + "isDraft": true, + "sha256": "661eb90b9d8373936388ef148c6db964cba6fd4268efce5701316ee0c699a0ea", + "state": "OPEN" + }, + "pr140.json": { + "head": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "isDraft": true, + "sha256": "27ccd167bffe27c7ac1faae2df05e4e4cf05df3e02b02aad15997cbb1e336753", + "state": "OPEN" + } + }, + "schema": "rheon-independent-later-owner-status-document-review-v1", + "scope_limits": [ + "This follow-up changes current status prose only; no source, admission, protocol, compact summary or original result-review bytes changed.", + "Both new owner deliveries excluded from186 and prior fixed stage qualifications; no new lead execution/scientific acceptance inferred.", + "Original condM~6.53e11 and unscaled six square velocity-error failures retained; high-precision80/120digit R1/R2 references are numerical, not certified interval/PDE/physical validation.", + "PR140 has separate implementation authority under its prospective protocol; this report grants no new source admission and does not claim a final local pass.", + "No moving-tip chase, builds/tests/models/evaluator/campaigns/raw-archive audit or repository/ref/PR mutations; only outside-Git review artifacts written." + ], + "working_selected_inputs_unchanged": 140 +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/later-owner-status-review/review.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/later-owner-status-review/review.md new file mode 100644 index 00000000..062a1ceb --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/later-owner-status-review/review.md @@ -0,0 +1,21 @@ +# Independent later-owner status follow-up — 2026-10-20 + +Approved the exact **six documentation paths** over published PR141 head `1409ab072c54b3c7ff34ff3a09743e33b5fc22f3`, tree `08afb09322f99a32248017256908ae9c257623d3`. No unresolved finding remains. [review.json](review.json) retains every file SHA256, exact observed owner heads and inspected primary-document hashes. This is status/documentation approval, not new source admission, scientific qualification or merge authority. + +All original11 reviewed document pins match the published1409 commit. The original readable/machine-readable result review is preserved unchanged. All140 working source identities, bound inventory/review, protocol and compact qualification summary remain fixed. The executed source remains186dc0a; later documentation and owner deliveries do not become executions of that subject. No source map refresh or Q2 Cargo folding occurs. + +## Exact owner facts and deciding scope + +PR139 is pinned to `d8575238464a5b3f2ea0465bf6da2f71d621413d`, numerical freeze `b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. Its source-pinned qualification and independent deciding review report PASS for the fixed24 frozen-domain static CV2 coupled reference steps. They support the attributed15 debug/15 release contracts,45 evaluator checks, and independent80/120-digit R1 exported-target and R2 exact-integral comparisons within the prospective criteria. Experiment/test/Cargo/src bytes do not change between that numerical freeze and d857. The captured PR body still says results pending; the documentation correctly uses the later source-pinned deciding reports, not that stale body paragraph, for the bounded result. + +Original full-mass conditioning near6.53e11 and all six unscaled square-case velocity-accuracy failures remain retained. Passing residuals do not repair those comparator errors; the selected bounded method's separate component-accuracy comparisons are what pass. No coefficient/support/pressure removal, floor, fallback or post-data criterion change is inferred. Generic cut/pressure stability, finer-mesh/PDE convergence, boundary lifting, evolving geometry/transport and production water remain open. The high-precision numerical references are not certified interval enclosures or physical validation. This reviewer read committed reports only and performed no CV2 raw-archive rehash, reconstruction or campaign audit. + +Current Q2 plan, issues and claim-register entries were completed during review to acknowledge this attributed fixed-corpus CV2 resolution while retaining the generic gates. This prevents the canonical current summaries from stopping at the older CV1-only next-solve question. + +PR140 is pinned to `9ddf8d2fd860c73bbcc35a077e08099d894db07a`, core4af3802. The final delta is one desktop-test API line; the selected closure remains140 with exactly eight changed pins versus PR137. The captured body retains the initial94-pass/1-failure foreign-version refusal-category compatibility result, bounded ingress repair and14 focused persistence passes, with full qualification rerunning. The documentation correctly records Implemented/Verifying, not final local or hosted acceptance. Its prospective source-pinned protocol separately records parent-authorized implementation admission; this status report supplies no new source-admission approval. Neither delivery is included in qualified186 or prior fixed-stage receipts. + +## Documentation and limits + +All43 local file links resolve and14 pinned GitHub blob references name existing exact committed targets, including the two CV2 deciding reports and C1-B3 protocol. Markdown fences are balanced; table rows are contiguous; the deciding verification sections remain unchanged. The original failed P1/Q1 evidence, fixed stage source splits, Q2 independent dependency closure and future roadmap remain intact. + +The follow-up is confined to current-status prose. Prior owner runs remain attributed, with no transferred counts or new claim of default/desktop/release, hosted/browser, native-window/performance, learned/model/Lean/GPU or physical acceptance. Public merges remain paused under the existing automatic-review blocker. No moving tips were chased, no implementation or PR action was performed, and no tests, builds, models, simulations, evaluators or campaigns were run. Only outside-Git review artifacts were written. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md new file mode 100644 index 00000000..ae791fef --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md @@ -0,0 +1,132 @@ +# Separate C1-B2 native source admission protocol + +Frozen before fresh execution. This checkpoint retains exact PR136/e56bc7b and its final PR137 +`d3e62377acde6641c8133cf9a9356cc046cfd02a`, tree +`f8be6e0ef85a6a965545b2882bff11500c7f1dfd`, based on fixed PR133/8bf542e. +The integration lead writes only explicit admission/review and qualification +documentation in branch `integration/c1b2-admission-20261020`. Existing +implementation owners retain numerical, Session, provider, SQLite and worker +ownership. No production source edit, model training, user-data mutation or merge +is part of this checkpoint. + +## Exact subject and decision + +The [original complete-source review](source-review/readiness-review.md), +[exact three-pin repair follow-up](source-review/g1-cancel-followup.md), +[original all-path receipt](source-review/readiness-review.json), +[final map/repair receipt](source-review/g1-cancel-followup.json) and +[review input](source-review/source-map-review-input.json) cover 140 regular, +nonsymlink selected inputs: five added, eleven changed, 124 exact reused, none +removed versus fixed PR133. Canonical sorted compact map SHA256: +`08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6`. +The follow-up reviews exactly three changes relative to PR136: configured Session +cancellation matcher and workflow recording/desktop tests. All 137 other +identities remain exact. All working and committed blobs match the reviewed map. Cargo, prior package +identities, toolchain, selector, checker, oracle, qualifier and packet guards +remain unchanged. There are no Q2 Cargo or later CV1 inputs in this stage. + +The existing explicit v3 mechanism is sufficient. Retain its base/schema, +immutable primary ancestry/tree, exact v1/v2 predecessors, refusal behavior and +every prior bound-review byte. Explicitly materialize the already independently +reviewed complete map and append the decision, binding its digest in the active +inventory. Commit these together before any qualification; freeze them thereafter. +This is permission to attempt qualification, not acceptance from changed hashes. +The expected old 135-map refusal is retained outside Git. + +PR136 adds the closed immutable BuiltinNativeV1 invocation and typed attempt +contract at the existing Session/Liquid publication owner. It uses actual native +provisional faces/shortened dt, the original pressure/correction kernel and B1 +pressure/velocity qualification; downstream gates and original atomic commit +remain. RPS1/RPP1/RPT1 add cold custody through existing SQLite, with complete +16KiB metadata limits and explicit accepted-unrecorded tails. Mixed witness +fallback refuses publication truthfully. Desktop/comparison refuse the new +profile; there is no new graph UI or arbitrary/stateful/external provider. + +PR137's three production match-arm lines recognize actual configured-Session +advection cancellation as Cancelled, preserving no-publication behavior, true +numerical Failed outcomes and explicit historical archive labels. Its tested +source is `70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52`; final d3e6237 adds reports +only. The four added tests cover live/cold velocity/tracer cancellation before +and after acceptance, unchanged state/receipt, retry and actual pressure failure. +The defect remains historical in fixed 9c/9a; no old receipt is reinterpreted. +Owner qualification reports 226 passing executions and five existing ignores, +with strict checks and three independent reviews; fresh lead qualification is +still required. This is source-bound receipt repair, not new solver semantics. + +## Prospective execution + +After independent final metadata/protocol review, commit cleanly and record its +actual full head/tree, all committed source hashes and environment. Do not guess +the commit identity in advance. Use pinned Rust/Cargo 1.92.0 and actual Python +3.12; record exact installed patch/host. Normal Python clears ambient +optimization, bytecode writes are disabled. Use jobs 2, incremental 0 and dev/test +debug information 0 while retaining default opt-level 0 and debug assertions. + +Use a previously absent external Cargo target +`/workspace/rheon-c1b2-admission-20261020-build` and fresh external evidence +directories under `/workspace/rheon-c1b2-admission-20261020-evidence`. +The lead's old reconstructible 9c build cache was retired only after verifying +its retained actual ELF and raw archive hashes/CRC; all original evidence, +source worktrees, the Q2 build cache and other owners' resources remain. +That resource disposition is retained separately outside Git. + +Run the unchanged source admission checker, formatting and locked metadata, then +`python3 tools/qualify_aligned_strain.py NEW_OUTPUT_DIR`. All 18 existing native +qualifier commands must pass, including locked native contracts/build and strict +Clippy in their declared scope, five actual native/rational/adversarial specimens +and normal/optimized gate/oracle tests. No allow-dirty, receipt transfer, hidden +retry, skipped admission or numerical tolerance change is permitted. + +Generate a new real packet with the newly built executable and fresh primary +receipt through docs/education/aligned_strain_packet.py. With RHEON_ALIGNED_PACKET +set to that packet, run its unittest suite normally and under `-O`. Require all +26 in each mode with no packet-dependent skips and exact four-file roster. + +Run these separately recorded locked no-default checks on that same source: + +- `cargo test --locked --no-default-features --lib`: actual new B2 and existing + workflow/native-family/composition library contracts together; count actual + completed results, never filtered tests. +- `cargo test --locked --no-default-features --test projection_session_contract -- --nocapture`: + exact actual native substitution differential, 100 accepted intervals for each + of the two methods, plus the supplied B2 public-contract fixtures. This is + bitwise contract equivalence with the original Session, not new fluid accuracy. +- Existing recording_contract, recording_provider_contract, + recording_provider_runtime_contract, configured_provider_session_contract, + provider_step_contract, solver_provider_contract, pressure_session_contract, + recording_comparison_contract, liquid_volume_contract and + liquid_volume_periodic_contract test targets in a single locked no-default run. + Existing explicit artifact-dependent ignores remain unavailable and must be + counted; never count them as pass or learned/runtime acceptance. +- `cargo test --locked --no-default-features --doc`: existing borrow contracts. + +Retain each exact command, environment, start/end, exit, output, subject and actual +executed ELF hashes. Failed attempts remain evidence; stop for disposition rather +than changing criteria or guessing a new formulation. The unchanged qualifier +does not establish behavior of all 140 modules. No fresh full default/desktop, +release, native-window, performance, Lean, model/GPU or physical gate is selected. +Owner core634404e/consumera6e76a9 B2 results and PR137/70da36d repair results +retain their original source splits and raw-evidence custody; this lead run does +not relabel the owner's 213 or 226 overlapping test executions. + +## Outcome custody and handoff + +Keep actual new ELF, receipts, packet, command logs, complete source bindings and +reviews outside Git. Seal their byte hashes into a raw archive and compact +committed manifest, retaining original failures/archives. Save the raw evidence +through the established Library custody path when available. Have an independent +reviewer verify execution/count/source/ELF/archive bindings without duplicate +execution. Put results in a separate report; do not edit this protocol, inventory +or bound review after qualification. + +Publication is a separately reviewed documentation descendant, preserving the +actual executed head in every receipt. Validate trusted_primary and the real +packet on that descendant, commit/push without changing the original Git config, +and open a dependent draft review on PR137's fix/g1-advection-cancel-20261020 branch. Recheck original worktrees, +six local heads, PR59, fixed PR133 and Q2 PR138. Public merge actions remain paused +by the repeated PR121 automatic approval rejection; no alternate path is used. + +Full C1-B/C/C1-R, arbitrary provider transactions/replay, whole-family/transfer, +optional viscosity, scientific/physical accuracy and hosted integration remain +separate gates. Keep grid qualification first, future particle solver plus output +surface reconstruction second, later Lagrangian material-mesh family third. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.json new file mode 100644 index 00000000..b981e960 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.json @@ -0,0 +1,158 @@ +{ + "schema": "rheon-c1b2-qualification-final-independent-audit-v1", + "status": "APPROVED_EXACT_EXECUTED_RECEIPTS_AND_BOUNDED_COUNTS", + "reviewed_at_utc": "2026-10-20T04:26:57.557336+00:00", + "executed_source_head": "186dc0a18f787748eb723d91321e44ffd0e374d5", + "executed_source_tree": "3c19a1c1f4a549c782d619145a841a0b43abedac", + "executed_driver_clean_before_after": true, + "all_tracked_committed_source_hashes_verified": 1464, + "preliminary_all1464_working_clean_verified": true, + "current_working_selected140_verified": true, + "current_result_status_document_delta": [ + "docs/plans/fluid-accuracy-composition/execution-ledger.md", + "docs/plans/fluid-accuracy-composition/issues.md", + "docs/plans/fluid-accuracy-composition/plan.md", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "docs/plans/fluid-accuracy-composition/reports/verification.md" + ], + "selected_count": 140, + "selected_map_sha256": "08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6", + "selected_disposition": { + "count": 140, + "added": 5, + "changed": 11, + "unchanged": 124, + "removed": 0, + "map_sha256": "08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6" + }, + "admission_inventory_sha256": "a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df", + "bound_review_sha256": "caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941", + "driver_sha256": "ff037b2d9d81282f0afd4c815a53a1a9ee9169cbe11002e21b6f3834e370c8e3", + "summary_sha256": "26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9", + "native_receipt_sha256": "a2e84952172519a8184262b8b877b1a74248ba1f4b3b2b986dc910831b7a9b00", + "top_level_commands_passed": 11, + "native_qualifier_commands_passed": 18, + "native_rust_passes": 35, + "native_rational_specimens": 5, + "packet_normal": 26, + "packet_optimized": 26, + "packet_skipped": 0, + "gate_tests_per_mode": 5, + "oracle_tests_per_mode": 10, + "focused_passed": 213, + "focused_failed": 0, + "focused_existing_ignored": 3, + "focused_unique_target_test_entries": 213, + "native_plus_focused_unique_target_test_entries": 248, + "workflow_within_library": 26, + "focused_log_counts": { + "native-qualified-v1/rust-contracts.log": { + "passed": 35, + "failed": 0, + "ignored": 0, + "runtime_harnesses": [ + "tests/aligned_strain_contract.rs", + "tests/obstacle_flow_contract.rs", + "tests/static_obstacle_contract.rs", + "examples/aligned_strain.rs" + ] + }, + "focused-complete-library.log": { + "passed": 85, + "failed": 0, + "ignored": 0, + "runtime_harnesses": [ + "src/lib.rs" + ] + }, + "focused-projection-session.log": { + "passed": 3, + "failed": 0, + "ignored": 0, + "runtime_harnesses": [ + "tests/projection_session_contract.rs" + ] + }, + "focused-legacy-recording-volume.log": { + "passed": 122, + "failed": 0, + "ignored": 3, + "runtime_harnesses": [ + "tests/configured_provider_session_contract.rs", + "tests/liquid_volume_contract.rs", + "tests/liquid_volume_periodic_contract.rs", + "tests/pressure_session_contract.rs", + "tests/provider_step_contract.rs", + "tests/recording_comparison_contract.rs", + "tests/recording_contract.rs", + "tests/recording_provider_contract.rs", + "tests/recording_provider_runtime_contract.rs", + "tests/solver_provider_contract.rs" + ] + }, + "borrow-doctests.log": { + "passed": 3, + "failed": 0, + "ignored": 0, + "runtime_harnesses": [ + "doctests:rheon" + ] + } + }, + "ignored_test_names": [ + [ + "tests/pressure_session_contract.rs", + "frozen_model_selection_and_unsupported_domain_fallback_are_visible" + ], + [ + "tests/provider_step_contract.rs", + "real_model_advances_production_session_for_twenty_four_intervals" + ], + [ + "tests/solver_provider_contract.rs", + "real_checkpoint_support_replay_and_corruption" + ] + ], + "actual_B2_substitutions": { + "per_method": 100, + "methods": 2, + "total": 200, + "suite_elapsed_seconds": 100.22, + "basis": "Committed differential test loops both actual native methods; actual3/3public suite completed normally." + }, + "native_artifacts_hashed": 28, + "all_evidence_files_hashed": 98, + "native_built_and_retained_ELF_sha256": "f51e8653f2b44019e8622ee316dc665c2c3434de57efe0871e506ccd38bbf51e", + "distinct_actual_retained_ELFs": 17, + "ELF_custody": "12 focused harnesses+4native contract harnesses (example harness executes2tests)+1native executable;3compile-faildoctests have no runtimeELF", + "archive": { + "path": "/workspace/rheon-c1b2-stage-186dc0a.zip", + "bytes": 27323913, + "sha256": "6538e3c27bc75ba41d3bb5ed7894e4eb6a1598fbea5cc3fc77bf03137f6be35b", + "entries": 98 + }, + "archive_members_CRC_and_exactbytes_verified": 98, + "archive_library_fivefields": { + "library_file_id": "libfile_13c2351bbe1c8191b19649480d4beeec", + "file_id": "file_00000000088481f5ac57f8b3ba159812", + "path": "/rheon-c1b2-stage-186dc0a.zip", + "current_version_number": 0, + "file_name": "rheon-c1b2-stage-186dc0a.zip" + }, + "local_archive_xattrs": { + "user.library-file-version": "0", + "user.library-file-id": "libfile_13c2351bbe1c8191b19649480d4beeec" + }, + "library_scope": "Owner five-field Library receipt and local bytes/xattrs observed; no independent remote Library download/authentication claim.", + "findings": [], + "scope_limits": [ + "213focused=85library+3publicB2+122legacy/volume+3compile-faildoctests;122=99eightlegacy+23volume. Workflow26subsetof85; noadditiveoverlap.35nativeRusttargets disjoint fromdeclaredfocusedtargets.", + "Three existing artifact/model ignores remain ignored; no measuredcheckpoint or modal-model execution is claimed inthisrun.", + "Current G1 typed cancellation controls passed; historical9c/9a/e56 and original Failed archives retainoriginalmeaning. Full G1-C and all140 behavioral acceptance do notfollow fromthisrecipe.", + "Native qualifierClippyscopeisexactcommand; nofreshdesktop/default/release/nativewindow/performance/scientific/physical/model/GPU/Leanacceptance.", + "Owner historical213/226executions and unavailableownerrawarchives remain source-attributed; nottransferred tothisleadexecution.", + "Independent Q2 Cargo/reference/CV1 stage remains excluded; nofuturecombinedsourcequalification. FullC1-B/C/R,B3/stateful/externaltransactions,whole-family/transferremainunaccepted.", + "Only external review artifacts written; no duplicate builds/tests/campaigns/source/metadata/ref/PRmutations or merge/publication retries.", + "Integrity/custody hashes are not authentication or bit reproducibility." + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.md new file mode 100644 index 00000000..9398ba13 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.md @@ -0,0 +1,17 @@ +# C1-B2 fresh qualification — independent evidence audit + +**Approved exact executed receipts and bounded counts; no material finding.** This approves the evidence at clean `186dc0a18f787748eb723d91321e44ffd0e374d5`, tree `3c19a1c1f4a549c782d619145a841a0b43abedac`, without conferring hosted/merge or broader implementation acceptance. + +Verified all1464 tracked working and committed hashes, the complete140-source map `08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6`, frozen inventory `a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df`, bound review `caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941` and driver. All11top-level commands completed successfully. The executing driver recorded a clean unchanged source before/after execution; preliminary audit independently confirmed all1464 working bytes then. Lead subsequently began docs-only result/status changes: current committed186blobs and all140 working selected inputs remain exact; later document edits are not the execution subject. + +The unchanged native qualifier completed18commands,35Rust contracts and5native/rational specimens; all28artifact hashes match. Guard tests passed5per mode; oracle tests10per mode. The freshly generated actual native packet binds the same source, ELF and primary receipt;26normal and26optimized packet tests ran without skips. + +Fresh focused contracts passed **213 =85library+3publicB2+122legacy/volume+3compile-faildoctests**, with0failures and3existing artifact/model ignores. The122 comprise99eightlegacy targets and23volume tests;26workflow entries are included in85. Target/name accounting establishes213distinct focused entries and35distinct native-contract entries in this recipe, not additional owner execution. The actual100-interval differential for each of two native methods completed normally (public suite100.22s), totaling200substituted intervals; this is equivalence evidence, not physical accuracy. + +All98evidence-file hashes and98ZIP members, safe paths, exact member bytes and CRCs were checked. Archive `/workspace/rheon-c1b2-stage-186dc0a.zip` is27,323,913bytes, SHA256 `6538e3c27bc75ba41d3bb5ed7894e4eb6a1598fbea5cc3fc77bf03137f6be35b`. Verified17distinct actual retained ELFcontents:12focused harnesses,4native contract harnesses includingthe2-testexample, and the native executable. Three compile-fail doctests have no runtime ELF. Native built/copy SHA256 is `f51e8653f2b44019e8622ee316dc665c2c3434de57efe0871e506ccd38bbf51e`. + +Owner Library five-field receipt/local bytes and xattrs were inspected; no independent remote Library retrieval or authenticity claim. The archive deliberately precedes and excludes the final summary/Library metadata, avoiding self-reference; the final summary hash is `26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9`. + +Current typed G1 cancellation controls passed, while historical9c/9a/e56 and old Failed archives keep their original meaning. The3artifact/model ignores remain unexecuted; owner213/226 runs and unavailable owner archives are not transferred to this subject. Finite aligned-strain algebra, native/rational/packet and declared no-default contracts do not establish complete140 behavioral coverage, fullC1-B/C/R/B3, Q2composition, hosted/default/desktop/native-window/release/performance/physical/model/GPU/Lean acceptance. Digests establish byte custody, not authentication or bit reproducibility. + +No builds, tests, campaigns, repository/ref/PR changes or publication/merge retries were performed by this reviewer. The [machine-readable report](qualification-186dc0a-review.json) records exact counts, ignores, source and artifact bindings. Preliminary review files remain preserved. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json new file mode 100644 index 00000000..c724a127 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json @@ -0,0 +1,197 @@ +{ + "schema": "rheon-c1b2-native-admission-qualification-v1", + "status": "passed-scoped-local-qualification-hosted-pending", + "source_head": "186dc0a18f787748eb723d91321e44ffd0e374d5", + "source_tree": "3c19a1c1f4a549c782d619145a841a0b43abedac", + "clean": true, + "source_file_count": 1464, + "retained_owner_heads": { + "136": "e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4", + "137": "d3e62377acde6641c8133cf9a9356cc046cfd02a" + }, + "fixed_prior_stage": { + "133": "8bf542eddd8198008b6d77d52e009e9384998f18", + "qualified_source": "9c04278e6cdd44418628c35f944c1730cbe6173e", + "unchanged": true + }, + "separate_Q2_stage": { + "138": "a6bfcc94481b1bafbe61be804a1abc3426927bbd", + "qualified_source": "9a9904f3c6f0f96cbe2af9210a0c578f825ccee0", + "unchanged_and_excluded_inputs": true + }, + "selected_native": { + "count": 140, + "added": 5, + "changed": 11, + "unchanged": 124, + "removed": 0, + "map_sha256": "08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6" + }, + "admission_inventory_sha256": "a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df", + "bound_review_sha256": "caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941", + "native_qualification": { + "commands": 18, + "rust_tests": 35, + "specimens": 5, + "gate_tests_normal": 5, + "gate_tests_optimized": 5, + "oracle_tests_normal": 10, + "oracle_tests_optimized": 10, + "receipt_sha256": "a2e84952172519a8184262b8b877b1a74248ba1f4b3b2b986dc910831b7a9b00", + "executable_sha256": "f51e8653f2b44019e8622ee316dc665c2c3434de57efe0871e506ccd38bbf51e", + "lean_checked": false + }, + "packet": { + "normal": 26, + "optimized": 26, + "skipped": 0, + "artifacts_sha256": { + "data.json": "b031740719c8918e9ccb88e24b2fb249d990f2d6975d2b0832cee0d1428b25b4", + "qualification.json": "61ca02a2596dc39157fd619a9e3ae47f33ea391b71575ad91c1c26c86fc8ffe7", + "native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "primary-qualification.json": "a2e84952172519a8184262b8b877b1a74248ba1f4b3b2b986dc910831b7a9b00" + } + }, + "focused": { + "counts": { + "focused-complete-library": 85, + "focused-projection-session": 3, + "focused-legacy-recording-volume": 122, + "borrow-doctests": 3 + }, + "passed": 213, + "failed": 0, + "ignored_existing_artifact_dependent": 3, + "workflow_within_library": 26, + "actual_projection_substitutions_per_method": 100, + "methods": 2, + "actual_total_projection_substitutions": 200, + "projection_suite_seconds": 100.22 + }, + "retained_executables": { + "focused": 12, + "native_contract": 4, + "native_example": 1, + "borrow_compile_fail_no_runtime_ELF": 3 + }, + "archive": { + "path": "/workspace/rheon-c1b2-stage-186dc0a.zip", + "bytes": 27323913, + "sha256": "6538e3c27bc75ba41d3bb5ed7894e4eb6a1598fbea5cc3fc77bf03137f6be35b", + "entries": 98, + "library": { + "library_file_id": "libfile_13c2351bbe1c8191b19649480d4beeec", + "file_id": "file_00000000088481f5ac57f8b3ba159812", + "path": "/rheon-c1b2-stage-186dc0a.zip", + "current_version_number": 0, + "file_name": "rheon-c1b2-stage-186dc0a.zip" + } + }, + "evidence_files_sha256": { + "aligned-strain-native-executable": "f51e8653f2b44019e8622ee316dc665c2c3434de57efe0871e506ccd38bbf51e", + "ambient-compiler-overrides.json": "00d08ffa5160acc679262dfb1bfb9d51002d76832c8fb91abcd936bb32586efd", + "borrow-doctests.log": "d32167d991975f13b661dfe548be0a4acc935250f9d27c0fcc4e85d51a98b351", + "cache-resource-disposition-q2.json": "38318698b6401ee3c2f2f47e18c1364ddbeecdb4143924806b0059a21ee2306f", + "cache-resource-disposition.json": "58a471dfac7db1746bc4fe10a38a65786cdf5f74da6528cf0784f422ef9ace35", + "committed-admission-check.log": "469433dec23c77026641634e33248a6486083fdf5557f43b50af74a65d029fb6", + "committed-format-check.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "committed-locked-metadata.log": "0c4a2478199f32bac3f2e457a23ce5fcc1e65cc8457da9dfc236f6275d851704", + "complete-source-review-input.json": "46ecf09aa2b44f444fb03e15b5ec429bd4a2b63f82e9af9de749c538bf1100e2", + "document-preflight/0.html": "e6df7ab4628a74923f782bb54f5be7493715859cf69d2ea513c7f8ecb26a4e83", + "document-preflight/2.html": "6ae38b406336b212b79ad28d9cdebbc347346e0e3fa5b9c02b188fc6eae22819", + "document-preflight/4.html": "fa79010ecfc112754d302d8749af9c294e46fde92b937c8d3987524b5a37feeb", + "document-preflight/6.html": "afe6ec8dbfcdf9c147d6120d30bae118937d86b16dd344abcd4b13f1b9329de2", + "document-preflight/receipt.json": "305fcaa47feca43bc75636e6fb73d0d4f433d961441cf14626696a5bbaa12754", + "execution-context.json": "d4472782a37325ada1511051dba92e986167812dc6f5e6712538124430701fca", + "final-admission-review/audit.py": "40e946d8990b0f1a9d83c9ddc298e5bc6516ad1e9406b83456e4fc8380660331", + "final-admission-review/review.json": "51196f9321e5de4f20298a21acb7edb038485ea5da0e9c4592eac3a88ce2a54f", + "final-admission-review/review.md": "1b397ce3117a434782c1f432f2a92df74d12ee53187cf4cfe32c33532976058b", + "focused-complete-library.log": "115a2c05646e01eb77dc40c3502ee8af8b9fbcc7a5ee3120f18b848ba80794c3", + "focused-legacy-recording-volume.log": "c278b0f9a94ed08158665eca698a4f100e89ec62e457379fa7b2c17b319d1a34", + "focused-projection-session.log": "f4680111c310bed1dabfadd1b758d30caeb75f323e06786c4c2b5bac23e06a5f", + "frozen-admission-bindings.json": "f03c048ca80af1304d13f0d0ef644743fcd63d3bb653911c3e2521285eae7a7a", + "native-contract-executables.json": "f166655fd3bda161928e4188b984aa5661877b9e37546969811607c0e683ff34", + "native-qualified-v1/format.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/large-origin-nonmidpoint-oracle-comparison.log": "419e3847307e1fcdf095f888f395c2efcd5dd9fd037e9ced47d794366f6c794f", + "native-qualified-v1/large-origin-nonmidpoint-oracle-summary.json": "419e3847307e1fcdf095f888f395c2efcd5dd9fd037e9ced47d794366f6c794f", + "native-qualified-v1/large-origin-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/large-origin-nonmidpoint.tsv": "38405a03996ba2be5dc952b85b1d7e0b0e7df4d115e30b9bdfe14852e55c3628", + "native-qualified-v1/native-oracle-comparison.log": "b552489fc8d1753c036d1dfdaebed071b10f3c1149a73dbae8a5f897e4088580", + "native-qualified-v1/native-oracle-summary.json": "b552489fc8d1753c036d1dfdaebed071b10f3c1149a73dbae8a5f897e4088580", + "native-qualified-v1/native-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/native.tsv": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45", + "native-qualified-v1/oracle-tests-optimized.log": "2185b78d550bebd66d8ce0495450ef8a265910903a2b4d4c354ac0f7dbeb830a", + "native-qualified-v1/oracle-tests.log": "9689c5b44ef3745955f61ae142a4d57fa5cc1bee6ebb9a1ca7208c3e0fa00718", + "native-qualified-v1/qualification-gate-tests-optimized.log": "6985ff44a60f0d599808de14dad064493ee2f961fa4aa8c2403b2bf1ccfb233c", + "native-qualified-v1/qualification-gate-tests.log": "53086c388c616cde98c65ddb1272b434840595474480d9f29eb2a82e4fed4e08", + "native-qualified-v1/qualification.json": "a2e84952172519a8184262b8b877b1a74248ba1f4b3b2b986dc910831b7a9b00", + "native-qualified-v1/reflected-anisotropic-oracle-comparison.log": "57bc34e6f3f64efc7550ce73dbcb8dc6bbf09773e1410e174938d4b9a80c1ade", + "native-qualified-v1/reflected-anisotropic-oracle-summary.json": "57bc34e6f3f64efc7550ce73dbcb8dc6bbf09773e1410e174938d4b9a80c1ade", + "native-qualified-v1/reflected-anisotropic-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/reflected-anisotropic.tsv": "04821a0128a562dc796b5ec369e552eff2b867d09c55a7d1333cdfb35048b4d3", + "native-qualified-v1/represented-nonmidpoint-oracle-comparison.log": "68db292d29458ee6455cf9f771125b839b718087219edc164e8c19985545c70e", + "native-qualified-v1/represented-nonmidpoint-oracle-summary.json": "68db292d29458ee6455cf9f771125b839b718087219edc164e8c19985545c70e", + "native-qualified-v1/represented-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/represented-nonmidpoint.tsv": "c7eed9042d4806d437a573ddae91817c692c8cbd77b32e2df296b0e0b38d96f2", + "native-qualified-v1/rust-build.log": "b56be42b8c5339e294dbacc39e947a8ca8d870993a3b0366a6f780244d464061", + "native-qualified-v1/rust-clippy.log": "41685bcba84965fa49a1fe34dfbe2732e9c952bd3fbdf61ac55b7f71714f9db5", + "native-qualified-v1/rust-contracts.log": "04f67c0ee39c9cf8c994f7059a11c5d3ef404d9b77525fab90bc4e6f06221925", + "native-qualified-v1/unit-center-cube-oracle-comparison.log": "1308d2f46cdd4f7ced9e5e779cdbef9bd6a075b20a018ed1e5c521e4b30d9fd3", + "native-qualified-v1/unit-center-cube-oracle-summary.json": "1308d2f46cdd4f7ced9e5e779cdbef9bd6a075b20a018ed1e5c521e4b30d9fd3", + "native-qualified-v1/unit-center-cube-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/unit-center-cube.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "native-qualifier-driver.log": "22d811f357fce9172d94bc426a4dda5ed8e4bffa8d2c3b9fc3b38872a35ec6dd", + "packet-create.log": "600128dd750ad0ce44fccb58a7e0b3889c113c1d363e4406c25236d4d616c047", + "packet-tests-normal.log": "72fb7b8d5d695f4a00bc52d618a038382b6407e7e293fd7b3261ae1fe762e52d", + "packet-tests-optimized.log": "d6a195555a2cd19e17900889e4fecc955b5e84ede38969b427d23320f70bff20", + "packet-v1/data.json": "b031740719c8918e9ccb88e24b2fb249d990f2d6975d2b0832cee0d1428b25b4", + "packet-v1/native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "packet-v1/primary-qualification.json": "a2e84952172519a8184262b8b877b1a74248ba1f4b3b2b986dc910831b7a9b00", + "packet-v1/qualification.json": "61ca02a2596dc39157fd619a9e3ae47f33ea391b71575ad91c1c26c86fc8ffe7", + "pr136-complete-source-review-input.json": "65bc04e25ebfca148f11ef0b7b4435c31c0a978500c229235b5c06d1eca7af6f", + "pre-admission-expected-refusal.stderr": "c1df4c8bb0c2eb605b803033e3b33a92ced50219d906cd00211b4fc4b408ee86", + "pre-admission-expected-refusal.stdout": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "preflight/cargo.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "preflight/cargo.stdout": "eb24d517cda02ee331f0f23f3da8150456969a12bcd3f07b531c45a44f67d9aa", + "preflight/fmt.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "preflight/fmt.stdout": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "preflight/metadata.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "preflight/metadata.stdout": "c0f7ce5e10b6006a9cdb40567ad48e2c94e734de38739e0845ca365197bcdba7", + "preflight/python.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "preflight/python.stdout": "4c3569f5da09975434dd9fd9a91fadbc4367a91d8f3c3fab59e9241ab9ee4bd8", + "preflight/receipt.json": "29c9b6451c486e22716544aee32da1aa9eea1b3e8f1c342a2dd5f802a8e57933", + "preflight/rustc.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "preflight/rustc.stdout": "8f97c91e920ce0d02680e3d01eb87afa0c77290dcd5d19eb901ae194d4700d90", + "qualified-executables/44a52ba4b02076b89b3bdcce070df489cf8ac6bd84827d6f2d4536b0e5a7e01b-recording_comparison_contract-205af27e4f04bdad": "44a52ba4b02076b89b3bdcce070df489cf8ac6bd84827d6f2d4536b0e5a7e01b", + "qualified-executables/74b99550c1acef3291d5bf8663dbb666b55a3ec0a7871d9fbdbd79bb76c46fe7-configured_provider_session_contract-18899f217e5c3858": "74b99550c1acef3291d5bf8663dbb666b55a3ec0a7871d9fbdbd79bb76c46fe7", + "qualified-executables/8281da35718c52e0c68e734ec19b73138c5e62227ba162e3522fd48d0b118950-recording_provider_contract-4563aa0dbc51be38": "8281da35718c52e0c68e734ec19b73138c5e62227ba162e3522fd48d0b118950", + "qualified-executables/a14841104a01c765d72f6f3d6e01680bb2cf92c2fa2343ebc010f7648f923ad4-rheon-a429e726eb179735": "a14841104a01c765d72f6f3d6e01680bb2cf92c2fa2343ebc010f7648f923ad4", + "qualified-executables/a4390dd6b8e350e9090da0704a2a973adf2b9a573195cc9b93a2a9f8dfa3181a-liquid_volume_contract-feec3ae32dcbefe5": "a4390dd6b8e350e9090da0704a2a973adf2b9a573195cc9b93a2a9f8dfa3181a", + "qualified-executables/b295cd330d4cdf169ab846194354531dc80f502a322822b9a5a876ceb31500dd-pressure_session_contract-e18df0f878334b98": "b295cd330d4cdf169ab846194354531dc80f502a322822b9a5a876ceb31500dd", + "qualified-executables/b519402e5ab9f51ced4b1611b77bb4818fcd5d3e09c71552e21d64e0551f16c4-recording_contract-db2765a72a4388d0": "b519402e5ab9f51ced4b1611b77bb4818fcd5d3e09c71552e21d64e0551f16c4", + "qualified-executables/baf1bff49a118c9f12132ab272bc8e07fe9516bde8a48e7a552fbdbf307f9cfb-liquid_volume_periodic_contract-09940e33b41d83b5": "baf1bff49a118c9f12132ab272bc8e07fe9516bde8a48e7a552fbdbf307f9cfb", + "qualified-executables/c4d6b35923c08abed85ab0f088c53c7a9c76fd39c322e6229249b362821b62e1-solver_provider_contract-c6be55ff3e264ba9": "c4d6b35923c08abed85ab0f088c53c7a9c76fd39c322e6229249b362821b62e1", + "qualified-executables/d0f6ed6ed51f8c0ae8db26f0fccdbdc57b6be4d72962798390e8b2967f593705-provider_step_contract-952a7149c0ec5a53": "d0f6ed6ed51f8c0ae8db26f0fccdbdc57b6be4d72962798390e8b2967f593705", + "qualified-executables/f3f74f6c029c032539ae069605a87b0e8cf83a56356bde1bf5d188da878b148c-projection_session_contract-99cd44f78c569f0c": "f3f74f6c029c032539ae069605a87b0e8cf83a56356bde1bf5d188da878b148c", + "qualified-executables/fd2ae3c9fbceb5ae135ea57e14c65abc702c17cc580c762937bba49afd368081-recording_provider_runtime_contract-5507579fbf15a50a": "fd2ae3c9fbceb5ae135ea57e14c65abc702c17cc580c762937bba49afd368081", + "qualified-native-contract-executables/464f3f29d74a90aba7fcb871746e37d1dbdf0147d6110dfe8be8c58a1b3d34c7-static_obstacle_contract-b0d0ccb0b94e567b": "464f3f29d74a90aba7fcb871746e37d1dbdf0147d6110dfe8be8c58a1b3d34c7", + "qualified-native-contract-executables/7e33f5b1a454a72a3b4b6177851613727d262214e1ae197799a5f8beef02a01a-obstacle_flow_contract-960c9dc0be44c2f9": "7e33f5b1a454a72a3b4b6177851613727d262214e1ae197799a5f8beef02a01a", + "qualified-native-contract-executables/7ffcf5aec558d0ce91a3dfc57c304623b928d6387c80ddef4e70a8e1ec19c305-aligned_strain-e0c34e514a40a128": "7ffcf5aec558d0ce91a3dfc57c304623b928d6387c80ddef4e70a8e1ec19c305", + "qualified-native-contract-executables/da96c6b16a49ff23ba43507b933ac24d7dcc987681c6fac3eb2d65236163d2e8-aligned_strain_contract-2260b287e32432c2": "da96c6b16a49ff23ba43507b933ac24d7dcc987681c6fac3eb2d65236163d2e8", + "run-fresh-qualification.py": "ff037b2d9d81282f0afd4c815a53a1a9ee9169cbe11002e21b6f3834e370c8e3", + "superseded-pr136-only-preparation/disposition.json": "f6bc169219fead0d0d4eee79d016f4f0e4103e36a74df551d4bc3eecb775e842", + "superseded-pr136-only-preparation/docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "df8a7d34d635c1387029980bf1eb0004bd58c7e9e5612b88ca121865e4c4583b", + "superseded-pr136-only-preparation/docs/education/aligned-strain-native-sources-integration-20261014.json": "75b822776a7d0ceb2866979e3364a2a8eaf7eff06b8035df098bef8d1a8a3885", + "superseded-pr136-only-preparation/draft-report/protocol.md": "e60b0aa4ebf77b2822c621f6010012c6205c206dd2802ca740c857c44769dfcd", + "superseded-pr136-only-preparation/draft-report/source-review/readiness-review.json": "aa789ea2b34a51fc38292f15c8cc3147d2a3e6ec2ed952c0130031e7f2908f21", + "superseded-pr136-only-preparation/draft-report/source-review/readiness-review.md": "ecc88ca5532256e4c49ad1d5ba7c55558550f72fb2c2474154cbe493423880d6", + "superseded-pr136-only-preparation/draft-report/source-review/source-map-review-input.json": "65bc04e25ebfca148f11ef0b7b4435c31c0a978500c229235b5c06d1eca7af6f" + }, + "scope_limits": [ + "No new physical/scientific/default/desktop/release/native-window/performance/model/Lean/GPU qualification.", + "Old9c/9a G1 defect remains historical; current matcher fixes only classification, not numerical publication or old archive meanings.", + "Owner213/226 execution results retain their original source and raw archive custody; not relabelled.", + "FullC1-B/C/R, B3producerselection, stateful/external transactions and whole-family transfers remain unaccepted.", + "Independent Q2 Cargo/reference/CV1 inputs are absent; no source receipt transfers to future combined composition." + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md new file mode 100644 index 00000000..f062aac3 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md @@ -0,0 +1,153 @@ +# Closed native projection and cancellation stage qualification + +Fresh scoped qualification passed on clean +**`186dc0a18f787748eb723d91321e44ffd0e374d5`**, tree +`3c19a1c1f4a549c782d619145a841a0b43abedac`. This separately qualifies +PR136's closed native Session/custody path plus final PR137's cancellation-label +repair. Fixed PR133/8bf542e and Q2 PR138/a6bfcc9 remain unchanged; their actual +executions stay at 9c04278 and 9a9904f. This stage excludes Q2's changed Cargo +inputs and all later reference/CV1 source. + +## Exact source and admission + +The staged source retains exact PR136 +`e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4` and final PR137 +`d3e62377acde6641c8133cf9a9356cc046cfd02a`. Their tested sources remain +core634404e/consumera6e76a9 and `70da36d`, respectively. The +[original complete-source review](source-review/readiness-review.md), +[three-pin follow-up](source-review/g1-cancel-followup.md) and +[final admission review](final-admission-review.md) approve all **140 inputs: +5 added, 11 changed, 124 unchanged, 0 removed** versus fixed PR133. +Exactly three selected identities change after PR136; 137 remain exact. + +Canonical sorted compact map SHA256: +`08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6`. +Inventory SHA256: +`a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df`. +Bound review SHA256: +`caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941`. +Prior 9e583 review bytes remain an exact prefix. Existing v3 base/schema, +predecessors, primary ancestry/tree, complete selector, checker/qualifier/oracle +and packet refusal behavior are unchanged. Cargo and every prior dependency +identity remain fixed PR133. The old 135-map refusal remains retained as source +identity evidence, not a numerical failure. + +The parent delivered stable PR137 before any C1 execution. The earlier +PR136-only uncommitted admission draft was retained as superseded preparation +outside Git; it generated no qualification receipt. After final independent +review, the eight admission/protocol paths committed together at `186dc0a`. +These bound bytes were frozen throughout execution and remain unchanged. + +## Fresh executed checks + +| Declared check | Result on exact clean 186dc0a | +| --- | --- | +| Committed admission / locked metadata / format | Pass; 140 matching inputs | +| Unchanged native qualifier | All 18 commands pass; 35 Rust tests and five new actual native/rational/adversarial specimens | +| Native qualification gate / oracle tests | 5+5 gate and 10+10 oracle tests, normal and optimized Python | +| New actual native packet | 26 normal + 26 optimized pass, zero skips | +| Complete no-default library | 85 pass, including 26 workflow/cold-custody checks and the closed B2 contracts | +| Public integrated projection contracts | 3 pass, including 100 actually accepted substituted intervals for each of two native methods | +| Eight affected legacy Session/provider/recording/runtime/comparison targets | 99 pass, three existing artifact-dependent ignores | +| Original and periodic represented-volume contracts | 18 + 5 pass | +| Existing borrow compile-fail Rustdoc contracts | 3 pass | + +The focused total is **213 passing, zero failing, three existing ignored**. +The workflow 26 are part of the library 85; they are not added twice. +Filtered tests are not counted. The ignored real pressure-session selection, +provider-step 24-interval model fixture and solver-provider replay remain +unavailable; they do not become learned/runtime acceptance. The public projection +suite completed normally in 100.22 seconds, including its over-60-second progress +notice. Its 200 actual substitutions matched the original Session bitwise for +the declared native algorithms/fixtures; this establishes contract equivalence, +not scientific water accuracy or a performance result. + +The packet contains exactly native.tsv, data.json, qualification.json and +primary-qualification.json from the new actual executable/receipt. Each mode +exercised the full malformed/stale source/inventory/predecessor/review/binary/ +receipt/payload refusals. No real-packet-dependent case skipped. The reviewed +wrapper uses explicit optimization-safe guards, exclusive new outputs, exact +packet cardinality/no-skip checks and records its own SHA256; it is not production +solver code. The unchanged qualifier's formatting/Clippy applies to its declared +library/example/aligned-contract scope, not full desktop acceptance. + +## Actual custody and environment + +The [compact manifest](qualification.json) binds all **1,464 committed source +hashes**, all 140 selected inputs, exact command/output/exit receipts and the +98-file raw archive. The [independent execution audit](qualification-186dc0a-review.md) +checks those identities, actual counts, selected bindings and raw ZIP bytes/CRCs +without rerunning tests or campaigns. Seventeen actual ELFs are retained: twelve +focused test executables, four native test harnesses (including the example +harness's two destination-refusal tests, already included in the 35), and the +actual native exporter. +The three compile-fail doctests have no successful runtime ELF. + +Fresh native receipt SHA256: +`a2e84952172519a8184262b8b877b1a74248ba1f4b3b2b986dc910831b7a9b00`. +Actual native exporter SHA256: +`f51e8653f2b44019e8622ee316dc665c2c3434de57efe0871e506ccd38bbf51e`. +Raw archive `/workspace/rheon-c1b2-stage-186dc0a.zip`, **27,323,913 bytes**, SHA256 +`6538e3c27bc75ba41d3bb5ed7894e4eb6a1598fbea5cc3fc77bf03137f6be35b`, +is saved privately in Library as rheon-c1b2-stage-186dc0a.zip/version 0. Exact +Library/file/path identity is in the manifest; returned xattrs were persisted on +the original ZIP without changing bytes. The archive precedes its compact +manifest and final audit to avoid self-hashing. Digest custody is not execution +authentication or bit reproducibility. + +Pinned Rust/Cargo 1.92.0, x86_64-unknown-linux-gnu and actual Python 3.12.14 +are recorded. A previously absent external target +`/workspace/rheon-c1b2-admission-20261020-build` uses jobs 2, incremental 0 and +dev/test debug information 0, with default opt-level 0 and debug assertions. +Normal Python clears ambient optimization; no ambient compiler/opt-level/wrapper +overrides were present. Only the lead's previous reconstructible 9c and Q2 build +caches were retired after verifying retained actual ELFs/raw archive hashes/CRCs, +with explicit resource receipts. All actual evidence, source worktrees and other +owners' resources remain. No active target, criterion or command was changed. + +## Result boundaries and next handoff + +BuiltinNativeV1 remains a closed immutable choice in the existing Session. It +invokes the original native producer on actual provisional faces/shortened dt, +uses B1 pressure/velocity qualification and publishes only through original +Liquid/Session gates. Additive RPS1/RPP1/RPT1 cold SQLite custody retains complete +16KiB metadata bounds and accepted-unrecorded tails. Mixed witness fallback +truthfully refuses publication. The new profile remains explicitly unavailable +to the desktop workflow graph and comparison consumers. + +PR137 changes only classification of actual advection cancellation to Cancelled. +Fresh live/cold tests retain unchanged accepted state/receipt, no publication, +successful retry, true pressure failure as Failed, and historical explicit Failed +archive labels. The old bug remains historical in 9c/9a and their receipts; +neither archive decoding nor numerical publication was reinterpreted. +Owner [B2 evidence](../c1b2-qualification.md) and +[repair evidence](../g1-advection-cancel-qualification.md) retain their original +213/226 overlapping execution claims and raw custody; those raw component +archives were not downloaded or relabelled as this lead execution. + +[C1-B3 readiness](../g1-advection-cancel-next-readiness.md) recommends a separately +admitted finite stateless classical producer choice with distinct fallback, +immutable intent/profile, exact provisional/interval/witness/cold provenance and +integrated comparisons. It is not implementation admission. After this fixed +stage was published, final PR140/5dc1741 reports separate C1-B3 qualification: +227 passing/5 existing ignored executions at core4af3802/consumer9ddf8d2, with +its earlier old-profile refusal-category failure and repair retained. Its eight +changed selected pins versus PR137 are excluded from this source; complete-source +admission, fresh lead qualification and exact-head hosted gates remain pending. +Separate final PR139/902f609 reports its bounded static CV2 reference locally +qualified at source b0a9d52; generic stability/PDE/production gates remain open. +[CV3-A](../cv3a-admission.md) prospectively admits next numerical preparation, +with no result yet. Both deliveries remain excluded from this lead execution. Full C1-B/C/R, +stateful/external transactions/replay, whole-family/transfer, optional viscosity, +physical/scientific accuracy and default/desktop/release/native-window/performance/ +model/Lean/GPU gates remain separate. Existing grid qualification remains first; +particle/output-surface and later Lagrangian families remain future/unqualified. + +The independent Q2 stage retains its own Cargo closure, scientific subjects and +historical CV1 conditioning limits and later bounded CV2 resolution, with generic +stability/PDE/evolving-geometry gates still open. Any joint composition must reconcile both +v3 inventories/review appends, review the entire combined source and qualify that +actual new committed subject. No source receipt transfers across the combination. +Hosted Pages/browser/publication remains pending. PR120/119 merges remain verified; +PR121's automatic approval rejection, including its single requested retry, +continues to pause further public merges. No alternate path or further retry. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/result-document-review/review.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/result-document-review/review.json new file mode 100644 index 00000000..5d6e6ebb --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/result-document-review/review.json @@ -0,0 +1,371 @@ +{ + "archive": { + "bytes": 27323913, + "entries": 98, + "library": { + "current_version_number": 0, + "file_id": "file_00000000088481f5ac57f8b3ba159812", + "file_name": "rheon-c1b2-stage-186dc0a.zip", + "library_file_id": "libfile_13c2351bbe1c8191b19649480d4beeec", + "path": "/rheon-c1b2-stage-186dc0a.zip" + }, + "path": "/workspace/rheon-c1b2-stage-186dc0a.zip", + "sha256": "6538e3c27bc75ba41d3bb5ed7894e4eb6a1598fbea5cc3fc77bf03137f6be35b" + }, + "deciding_criteria_preserved": true, + "decision": "APPROVED_EXACT_ELEVEN_DOCUMENT_PATHS_FOR_RESULT_COMMIT_AND_DRAFT_REVIEW", + "distinct_retained_ELFs_verified": 17, + "executed_source_head": "186dc0a18f787748eb723d91321e44ffd0e374d5", + "executed_source_tree": "3c19a1c1f4a549c782d619145a841a0b43abedac", + "executed_wrapper_commands": 11, + "findings": [], + "focused_ignored": 3, + "focused_passed_total": 213, + "independent_original_summary_binding_matches": true, + "local_links": [ + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/integration-20261020.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md#standards-and-composed-design-admission" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md#standards-and-composed-design-admission" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1a-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1-readiness.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#replacement-contract-gates" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#particle-wall-and-equilibrium-gates" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/integration-20261020.md#retained-numerical-evidence-and-selected-route" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1-readiness.md#frozen-first-slice-write-set" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#claim-register" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/mathematics.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/workflow-preview.html" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "issues.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "execution-ledger.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "c1a-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "c1b2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "source-review/readiness-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "source-review/g1-cancel-followup.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "final-admission-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "qualification.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "qualification-186dc0a-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../c1b2-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../g1-advection-cancel-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../g1-advection-cancel-next-readiness.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.md", + "target": "qualification-186dc0a-review.json" + } + ], + "native_qualifier_commands": 18, + "original_admission_copies_byte_exact": true, + "pinned_external_report_links": [ + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/3d2bc4ea76dc71dfbb063afec5059d437f8826ce/docs/audits/general-fluid-20261019/report.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/dfcc693bf8b66678a924e4a92d299127f6746526/docs/plans/fluid-accuracy-composition/q1/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a64d4d3c610d2ea30f2c734e61e86c4bf2bd25c4/docs/plans/fluid-accuracy-composition/p1/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/bc2573f2ba8d51f9f473fb11285b0c26840e4f18/docs/plans/fluid-accuracy-composition/p1-adjoint/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/9d84f66a5bace9be7fd2f44b40c014c692daf099/docs/plans/fluid-accuracy-composition/p1-material/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/9d84f66a5bace9be7fd2f44b40c014c692daf099/docs/plans/fluid-accuracy-composition/p1-material/route-decision.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/dfcc693bf8b66678a924e4a92d299127f6746526/docs/plans/fluid-accuracy-composition/q1/results.md" + }, + { + "committed_blob_exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + } + ], + "prepared_document_sha256": { + "docs/plans/fluid-accuracy-composition/execution-ledger.md": "bfe66d5c149ed65d4091e1e5d16dca038ae683552e2068c02c1cf08c1ffa64d1", + "docs/plans/fluid-accuracy-composition/issues.md": "629fc23e52c717df00b46c9f2947b6f25bd4c89ee130a2ad69808949bf322858", + "docs/plans/fluid-accuracy-composition/plan.md": "949971c3d05956e76013a82e73b32891885be3735fc7eab2a81e268b73911ea3", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.json": "51196f9321e5de4f20298a21acb7edb038485ea5da0e9c4592eac3a88ce2a54f", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.md": "1b397ce3117a434782c1f432f2a92df74d12ee53187cf4cfe32c33532976058b", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.json": "e69a689a2fb30ad3dcdd237cc8c3d34edd5161796b41d5d76c7adec3eaeabf58", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.md": "41c0cd342a9a8e6a5d47708354c17eeec9d20b378db2ae4c92ebe937d9b46deb", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json": "26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md": "d0ed52b09cf64238772c75b1a5c2fc9edf180df2412e29c50fcb20189db55d1e", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md": "d043367b9db566296e31916a768e177e5f52d21d1f9e17426ef3a3327112cc37", + "docs/plans/fluid-accuracy-composition/reports/verification.md": "1e89fdb297da0dd7c550cd485cd1ed60c1f726acf505f7a57d805c532340943a" + }, + "qualified_native_source_hashes_verified": 1464, + "raw_log_counts": { + "borrow-doctests.log": { + "failed": 0, + "ignored": 0, + "passed": 3 + }, + "focused-complete-library.log": { + "failed": 0, + "ignored": 0, + "passed": 85 + }, + "focused-legacy-recording-volume.log": { + "failed": 0, + "ignored": 3, + "passed": 122 + }, + "focused-projection-session.log": { + "failed": 0, + "ignored": 0, + "passed": 3 + }, + "native-qualified-v1/rust-contracts.log": { + "failed": 0, + "ignored": 0, + "passed": 35 + }, + "packet-tests-normal.log": { + "passed": 26, + "skipped": 0 + }, + "packet-tests-optimized.log": { + "passed": 26, + "skipped": 0 + } + }, + "resolved_wording_finding": "Integration G1 outcome-label acceptance is explicitly past/fixed9c/9a scope; currentPR137repair and186local controls remain verified.", + "retained_evidence_and_ZIP_members_verified": 98, + "schema": "rheon-independent-c1b2-result-document-review-v1", + "scope_limits": [ + "No duplicated builds/tests/campaigns or repository/target/ref/PR mutation.", + "Current186executions are distinct from overlapping owner213/226 claims and historical9c/9a subjects.", + "Q2a6/9a facts preserved by pinned external links; Cargo/reference/CV1 inputs remain excluded. Future joint composition requires full review/new qualification.", + "ClosedBuiltinNativeV1 Session/custody only; B3 recommendation not implementation admission. Fullreplacement, arbitrary/stateful/external/optionalviscosity/familytransfer remain unaccepted.", + "No new physical/learned/default/desktop/release/hosted/UI/performance/Lean/GPU acceptance; three artifact-dependent model tests remain ignored.", + "Library identity/xattr custody remains owner/independent-audit reported; no remote Library retrieval was repeated.", + "PR121 public merge rejection remains blocker; no retry or alternate path." + ], + "source_admission_protocol_unchanged": true, + "summary_sha256": "26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9", + "workflow_included_within_library": 26, + "working_selected_source_count": 140 +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/result-document-review/review.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/result-document-review/review.md new file mode 100644 index 00000000..3ba7d058 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/result-document-review/review.md @@ -0,0 +1,34 @@ +# Independent final C1-B2 result documentation review — 2026-10-20 + +Approved the exact **11 prepared result/canonical documentation paths** for commit and draft review. No unresolved finding remains in this documentation scope. [review.json](review.json) records every file SHA256. Exact copies of these two receipts may be added outside their own11-path hash scope; this creates no self-hash cycle and changes no qualified source. + +The execution subject remains `186dc0a18f787748eb723d91321e44ffd0e374d5`, tree `3c19a1c1f4a549c782d619145a841a0b43abedac`. Five canonical documents and six new result/review files are the entire working delta. The140 selected inputs, Cargo, admission inventory, bound review and protocol are unchanged. Documentation descendants must retain186 as the executed subject. + +## Independent identity and count checks + +Read-only inspection verified all1464 native-receipt source hashes against exact committed186 blobs and all140 working selected identities. The native receipt is clean/passed with18 successful commands, and the outer reviewed driver records11 successful commands, unchanged source and the approved driver hash. The current compact summary SHA256 `26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9` matches the original independent execution audit exactly; its five Library fields are stable. Original final-admission review copies match their external originals byte-for-byte. + +All98 retained evidence hashes,98 ZIP member bytes and CRCs match. The archive is27,323,913bytes, SHA256 `6538e3c27bc75ba41d3bb5ed7894e4eb6a1598fbea5cc3fc77bf03137f6be35b`. Independently checked17 distinct retained ELF contents/hashes:12 focused test harnesses,4 native-contract harnesses and the actual aligned exporter. The native exporter SHA256 is `f51e8653f2b44019e8622ee316dc665c2c3434de57efe0871e506ccd38bbf51e`. Compile-fail doctests do not fabricate runtime ELFs. Library remote retrieval and xattr authenticity were not repeated or inferred; local byte custody is verified. + +Raw logs support the exact report arithmetic: + +- Native qualifier:35 Rust contract passes, including the example harness's two destination tests; five actual native/rational/adversarial specimens and the unchanged guard/oracle suites remain the18-command scope. +- Real packet:26 normal and26 optimized tests, with no skips. +- Focused contracts:213 passes =85 complete-library +3 public projection +122 legacy/volume +3 borrow doctests. All failures are zero; three existing model/artifact-dependent tests remain explicitly ignored and unexecuted. +- The26 workflow entries are part of the85 library passes. The122 legacy/volume passes comprise99 from eight legacy targets plus23 volume tests, without double counting. + +The public projection test source requires100 actual substituted accepted intervals for each of two methods, alongside the original Session comparison, and the raw suite completes normally in100.22s. That supports200 substitutions as contract-equivalence evidence, not200 tests, a new continuum result or a performance claim. The current lead213 is distinct from overlapping historical owner213/226 executions; neither those owner runs nor their unavailable raw archives are relabelled as186 evidence. + +## Canonical and scientific scope + +Compared the canonical updates against committed Q2 PR138/a6bfcc9. Its fixed-corpus exact-geometry, aligned coupled-algebra and separate83-contract result facts remain intact. Pinned external Q2 links are appropriate because that stage's Cargo/reference inputs are excluded here: all44 local file links resolve and11 pinned GitHub links refer to existing exact committed blobs. Markdown fences and the dependency table are coherent. Original deciding verification criteria remain byte-identical; failed P1/Q1 evidence and the grid-first/future-particle-output-surface/later-Lagrangian priority are unchanged. + +One present-tense historical G1 sentence was corrected before final pinning: outcome-label acceptance remained open in fixed9c/9a subjects; it is locally repaired in currentPR137/186. Current labels and historical Failed archive records are not conflated. The fresh workflow controls support the stated cancellation classification repair; no old decoder, numerical publication or historical receipt is rewritten. Hosted acceptance remains separate. + +Current C1-B2 remains closed BuiltinNativeV1 invocation/Session/custody only, with original atomic publication, B1 qualification and bounded additive RPS1/RPP1/RPT1 evidence. Desktop workflow/comparison explicitly refuse the new profile; this run does not qualify new graph presentation. C1-B3 is a readiness recommendation requiring separate admission, not approved implementation. Arbitrary/stateful/external transactions, optional viscosity, full C1-B/C/R, whole-family/transfer and scientific/physical accuracy remain unaccepted. + +Q2 PR135 retains only its separately reviewed four-fixture CV1 operator/physical-trace boundary. The square mass condition diagnostic near6.53e11 and coupled conditioning/stability/PDE gates remain unresolved. No Q2 source or receipt is silently folded into this admission. Any future joint source needs complete inventory/review reconciliation and fresh applicable qualification. + +No new default/desktop/release, hosted Pages/browser/publication, native-window/performance, learned/model/GPU, Lean or physical acceptance is claimed. The PR121 automatic-review rejection remains a public merge blocker; no retry or alternate path was performed or authorized by this review. + +Reviewer inspected source, metadata, retained logs and archive bytes only. No test, build, simulation, model, evaluator/campaign, repository/target/ref/PR mutation or duplicate execution occurred. Only these outside-Git audit artifacts were written. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.json new file mode 100644 index 00000000..945a2cb7 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.json @@ -0,0 +1,1647 @@ +{ + "schema": "rheon-c1b2-g1-cancel-followup-independent-review-v1", + "status": "APPROVED_EXACT140_SOURCE_FOR_SEPARATE_EXPLICIT_V3_ADMISSION_AND_FRESH_COMMITTED_QUALIFICATION", + "reviewed_at_utc": "2026-10-20T04:14:03.778491+00:00", + "subject": { + "head": "d3e62377acde6641c8133cf9a9356cc046cfd02a", + "tree": "f8be6e0ef85a6a965545b2882bff11500c7f1dfd", + "tested_owner_subject": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "tested_owner_tree": "114ab60ff25f2d637eac1a06a3b02bb99a55bd15", + "base_fixed_pr133": "8bf542eddd8198008b6d77d52e009e9384998f18", + "previous_approved_pr136": "e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4", + "clean": true + }, + "source_map_sha256": "08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6", + "counts_vs_fixed_pr133": { + "unchanged": 124, + "changed": 11, + "added": 5 + }, + "removed": 0, + "delta_vs_approved_pr136": { + "changed": { + "src/bin/desktop/workflow_inspector_tests.rs": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4" + }, + "unchanged": 137, + "added": 0, + "removed": 0 + }, + "verification": { + "complete_working_and_committed_selector_matches140": true, + "all140_working_HEAD_tested_blob_hashes_match": true, + "all135_fixed_base_blob_hashes_match": true, + "root_complete_input_map_matches": true, + "all_existing_mechanism_and_inventory_pins_unchanged": true, + "tested_to_final_only_four_evidence_docs": [ + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-manifest.json", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-next-readiness.md", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-qualification.md", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-review.md" + ], + "report_only_additions_to_pr136": { + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-manifest.json": "700f9eff47e2d0fb5357332b8f0c557c074db386b029c5741635e0230876b38b", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-next-readiness.md": "e837ebd329d55a5ddc4af02a3b9f0b3483a7db950c7306ed1a8beea391d09ab0", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-protocol.md": "720dae43fbcbd6d80f972383bfc901988e5c6b1fdd319a62346a91eef3d78536", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-qualification.md": "ca1ba75282fefd663bf978d64473fb1b07b53310043d77679ba9de31ac45894b", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-review.md": "403425b8de477b2eb078eb709e2e5a306d7797a875e511bb74a50665dbd65f8c" + } + }, + "prior_approved_review": { + "json": "/tmp/rheon-c1b2-admission-independent-review/readiness-review.json", + "sha256": "aa789ea2b34a51fc38292f15c8cc3147d2a3e6ec2ed952c0130031e7f2908f21", + "markdown_sha256": "ecc88ca5532256e4c49ad1d5ba7c55558550f72fb2c2474154cbe493423880d6", + "reuse": "All137 unchanged selected identities and prior per-file source rationale reused; original receipts preserved." + }, + "repair_review": { + "finding": "No additional material source defect found in exact bounded delta.", + "production_change": "One typed nested advection cancellation pattern in configured Session outcome mapping; no numerical/publication or cold parser change.", + "live_and_cold": "Tests exercise actual velocity/tracer cancellation at generation0 and after prior acceptance, retained fields/metadata/Arc/quota, phase prefixes, fresh cold SQLite terminal and successful same-owner retry. Desktop verifies actual live/cold labels.", + "legacy_compatibility": "Explicit authored historical buggy Failed/causeCancelled traces remain Failed on cold decode. No archived evidence is reclassified. True IterationLimit pressure failure remains Failed live/cold.", + "historical_subjects": "The source repair is present at tested70da/d3e. Historical e56,133/9c and Q2/9a retain their original known bug and qualification limits; no retroactive discharge." + }, + "qualification_attribution": { + "owner_passing_executions": 226, + "owner_existing_ignored": 5, + "new_test_functions": 4, + "counts_are_unique_tests": false, + "scope": "Owner default/no-default/core/integration/doctest/desktop overlapping execution counts; source/test definitions and manifest arithmetic verified. Three owner independent reviews are attributed, not repeated execution.", + "raw_archive_path": { + "path": "/workspace/rheon-g1-cancel-evidence.zip", + "bytes": 42886489, + "sha256": "c3f8052c6e98774e36c2faff6660b936ace7f2f1c80b42ec459a5fcb90f6390b", + "members": 28 + }, + "raw_archive_available_locally": false, + "raw_execution_repeated": false, + "limit": "No claim independently rehashed raw ZIP, logs or226 actual executions in this review." + }, + "mechanism": { + "unchanged_pins": { + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "3cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330", + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5" + }, + "decision": "Existing strict explicit v3 mechanism is sufficient; retain schemas/selectors/primary/oracle and predecessor history. An independently approved140-map plus appended bounded review can refresh the separate B2 admission inputs; no v4 or automatic refresh needed.", + "current_gate": "Current unchanged135 inventory correctly refuses140 selected inputs. This review permits preparing exact admission metadata and clean committed qualification, not stale gate bypass.", + "independence": "No Q2 Cargo content: Cargo.toml/Cargo.lock equal fixed PR133. Keep PR133/9c and Q2/9a inventories/receipts as original historical subjects." + }, + "paths": [ + { + "path": "Cargo.lock", + "disposition": "unchanged", + "sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "admitted_predecessor_sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "Cargo.toml", + "disposition": "unchanged", + "sha256": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "admitted_predecessor_sha256": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "examples/aligned_strain.rs", + "disposition": "unchanged", + "sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "admitted_predecessor_sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "rust-toolchain.toml", + "disposition": "unchanged", + "sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "admitted_predecessor_sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/advection.rs", + "disposition": "unchanged", + "sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "admitted_predecessor_sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/aligned_strain.rs", + "disposition": "unchanged", + "sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "admitted_predecessor_sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/README.md", + "disposition": "unchanged", + "sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "admitted_predecessor_sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/accepted_session.rs", + "disposition": "unchanged", + "sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "admitted_predecessor_sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider.rs", + "disposition": "unchanged", + "sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "admitted_predecessor_sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs", + "disposition": "unchanged", + "sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "admitted_predecessor_sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider_tests.rs", + "disposition": "unchanged", + "sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "admitted_predecessor_sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs", + "disposition": "unchanged", + "sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "admitted_predecessor_sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/adapter.rs", + "disposition": "unchanged", + "sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "admitted_predecessor_sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/configured_track.rs", + "disposition": "unchanged", + "sha256": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "admitted_predecessor_sha256": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/configured_track_tests.rs", + "disposition": "unchanged", + "sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "admitted_predecessor_sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/cpu_contract_tests.rs", + "disposition": "unchanged", + "sha256": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "admitted_predecessor_sha256": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_runs.rs", + "disposition": "unchanged", + "sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "admitted_predecessor_sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_view.rs", + "disposition": "unchanged", + "sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "admitted_predecessor_sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_worker.rs", + "disposition": "unchanged", + "sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "admitted_predecessor_sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs", + "disposition": "unchanged", + "sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "admitted_predecessor_sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/engine.rs", + "disposition": "unchanged", + "sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "admitted_predecessor_sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/engine_typed_tests.rs", + "disposition": "unchanged", + "sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "admitted_predecessor_sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/mod.rs", + "disposition": "unchanged", + "sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "admitted_predecessor_sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/model_process.rs", + "disposition": "unchanged", + "sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "admitted_predecessor_sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/prediction_contract_tests.rs", + "disposition": "unchanged", + "sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "admitted_predecessor_sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/record.rs", + "disposition": "unchanged", + "sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "admitted_predecessor_sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/scene.rs", + "disposition": "unchanged", + "sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "admitted_predecessor_sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/view.rs", + "disposition": "unchanged", + "sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "admitted_predecessor_sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/ai_comparison/worker.rs", + "disposition": "unchanged", + "sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "admitted_predecessor_sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/archive_view.rs", + "disposition": "unchanged", + "sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "admitted_predecessor_sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/build_identity.rs", + "disposition": "unchanged", + "sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "admitted_predecessor_sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/camera.rs", + "disposition": "unchanged", + "sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "admitted_predecessor_sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/carrier_execution.rs", + "disposition": "unchanged", + "sha256": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "admitted_predecessor_sha256": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/collision_ui.rs", + "disposition": "unchanged", + "sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "admitted_predecessor_sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/comparison.rs", + "disposition": "unchanged", + "sha256": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "admitted_predecessor_sha256": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/comparison_archive.rs", + "disposition": "unchanged", + "sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "admitted_predecessor_sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/comparison_field_view.rs", + "disposition": "unchanged", + "sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "admitted_predecessor_sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/configured_comparison_tests.rs", + "disposition": "unchanged", + "sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "admitted_predecessor_sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/configured_controls.rs", + "disposition": "unchanged", + "sha256": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "admitted_predecessor_sha256": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/configured_producer_exit_tests.rs", + "disposition": "unchanged", + "sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "admitted_predecessor_sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/configured_worker_tests.rs", + "disposition": "unchanged", + "sha256": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "admitted_predecessor_sha256": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/emitter_controls.rs", + "disposition": "unchanged", + "sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "admitted_predecessor_sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/engineering.rs", + "disposition": "unchanged", + "sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "admitted_predecessor_sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/export_ui.rs", + "disposition": "unchanged", + "sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "admitted_predecessor_sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/history.rs", + "disposition": "unchanged", + "sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "admitted_predecessor_sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/identity.rs", + "disposition": "unchanged", + "sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "admitted_predecessor_sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/inspector.rs", + "disposition": "changed", + "sha256": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719", + "admitted_predecessor_sha256": "4753401d42674f6fc3a4990dc9acf534ef3b9d1c425c605375f74072fe334068", + "classification": "desktop consumer refusal", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Rejects the complete native-projection-session namespace after clearing cached reader/path/fields/workflow/selection, before adopting the new reader. No new graph or silent legacy interpretation.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/particle_view.rs", + "disposition": "unchanged", + "sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "admitted_predecessor_sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/run_set_view.rs", + "disposition": "unchanged", + "sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "admitted_predecessor_sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/run_sets.rs", + "disposition": "unchanged", + "sha256": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "admitted_predecessor_sha256": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/run_sets/configured.rs", + "disposition": "unchanged", + "sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "admitted_predecessor_sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/run_sets/configured/archive.rs", + "disposition": "unchanged", + "sha256": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "admitted_predecessor_sha256": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/run_sets/source.rs", + "disposition": "unchanged", + "sha256": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "admitted_predecessor_sha256": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/settings.rs", + "disposition": "unchanged", + "sha256": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "admitted_predecessor_sha256": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/transport_view.rs", + "disposition": "unchanged", + "sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "admitted_predecessor_sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/viewport.rs", + "disposition": "unchanged", + "sha256": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "admitted_predecessor_sha256": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/workflow_inspector.rs", + "disposition": "unchanged", + "sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "admitted_predecessor_sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/desktop/workflow_inspector_tests.rs", + "disposition": "changed", + "sha256": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d", + "admitted_predecessor_sha256": "577bc23f06a8cd794b16d42cd347a024d627443f3d1cf5d4a6230b21c76a24e2", + "classification": "actual typed-error native consumer contracts", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Retains B2 refusal contracts. Shared actual fixture returns typed failure for assertions; new live/cold egui test distinguishes velocity/tracer Cancelled from genuine pressure Failed with no publication. No production inspector implementation change.", + "delta_from_approved_pr136": "changed" + }, + { + "path": "src/bin/rheon-ai-compare.rs", + "disposition": "unchanged", + "sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "admitted_predecessor_sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/rheon-desktop.rs", + "disposition": "unchanged", + "sha256": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "admitted_predecessor_sha256": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/bin/rheon.rs", + "disposition": "unchanged", + "sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "admitted_predecessor_sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/box_flux.rs", + "disposition": "unchanged", + "sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "admitted_predecessor_sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/box_flux_step.rs", + "disposition": "unchanged", + "sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "admitted_predecessor_sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/collision.rs", + "disposition": "unchanged", + "sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "admitted_predecessor_sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/column_mac.rs", + "disposition": "unchanged", + "sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "admitted_predecessor_sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/column_momentum.rs", + "disposition": "unchanged", + "sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "admitted_predecessor_sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/column_shear.rs", + "disposition": "unchanged", + "sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "admitted_predecessor_sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/column_surface.rs", + "disposition": "unchanged", + "sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "admitted_predecessor_sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/compressible.rs", + "disposition": "unchanged", + "sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "admitted_predecessor_sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/coupled_discrete.rs", + "disposition": "unchanged", + "sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "admitted_predecessor_sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/dense3d_sequence.rs", + "disposition": "unchanged", + "sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "admitted_predecessor_sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/emitter.rs", + "disposition": "unchanged", + "sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "admitted_predecessor_sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/emitter_controls.rs", + "disposition": "unchanged", + "sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "admitted_predecessor_sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/export.rs", + "disposition": "unchanged", + "sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "admitted_predecessor_sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/fitted_height.rs", + "disposition": "unchanged", + "sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "admitted_predecessor_sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/fixed_bottom_ale.rs", + "disposition": "unchanged", + "sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "admitted_predecessor_sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/forces.rs", + "disposition": "unchanged", + "sha256": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "admitted_predecessor_sha256": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/free_surface.rs", + "disposition": "unchanged", + "sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "admitted_predecessor_sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/geometry.rs", + "disposition": "unchanged", + "sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "admitted_predecessor_sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/lib.rs", + "disposition": "changed", + "sha256": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "admitted_predecessor_sha256": "c208229fd3f1d15a1597a2f85ec95c51a305b92232a1bfdd18a30d57e45f5510", + "classification": "public owner registration", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds projection_step module without replacing existing provider/native-family paths or importing a numerical campaign.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/liquid_step.rs", + "disposition": "changed", + "sha256": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "admitted_predecessor_sha256": "b707f32f0a5c1102ebbde0776316fc5e7daddb23247c2a07e2d2f69355325baa", + "classification": "atomic numerical publication plumbing", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds a private projection input alongside existing explicit legacy None routes, accounts workspace arrays, applies selected qualified faces once, preserves downstream volume/final-cancel ordering, seals prospective output digest before original infallible pressure copy/swaps.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/liquid_volume.rs", + "disposition": "unchanged", + "sha256": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "admitted_predecessor_sha256": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/material.rs", + "disposition": "unchanged", + "sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "admitted_predecessor_sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/material_session.rs", + "disposition": "unchanged", + "sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "admitted_predecessor_sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/mesh_collision.rs", + "disposition": "unchanged", + "sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "admitted_predecessor_sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/mesh_import.rs", + "disposition": "unchanged", + "sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "admitted_predecessor_sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/motion.rs", + "disposition": "unchanged", + "sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "admitted_predecessor_sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/native_family.rs", + "disposition": "unchanged", + "sha256": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "admitted_predecessor_sha256": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/native_family/tests.rs", + "disposition": "unchanged", + "sha256": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "admitted_predecessor_sha256": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/observation.rs", + "disposition": "unchanged", + "sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "admitted_predecessor_sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/obstacle_pressure.rs", + "disposition": "unchanged", + "sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "admitted_predecessor_sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/obstacle_shear.rs", + "disposition": "unchanged", + "sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "admitted_predecessor_sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/operator.rs", + "disposition": "unchanged", + "sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "admitted_predecessor_sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/parallel.rs", + "disposition": "unchanged", + "sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "admitted_predecessor_sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/particle_fluid.rs", + "disposition": "unchanged", + "sha256": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "admitted_predecessor_sha256": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/pressure.rs", + "disposition": "unchanged", + "sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "admitted_predecessor_sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/pressure_session.rs", + "disposition": "unchanged", + "sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "admitted_predecessor_sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/projection_step.rs", + "disposition": "added", + "sha256": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3", + "admitted_predecessor_sha256": null, + "classification": "closed builtin execution and typed attempt owner", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Only BuiltinNativeV1 intent; aggregate-capped native/RHS/face/B1 scratch. Actual provisional request feeds original native producer/correction and B1 witness/actual-divergence gate. Producer/witness/fallback diagnostics and timing scopes stay distinct. Mixed witness fallback is retained but refused before publication; immutable accepted Arc and exact phase/iteration/report/index validation.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/provider_step.rs", + "disposition": "unchanged", + "sha256": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "admitted_predecessor_sha256": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording.rs", + "disposition": "changed", + "sha256": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "admitted_predecessor_sha256": "08a85d909ef6c566335675fddadbfdc245c42b4c894edf72aa41198036b0cd5f", + "classification": "existing recording owner registration", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds projection codec under the existing SQLite owner; no second archive, application/schema reinterpretation, transaction or store.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/carrier.rs", + "disposition": "unchanged", + "sha256": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "admitted_predecessor_sha256": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/comparison.rs", + "disposition": "unchanged", + "sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "admitted_predecessor_sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/diagnostic.rs", + "disposition": "unchanged", + "sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "admitted_predecessor_sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/material.rs", + "disposition": "unchanged", + "sha256": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "admitted_predecessor_sha256": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/projection.rs", + "disposition": "added", + "sha256": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24", + "admitted_predecessor_sha256": null, + "classification": "additive cold custody codec", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "RPS1/RPP1/RPT1 wrap unchanged native RSC1/RCP2 payloads, bind exact source/intent/configuration/native report/time/output, prior inputs and monotone attempts where retained history permits. Complete encoded metadata shares existing16KiB bound; strict closed enum/version decoders. Terminals expose recorded versus unrecorded accepted tail; no runtime/restart construction.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/projection_tests.rs", + "disposition": "added", + "sha256": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338", + "admitted_predecessor_sha256": null, + "classification": "cold SQLite and invalid-evidence contracts", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Real Session execution, clean fallback/mixed failure, close/drop/reopen, generation-zero cancellation, actual append quota failure/unrecorded tail, source/intent/version/size/interval/output/native-count corruption and duplicate/prior-input refusal. Existing old capture APIs explicitly refuse new intent.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/provider.rs", + "disposition": "changed", + "sha256": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8", + "admitted_predecessor_sha256": "ca4abfb98c364cda5d3d830930ebe6773020e0d35aae756a33c718662e239b3d", + "classification": "shared native payload helper extraction", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Extracts same native capture/decode bodies for new wrapper while retaining old RSC1/RCP2 encoding and validators. Public old capture/run/runtime entrypoints reject projection snapshots before interpreting them as configured provider evidence.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/provider/comparison.rs", + "disposition": "unchanged", + "sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "admitted_predecessor_sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/provider/runtime.rs", + "disposition": "unchanged", + "sha256": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "admitted_predecessor_sha256": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/recording/workflow.rs", + "disposition": "changed", + "sha256": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "admitted_predecessor_sha256": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "classification": "real live/cold cancellation and historical compatibility contracts", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Production codec unchanged. Two actual velocity/tracer cancellation tests cover generation0 and prior accepted state, unchanged fields/metadata/Arc/quota, actual phase prefixes, close/drop/cold Cancelled and same-owner retry. Explicitly authored historical Failed controls remain Failed on decode. A genuine native IterationLimit control remains Failed live/cold.", + "delta_from_approved_pr136": "changed" + }, + { + "path": "src/sampling.rs", + "disposition": "unchanged", + "sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "admitted_predecessor_sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/scheduling.rs", + "disposition": "unchanged", + "sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "admitted_predecessor_sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/session.rs", + "disposition": "changed", + "sha256": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "admitted_predecessor_sha256": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", + "classification": "immutable intent/accepted receipt ownership", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds private immutable projection intent, bounded accepted Arc and checked attempt counter; registers private projection implementation and guards legacy step paths. Existing constructor defaults remain legacy and accepted quota/state ownership stays in Session.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/session/configured.rs", + "disposition": "changed", + "sha256": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "admitted_predecessor_sha256": "b5c8978e20cf6d1ed2b183a2cb506dc7a15041049b1dfb91935cac954f8070a2", + "classification": "legacy G1 typed cancellation classification", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Retains prior B2 legacy-intent guard; adds only the exact nested SessionError::Step(Carrier(Advection(Cancelled))) pattern to existing cancellation mapping. No arithmetic, solver, commit/rollback, receipt encoding or publication change.", + "delta_from_approved_pr136": "changed" + }, + { + "path": "src/session/projection.rs", + "disposition": "added", + "sha256": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc", + "admitted_predecessor_sha256": null, + "classification": "actual Session invocation and rollback", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Opt-in constructor validates closed configuration; one call observes an actual numerical interval with real source/generation/start/shortened dt. Checked attempt IDs survive failures; accepted steps/fields/receipt/history change only after complete Liquid success. Cooperative deadline/cancel phases, Arc exclusivity and typed mixed failure preserve accepted state. B2 recognizes advection cancellation without claiming legacy repair.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/session/projection_tests.rs", + "disposition": "added", + "sha256": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6", + "admitted_predecessor_sha256": null, + "classification": "core rollback and observation contracts", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Both native methods cover real checkpoints, clean field/momentum fallback versus unpublished mixed fallback, early/final deadlines, quota/stop/attempt exhaustion, Arc alias failure, native solve exhaustion/late volume failure, exact accepted receipt retention, successful retry, budget/domain and adversarial receipt-phase controls.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/sgs.rs", + "disposition": "unchanged", + "sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "admitted_predecessor_sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/simulation.rs", + "disposition": "changed", + "sha256": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "admitted_predecessor_sha256": "00740d13df6f3ab88e362504bf63b833d693e51c05c95b189c677d2460520a18", + "classification": "existing native kernel integration", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds optional private projection branch on actual post-advection/forces faces and actual dt; excludes incompatible boundary/surface/viscosity/provider/emitter/barrier paths. Copies B1 selected faces once without double correction, retains original downstream acceptance/publication path; candidate view is transient for digest sealing.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/solver_provider.rs", + "disposition": "unchanged", + "sha256": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "admitted_predecessor_sha256": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/solver_provider/composition.rs", + "disposition": "unchanged", + "sha256": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "admitted_predecessor_sha256": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/solver_provider/composition/projection.rs", + "disposition": "changed", + "sha256": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "admitted_predecessor_sha256": "e9a717ffc318c2345a4863369ff426c1f6d86f6ae4c3a5d312f2bfc459d33e4d", + "classification": "private successful scratch accessors", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Only two crate-private read-only pressure/velocity accessors for the integrated owner after successful B1 qualification. Public supplied-array semantics, failure paths and numerical gate remain unchanged.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/solver_provider/composition/projection_tests.rs", + "disposition": "unchanged", + "sha256": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "admitted_predecessor_sha256": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/solver_provider/composition_tests.rs", + "disposition": "unchanged", + "sha256": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "admitted_predecessor_sha256": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/solver_provider/configured.rs", + "disposition": "unchanged", + "sha256": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "admitted_predecessor_sha256": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/solver_provider/context.rs", + "disposition": "unchanged", + "sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "admitted_predecessor_sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/solver_provider/modal.rs", + "disposition": "unchanged", + "sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "admitted_predecessor_sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/static_obstacle.rs", + "disposition": "unchanged", + "sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "admitted_predecessor_sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/tracer_barrier.rs", + "disposition": "unchanged", + "sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "admitted_predecessor_sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/translated_viscous.rs", + "disposition": "unchanged", + "sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "admitted_predecessor_sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/viscosity.rs", + "disposition": "unchanged", + "sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "admitted_predecessor_sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/vtk_export.rs", + "disposition": "unchanged", + "sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "admitted_predecessor_sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/workflow.rs", + "disposition": "unchanged", + "sha256": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "admitted_predecessor_sha256": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "src/workflow/tests.rs", + "disposition": "unchanged", + "sha256": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "admitted_predecessor_sha256": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "tests/aligned_strain_contract.rs", + "disposition": "unchanged", + "sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "admitted_predecessor_sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "tests/obstacle_flow_contract.rs", + "disposition": "unchanged", + "sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "admitted_predecessor_sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "tests/static_obstacle_contract.rs", + "disposition": "unchanged", + "sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "admitted_predecessor_sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "tools/aligned_strain_oracle.py", + "disposition": "unchanged", + "sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "admitted_predecessor_sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "tools/qualify_aligned_strain.py", + "disposition": "unchanged", + "sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "admitted_predecessor_sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "tools/test_aligned_strain_oracle.py", + "disposition": "unchanged", + "sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "admitted_predecessor_sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + }, + { + "path": "tools/test_qualify_aligned_strain.py", + "disposition": "unchanged", + "sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "admitted_predecessor_sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2.", + "delta_from_approved_pr136": "unchanged", + "review_reuse": "Exact approved e56 identity and per-path rationale reused; no execution transfer." + } + ], + "new_material_findings": [], + "remaining_gates": [ + "Lead prepares exact separate140 v3 inventory plus appended bounded source review and prospective protocol; independent metadata/delta review before clean commit.", + "Fresh exact committed closure native/rational/real packet normal/-O and separately applicable composed B2/G1/core/codec/legacy/consumer contracts. Existing18-command qualifier is not all140 behavioral gates.", + "Hosted checks, merge, graph/native-window/performance/physics/model and whole C1-B/C/R acceptance remain separate. B2 GUI/comparison currently explicitly refuses its namespace.", + "Next-readiness C1-B3 proposal is a recommendation only, not implementation authorization/admission." + ], + "limits": [ + "Read-only source/manifest review; only new external /tmp review artifacts written.", + "No builds/tests/campaigns/source/inventory/ref/PR mutation or publication/merge retries.", + "Cargo unchanged from fixed133; closure independent of Q2 Cargo stage. No scientific, model, GPU, Lean, authentication, bit-reproducibility or performance claim." + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.md new file mode 100644 index 00000000..6b0b7b08 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.md @@ -0,0 +1,29 @@ +# PR137 G1 cancellation follow-up — independent source review + +**Approved exact 140-file source for separate explicit v3 admission preparation and fresh committed qualification. No additional material finding.** This is not admission metadata approval, execution certification or merge acceptance. + +Reviewed clean `d3e62377acde6641c8133cf9a9356cc046cfd02a`, tree `f8be6e0ef85a6a965545b2882bff11500c7f1dfd`. All140 selected working files and committed blobs match the owner-tested `70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52` (tree `114ab60ff25f2d637eac1a06a3b02bb99a55bd15`). Final head changes only four evidence documents after that tested subject. The manifest and root input maps agree. + +Map SHA256: `08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6`. Relative to fixed PR133 `8bf542eddd8198008b6d77d52e009e9384998f18`: **5 added,11 changed,124 unchanged,0removed**. Relative to approved PR136 `e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4`: **3 changed,137 unchanged,0added/removed**. The original `readiness-review.json` and `.md` are preserved; unchanged identities and their per-path source rationale are reused, without transferring executions. + +## Exact bounded repair + +The sole production change adds the typed nested advection-cancellation pattern to the existing configured Session outcome matcher. It changes actual velocity/tracer cancellation classification to `Cancelled`; numerical arithmetic, solver order, accepted commit/rollback and publication are unchanged. Production cold decoding is unchanged. + +Tests cover actual velocity/tracer cancellation at generation0 and after acceptance; unchanged accepted fields, metadata, Arc receipt and remaining quota; phase prefixes; real SQLite close/drop/reopen; and a successful same-owner retry. The desktop fixture verifies typed error and live/cold labels. Explicitly authored historical buggy `Failed` receipts remain `Failed` when decoded; a genuine native pressure `IterationLimit` control remains `Failed` live/cold. No historical artifact is silently repaired. + +| Changed selected file | SHA256 | +| --- | --- | +| `src/bin/desktop/workflow_inspector_tests.rs` | `baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d` | +| `src/recording/workflow.rs` | `020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1` | +| `src/session/configured.rs` | `25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4` | + +## Evidence and limits + +The manifest reconciles **226 passing executions and5existing ignores**, with deliberate default/no-default/selector overlap; these are not226unique tests. Four new test functions and their actual-owner controls are present. Owner execution, red controls, three independent reviews and artifact audit remain attributed evidence: the raw archive/logs were unavailable locally, and this review reran no tests or campaigns. All140 source identities, manifest arithmetic and the tested/final split were independently checked. + +Historical e56,133/9c and Q2/9a retain the original cancellation-label defect and their original bounded qualifications. The repair does not retroactively change those subjects or establish full G1-C acceptance. The unchanged v3 admission mechanism, all prior inventory/review bytes and Cargo remain intact. Its current135-file refusal is correct; no gate bypass or v4 is needed. + +Lead may prepare the separately reviewed140-map, appended bounded source review and prospective protocol. Fresh clean-commit native/rational/packet normal/-O and applicable composed B2/G1/core/codec/consumer contracts remain required and separately counted. Hosted/merge, full C1-B/C/R, desktop graph support, native-window, physical/model and performance obligations remain distinct. B2 still explicitly refuses graph/comparison interpretation. C1-B3 next-readiness is only a recommendation, not new implementation admission. + +No builds, numerical campaigns, source/metadata/ref/PR edits or merge/publication retries occurred. Only these external review artifacts were written. The [machine-readable follow-up](g1-cancel-followup.json) records every140 current path, predecessor disposition and reused rationale. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.json new file mode 100644 index 00000000..2dd084df --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.json @@ -0,0 +1,1352 @@ +{ + "schema": "rheon-c1b2-complete-selected-source-independent-review-v1", + "status": "APPROVED_EXACT140_SOURCE_FOR_SEPARATE_EXPLICIT_ADMISSION_AND_FRESH_QUALIFICATION", + "reviewed_at_utc": "2026-10-20T04:07:04.725115+00:00", + "subject": { + "head": "e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4", + "tree": "24bf0d062bf366ddcbc4a3411ed4d832018f89c2", + "base": "8bf542eddd8198008b6d77d52e009e9384998f18", + "clean": true + }, + "source_map_sha256": "880129bcbf5a0f29dd82fe1c3bd4627474a97ec6f073a0c14191a9a596deed03", + "counts": { + "unchanged": 125, + "changed": 10, + "added": 5 + }, + "removed": 0, + "complete_selected_path_set_verified": true, + "prior135_hashes_checked_at_base": true, + "all140_worktree_and_committed_hashes_verified": true, + "source_identity": { + "core_subject": { + "commit": "634404e9d07f1dc0319de48e89875128a28466db", + "tree": "445eff52cbf732a57702ed2b100d0104011bfa1d" + }, + "consumer_subject": { + "commit": "a6e76a91917ec9d85f213fa7387adc2c28feeb33", + "tree": "d27113e99884b0bd0d9319c5a5eb82586d005dcd" + }, + "core_selected_difference_to_final": [ + "src/bin/desktop/workflow_inspector_tests.rs" + ], + "consumer_selected_difference_to_final": [], + "core_to_consumer_exact_delta": "Only three UI-test lifecycle literals; production/library/core/public-test/Cargo/toolchain bytes identical.", + "consumer_to_reporting_head": "Only c1b2-manifest/qualification/review documents.", + "changed_source_manifest_hashes_and_lengths_verified": true + }, + "mechanism": { + "unchanged_pins": { + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "3cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330", + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5" + }, + "decision": "Existing strict explicit v3 mechanism is sufficient; retain schemas/selectors/primary/oracle and predecessor history. An independently approved140-map plus appended bounded review can refresh the separate B2 admission inputs; no v4 or automatic refresh needed.", + "current_gate": "Current unchanged135 inventory correctly refuses140 selected inputs. This review permits preparing exact admission metadata and clean committed qualification, not stale gate bypass.", + "independence": "No Q2 Cargo content: Cargo.toml/Cargo.lock equal fixed PR133. Keep PR133/9c and Q2/9a inventories/receipts as original historical subjects." + }, + "new_material_findings": [], + "known_legacy_limitation": { + "issue": "Legacy G1 configured observation omits AdvectionError::Cancelled and labels actual VelocitySlice cancellation Failed.", + "B2_status": "New B2 failure mapping explicitly handles advection cancellation; legacy configured mapper remains unchanged except intent guard.", + "scope": "Known existing issue remains present in previously qualified9c/9a sources and this source closure. Full G1-C outcome-label gate stays open until assigned owner repair; B2 source admission is not global G1 acceptance." + }, + "qualification_evidence_attribution": { + "source_manifest_passed_executions": 213, + "source_manifest_ignored": 5, + "new_distinct_tests_verified_from_definitions": 19, + "actual_integrated_interval_source": "Public differential contract advances100 accepted intervals for each of two native methods versus original Session, comparing all native fields/pressure/fraction/time/stamps and numerical reports. This is200 substituted intervals, not scientific accuracy.", + "raw_archive_locally_available": false, + "raw_logs_locally_available": false, + "meaning": "Source identity/split and arithmetic of manifest counts independently verified. Prior component independent execution/artifact rehash reports are attributed; no new raw213-test or112MB ZIP rehash claim here.", + "fresh140_requirement": "Unchanged18-command qualifier does not run B2 unit/public contracts. Final composed focused B2/core/codec/legacy/consumer tests and actual finite native/rational/real-packet normal/-O execution must remain separately counted and subject-bound." + }, + "additional_reviewed_inputs": { + "tests/projection_session_contract.rs": "7af45f857acc24c13d699f42ca8e1b8452d8be3365da39deb79eb661b28193e1", + "tests/recording_comparison_contract.rs": "80421b875312911e0fb0dd01155712df310b67ae21400bebf3bd686cc7ea56f2", + "docs/plans/fluid-accuracy-composition/reports/c1b2-protocol.md": "d869f1dbd91be9959eea80c21c296569832039a6b4030e42aa4e8fe984545222", + "docs/plans/fluid-accuracy-composition/reports/c1b2-qualification.md": "0ef398ed536233c772d34976b7eb7ca977fcf7817cc7d7b3777e58f3a73aa8a9", + "docs/plans/fluid-accuracy-composition/reports/c1b2-review.md": "62fab7615d0e032cbca0a323f0662b186bbca69e164eea226444d917ecbcfd9e", + "docs/plans/fluid-accuracy-composition/reports/c1b2-manifest.json": "e9cd9c506b18b0dc2369bdbc57272c467753d162fe887a7f584473a188bf3b59" + }, + "remaining_gates": [ + "Prepare exact separate B2 admission metadata; final independent metadata/delta review before clean commit.", + "Fresh actual committed140 closure native/rational/real packet and applicable focused contracts; no transfer of133/9c or Q2/9a execution.", + "Hosted/default/desktop/native-window/performance/model/physics obligations remain claim-specific and separate. Existing B2 desktop/comparison outcome is explicit refusal, not implemented graph support.", + "Full C1-B/C/C1-R, external/stateful providers, replay/uncertain commit, whole-family/transfer and optional viscosity remain unaccepted.", + "Assigned owner legacy G1 outcome-label repair remains open; do not close its contract gate from B2 evidence." + ], + "paths": [ + { + "path": "Cargo.lock", + "disposition": "unchanged", + "sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "admitted_predecessor_sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "Cargo.toml", + "disposition": "unchanged", + "sha256": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "admitted_predecessor_sha256": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "examples/aligned_strain.rs", + "disposition": "unchanged", + "sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "admitted_predecessor_sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "rust-toolchain.toml", + "disposition": "unchanged", + "sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "admitted_predecessor_sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/advection.rs", + "disposition": "unchanged", + "sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "admitted_predecessor_sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/aligned_strain.rs", + "disposition": "unchanged", + "sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "admitted_predecessor_sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/README.md", + "disposition": "unchanged", + "sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "admitted_predecessor_sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/accepted_session.rs", + "disposition": "unchanged", + "sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "admitted_predecessor_sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider.rs", + "disposition": "unchanged", + "sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "admitted_predecessor_sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs", + "disposition": "unchanged", + "sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "admitted_predecessor_sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider_tests.rs", + "disposition": "unchanged", + "sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "admitted_predecessor_sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs", + "disposition": "unchanged", + "sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "admitted_predecessor_sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/adapter.rs", + "disposition": "unchanged", + "sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "admitted_predecessor_sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/configured_track.rs", + "disposition": "unchanged", + "sha256": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "admitted_predecessor_sha256": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/configured_track_tests.rs", + "disposition": "unchanged", + "sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "admitted_predecessor_sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/cpu_contract_tests.rs", + "disposition": "unchanged", + "sha256": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "admitted_predecessor_sha256": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_runs.rs", + "disposition": "unchanged", + "sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "admitted_predecessor_sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_view.rs", + "disposition": "unchanged", + "sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "admitted_predecessor_sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_worker.rs", + "disposition": "unchanged", + "sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "admitted_predecessor_sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs", + "disposition": "unchanged", + "sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "admitted_predecessor_sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/engine.rs", + "disposition": "unchanged", + "sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "admitted_predecessor_sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/engine_typed_tests.rs", + "disposition": "unchanged", + "sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "admitted_predecessor_sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/mod.rs", + "disposition": "unchanged", + "sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "admitted_predecessor_sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/model_process.rs", + "disposition": "unchanged", + "sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "admitted_predecessor_sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/prediction_contract_tests.rs", + "disposition": "unchanged", + "sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "admitted_predecessor_sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/record.rs", + "disposition": "unchanged", + "sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "admitted_predecessor_sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/scene.rs", + "disposition": "unchanged", + "sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "admitted_predecessor_sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/view.rs", + "disposition": "unchanged", + "sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "admitted_predecessor_sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/ai_comparison/worker.rs", + "disposition": "unchanged", + "sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "admitted_predecessor_sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/archive_view.rs", + "disposition": "unchanged", + "sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "admitted_predecessor_sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/build_identity.rs", + "disposition": "unchanged", + "sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "admitted_predecessor_sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/camera.rs", + "disposition": "unchanged", + "sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "admitted_predecessor_sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/carrier_execution.rs", + "disposition": "unchanged", + "sha256": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "admitted_predecessor_sha256": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/collision_ui.rs", + "disposition": "unchanged", + "sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "admitted_predecessor_sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/comparison.rs", + "disposition": "unchanged", + "sha256": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "admitted_predecessor_sha256": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/comparison_archive.rs", + "disposition": "unchanged", + "sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "admitted_predecessor_sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/comparison_field_view.rs", + "disposition": "unchanged", + "sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "admitted_predecessor_sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/configured_comparison_tests.rs", + "disposition": "unchanged", + "sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "admitted_predecessor_sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/configured_controls.rs", + "disposition": "unchanged", + "sha256": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "admitted_predecessor_sha256": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/configured_producer_exit_tests.rs", + "disposition": "unchanged", + "sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "admitted_predecessor_sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/configured_worker_tests.rs", + "disposition": "unchanged", + "sha256": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "admitted_predecessor_sha256": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/emitter_controls.rs", + "disposition": "unchanged", + "sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "admitted_predecessor_sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/engineering.rs", + "disposition": "unchanged", + "sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "admitted_predecessor_sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/export_ui.rs", + "disposition": "unchanged", + "sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "admitted_predecessor_sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/history.rs", + "disposition": "unchanged", + "sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "admitted_predecessor_sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/identity.rs", + "disposition": "unchanged", + "sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "admitted_predecessor_sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/inspector.rs", + "disposition": "changed", + "sha256": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719", + "admitted_predecessor_sha256": "4753401d42674f6fc3a4990dc9acf534ef3b9d1c425c605375f74072fe334068", + "classification": "desktop consumer refusal", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Rejects the complete native-projection-session namespace after clearing cached reader/path/fields/workflow/selection, before adopting the new reader. No new graph or silent legacy interpretation." + }, + { + "path": "src/bin/desktop/particle_view.rs", + "disposition": "unchanged", + "sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "admitted_predecessor_sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/run_set_view.rs", + "disposition": "unchanged", + "sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "admitted_predecessor_sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/run_sets.rs", + "disposition": "unchanged", + "sha256": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "admitted_predecessor_sha256": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/run_sets/configured.rs", + "disposition": "unchanged", + "sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "admitted_predecessor_sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/run_sets/configured/archive.rs", + "disposition": "unchanged", + "sha256": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "admitted_predecessor_sha256": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/run_sets/source.rs", + "disposition": "unchanged", + "sha256": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "admitted_predecessor_sha256": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/settings.rs", + "disposition": "unchanged", + "sha256": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "admitted_predecessor_sha256": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/transport_view.rs", + "disposition": "unchanged", + "sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "admitted_predecessor_sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/viewport.rs", + "disposition": "unchanged", + "sha256": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "admitted_predecessor_sha256": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/workflow_inspector.rs", + "disposition": "unchanged", + "sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "admitted_predecessor_sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/desktop/workflow_inspector_tests.rs", + "disposition": "changed", + "sha256": "36cca640ad182ae9cc16195a2e8a58b110fd731a052047f62794cd004abb0239", + "admitted_predecessor_sha256": "577bc23f06a8cd794b16d42cd347a024d627443f3d1cf5d4a6230b21c76a24e2", + "classification": "desktop consumer contracts", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Actual projection archive and header-only pre-attempt cancellation fixtures prove namespace refusal clears retained G1 graph/evidence/gesture; future version uses a valid separately created header. Consumer freeze corrects only three lifecycle literals, preserving completed-requires-row." + }, + { + "path": "src/bin/rheon-ai-compare.rs", + "disposition": "unchanged", + "sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "admitted_predecessor_sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/rheon-desktop.rs", + "disposition": "unchanged", + "sha256": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "admitted_predecessor_sha256": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/bin/rheon.rs", + "disposition": "unchanged", + "sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "admitted_predecessor_sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/box_flux.rs", + "disposition": "unchanged", + "sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "admitted_predecessor_sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/box_flux_step.rs", + "disposition": "unchanged", + "sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "admitted_predecessor_sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/collision.rs", + "disposition": "unchanged", + "sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "admitted_predecessor_sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/column_mac.rs", + "disposition": "unchanged", + "sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "admitted_predecessor_sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/column_momentum.rs", + "disposition": "unchanged", + "sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "admitted_predecessor_sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/column_shear.rs", + "disposition": "unchanged", + "sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "admitted_predecessor_sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/column_surface.rs", + "disposition": "unchanged", + "sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "admitted_predecessor_sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/compressible.rs", + "disposition": "unchanged", + "sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "admitted_predecessor_sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/coupled_discrete.rs", + "disposition": "unchanged", + "sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "admitted_predecessor_sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/dense3d_sequence.rs", + "disposition": "unchanged", + "sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "admitted_predecessor_sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/emitter.rs", + "disposition": "unchanged", + "sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "admitted_predecessor_sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/emitter_controls.rs", + "disposition": "unchanged", + "sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "admitted_predecessor_sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/export.rs", + "disposition": "unchanged", + "sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "admitted_predecessor_sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/fitted_height.rs", + "disposition": "unchanged", + "sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "admitted_predecessor_sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/fixed_bottom_ale.rs", + "disposition": "unchanged", + "sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "admitted_predecessor_sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/forces.rs", + "disposition": "unchanged", + "sha256": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "admitted_predecessor_sha256": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/free_surface.rs", + "disposition": "unchanged", + "sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "admitted_predecessor_sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/geometry.rs", + "disposition": "unchanged", + "sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "admitted_predecessor_sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/lib.rs", + "disposition": "changed", + "sha256": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "admitted_predecessor_sha256": "c208229fd3f1d15a1597a2f85ec95c51a305b92232a1bfdd18a30d57e45f5510", + "classification": "public owner registration", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds projection_step module without replacing existing provider/native-family paths or importing a numerical campaign." + }, + { + "path": "src/liquid_step.rs", + "disposition": "changed", + "sha256": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "admitted_predecessor_sha256": "b707f32f0a5c1102ebbde0776316fc5e7daddb23247c2a07e2d2f69355325baa", + "classification": "atomic numerical publication plumbing", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds a private projection input alongside existing explicit legacy None routes, accounts workspace arrays, applies selected qualified faces once, preserves downstream volume/final-cancel ordering, seals prospective output digest before original infallible pressure copy/swaps." + }, + { + "path": "src/liquid_volume.rs", + "disposition": "unchanged", + "sha256": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "admitted_predecessor_sha256": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/material.rs", + "disposition": "unchanged", + "sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "admitted_predecessor_sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/material_session.rs", + "disposition": "unchanged", + "sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "admitted_predecessor_sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/mesh_collision.rs", + "disposition": "unchanged", + "sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "admitted_predecessor_sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/mesh_import.rs", + "disposition": "unchanged", + "sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "admitted_predecessor_sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/motion.rs", + "disposition": "unchanged", + "sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "admitted_predecessor_sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/native_family.rs", + "disposition": "unchanged", + "sha256": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "admitted_predecessor_sha256": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/native_family/tests.rs", + "disposition": "unchanged", + "sha256": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "admitted_predecessor_sha256": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/observation.rs", + "disposition": "unchanged", + "sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "admitted_predecessor_sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/obstacle_pressure.rs", + "disposition": "unchanged", + "sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "admitted_predecessor_sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/obstacle_shear.rs", + "disposition": "unchanged", + "sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "admitted_predecessor_sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/operator.rs", + "disposition": "unchanged", + "sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "admitted_predecessor_sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/parallel.rs", + "disposition": "unchanged", + "sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "admitted_predecessor_sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/particle_fluid.rs", + "disposition": "unchanged", + "sha256": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "admitted_predecessor_sha256": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/pressure.rs", + "disposition": "unchanged", + "sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "admitted_predecessor_sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/pressure_session.rs", + "disposition": "unchanged", + "sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "admitted_predecessor_sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/projection_step.rs", + "disposition": "added", + "sha256": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3", + "admitted_predecessor_sha256": null, + "classification": "closed builtin execution and typed attempt owner", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Only BuiltinNativeV1 intent; aggregate-capped native/RHS/face/B1 scratch. Actual provisional request feeds original native producer/correction and B1 witness/actual-divergence gate. Producer/witness/fallback diagnostics and timing scopes stay distinct. Mixed witness fallback is retained but refused before publication; immutable accepted Arc and exact phase/iteration/report/index validation." + }, + { + "path": "src/provider_step.rs", + "disposition": "unchanged", + "sha256": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "admitted_predecessor_sha256": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/recording.rs", + "disposition": "changed", + "sha256": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "admitted_predecessor_sha256": "08a85d909ef6c566335675fddadbfdc245c42b4c894edf72aa41198036b0cd5f", + "classification": "existing recording owner registration", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds projection codec under the existing SQLite owner; no second archive, application/schema reinterpretation, transaction or store." + }, + { + "path": "src/recording/carrier.rs", + "disposition": "unchanged", + "sha256": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "admitted_predecessor_sha256": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/recording/comparison.rs", + "disposition": "unchanged", + "sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "admitted_predecessor_sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/recording/diagnostic.rs", + "disposition": "unchanged", + "sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "admitted_predecessor_sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/recording/material.rs", + "disposition": "unchanged", + "sha256": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "admitted_predecessor_sha256": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/recording/projection.rs", + "disposition": "added", + "sha256": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24", + "admitted_predecessor_sha256": null, + "classification": "additive cold custody codec", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "RPS1/RPP1/RPT1 wrap unchanged native RSC1/RCP2 payloads, bind exact source/intent/configuration/native report/time/output, prior inputs and monotone attempts where retained history permits. Complete encoded metadata shares existing16KiB bound; strict closed enum/version decoders. Terminals expose recorded versus unrecorded accepted tail; no runtime/restart construction." + }, + { + "path": "src/recording/projection_tests.rs", + "disposition": "added", + "sha256": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338", + "admitted_predecessor_sha256": null, + "classification": "cold SQLite and invalid-evidence contracts", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Real Session execution, clean fallback/mixed failure, close/drop/reopen, generation-zero cancellation, actual append quota failure/unrecorded tail, source/intent/version/size/interval/output/native-count corruption and duplicate/prior-input refusal. Existing old capture APIs explicitly refuse new intent." + }, + { + "path": "src/recording/provider.rs", + "disposition": "changed", + "sha256": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8", + "admitted_predecessor_sha256": "ca4abfb98c364cda5d3d830930ebe6773020e0d35aae756a33c718662e239b3d", + "classification": "shared native payload helper extraction", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Extracts same native capture/decode bodies for new wrapper while retaining old RSC1/RCP2 encoding and validators. Public old capture/run/runtime entrypoints reject projection snapshots before interpreting them as configured provider evidence." + }, + { + "path": "src/recording/provider/comparison.rs", + "disposition": "unchanged", + "sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "admitted_predecessor_sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/recording/provider/runtime.rs", + "disposition": "unchanged", + "sha256": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "admitted_predecessor_sha256": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/recording/workflow.rs", + "disposition": "unchanged", + "sha256": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "admitted_predecessor_sha256": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/sampling.rs", + "disposition": "unchanged", + "sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "admitted_predecessor_sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/scheduling.rs", + "disposition": "unchanged", + "sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "admitted_predecessor_sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/session.rs", + "disposition": "changed", + "sha256": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "admitted_predecessor_sha256": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", + "classification": "immutable intent/accepted receipt ownership", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds private immutable projection intent, bounded accepted Arc and checked attempt counter; registers private projection implementation and guards legacy step paths. Existing constructor defaults remain legacy and accepted quota/state ownership stays in Session." + }, + { + "path": "src/session/configured.rs", + "disposition": "changed", + "sha256": "4fd4f1783c6508e4a70d34bbb80e51cd5307242db31649188843fe59c7e4a054", + "admitted_predecessor_sha256": "b5c8978e20cf6d1ed2b183a2cb506dc7a15041049b1dfb91935cac954f8070a2", + "classification": "legacy intent guard", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Clears caller evidence first, then refuses immutable projection Session. Existing configured/G1 algorithm unchanged, including the explicitly known unresolved AdvectionError cancellation-label defect." + }, + { + "path": "src/session/projection.rs", + "disposition": "added", + "sha256": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc", + "admitted_predecessor_sha256": null, + "classification": "actual Session invocation and rollback", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Opt-in constructor validates closed configuration; one call observes an actual numerical interval with real source/generation/start/shortened dt. Checked attempt IDs survive failures; accepted steps/fields/receipt/history change only after complete Liquid success. Cooperative deadline/cancel phases, Arc exclusivity and typed mixed failure preserve accepted state. B2 recognizes advection cancellation without claiming legacy repair." + }, + { + "path": "src/session/projection_tests.rs", + "disposition": "added", + "sha256": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6", + "admitted_predecessor_sha256": null, + "classification": "core rollback and observation contracts", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Both native methods cover real checkpoints, clean field/momentum fallback versus unpublished mixed fallback, early/final deadlines, quota/stop/attempt exhaustion, Arc alias failure, native solve exhaustion/late volume failure, exact accepted receipt retention, successful retry, budget/domain and adversarial receipt-phase controls." + }, + { + "path": "src/sgs.rs", + "disposition": "unchanged", + "sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "admitted_predecessor_sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/simulation.rs", + "disposition": "changed", + "sha256": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "admitted_predecessor_sha256": "00740d13df6f3ab88e362504bf63b833d693e51c05c95b189c677d2460520a18", + "classification": "existing native kernel integration", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Adds optional private projection branch on actual post-advection/forces faces and actual dt; excludes incompatible boundary/surface/viscosity/provider/emitter/barrier paths. Copies B1 selected faces once without double correction, retains original downstream acceptance/publication path; candidate view is transient for digest sealing." + }, + { + "path": "src/solver_provider.rs", + "disposition": "unchanged", + "sha256": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "admitted_predecessor_sha256": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/solver_provider/composition.rs", + "disposition": "unchanged", + "sha256": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "admitted_predecessor_sha256": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/solver_provider/composition/projection.rs", + "disposition": "changed", + "sha256": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "admitted_predecessor_sha256": "e9a717ffc318c2345a4863369ff426c1f6d86f6ae4c3a5d312f2bfc459d33e4d", + "classification": "private successful scratch accessors", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Only two crate-private read-only pressure/velocity accessors for the integrated owner after successful B1 qualification. Public supplied-array semantics, failure paths and numerical gate remain unchanged." + }, + { + "path": "src/solver_provider/composition/projection_tests.rs", + "disposition": "unchanged", + "sha256": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "admitted_predecessor_sha256": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/solver_provider/composition_tests.rs", + "disposition": "unchanged", + "sha256": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "admitted_predecessor_sha256": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/solver_provider/configured.rs", + "disposition": "unchanged", + "sha256": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "admitted_predecessor_sha256": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/solver_provider/context.rs", + "disposition": "unchanged", + "sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "admitted_predecessor_sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/solver_provider/modal.rs", + "disposition": "unchanged", + "sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "admitted_predecessor_sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/static_obstacle.rs", + "disposition": "unchanged", + "sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "admitted_predecessor_sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/tracer_barrier.rs", + "disposition": "unchanged", + "sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "admitted_predecessor_sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/translated_viscous.rs", + "disposition": "unchanged", + "sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "admitted_predecessor_sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/viscosity.rs", + "disposition": "unchanged", + "sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "admitted_predecessor_sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/vtk_export.rs", + "disposition": "unchanged", + "sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "admitted_predecessor_sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/workflow.rs", + "disposition": "unchanged", + "sha256": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "admitted_predecessor_sha256": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "src/workflow/tests.rs", + "disposition": "unchanged", + "sha256": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "admitted_predecessor_sha256": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "tests/aligned_strain_contract.rs", + "disposition": "unchanged", + "sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "admitted_predecessor_sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "tests/obstacle_flow_contract.rs", + "disposition": "unchanged", + "sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "admitted_predecessor_sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "tests/static_obstacle_contract.rs", + "disposition": "unchanged", + "sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "admitted_predecessor_sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "tools/aligned_strain_oracle.py", + "disposition": "unchanged", + "sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "admitted_predecessor_sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "tools/qualify_aligned_strain.py", + "disposition": "unchanged", + "sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "admitted_predecessor_sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "tools/test_aligned_strain_oracle.py", + "disposition": "unchanged", + "sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "admitted_predecessor_sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + }, + { + "path": "tools/test_qualify_aligned_strain.py", + "disposition": "unchanged", + "sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "admitted_predecessor_sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "classification": "exact admitted predecessor identity reused", + "source_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "rationale": "Exact bytes equal fixed PR133/9c admitted identity; prior per-file admission/source review reused. This does not transfer historical execution receipts to B2." + } + ], + "limits": [ + "Read-only source/manifest review. No builds/tests/campaigns or active inventory/source/ref/PR mutation.", + "Only /tmp review artifacts written. No merge/publication retry.", + "No physical accuracy, learned runtime, GPU, Lean, performance, authentication or bit-reproducibility acceptance." + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.md new file mode 100644 index 00000000..acf1b081 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.md @@ -0,0 +1,45 @@ +# C1-B2 complete-source independent readiness review + +**Approved exact140 source for preparing separate explicit admission and fresh qualification.** No additional material finding. Head `e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4`, tree `24bf0d062bf366ddcbc4a3411ed4d832018f89c2`, base fixed PR133 `8bf542eddd8198008b6d77d52e009e9384998f18`; worktree clean at review. + +Verified the complete selector and all committed/working hashes: **140 = 5 added +10 changed +125 unchanged,0removed**. Map SHA256 `880129bcbf5a0f29dd82fe1c3bd4627474a97ec6f073a0c14191a9a596deed03`. Every reused predecessor identity matches exact fixed PR133 bytes. Cargo remains unchanged and independent of the Q2 stage. + +## Ownership and contracts + +The closed BuiltinNativeV1 path runs the actual native producer and B1 pressure/velocity qualifier on authoritative provisional fields and actual shortened dt. Capped scratch stays separate from accepted history. Original carrier/tracer/volume/final-cancel gates precede exclusive Arc/output-digest sealing and the existing infallible swaps/Session adoption. Failed attempts preserve accepted fields/quota/receipt. Producer, zero-iteration witness, native fallback and timings remain distinct; mixed pressure-witness metadata causes an unpublished typed failure instead of stripping facts. + +RPS1/RPP1/RPT1 use the existing SQLite owner and unchanged inner native RSC1/RCP2 validation, strict complete16KiB metadata caps, source/intent/time/output/prior-input/attempt links and explicit unavailable/unrecorded-tail coverage. Cold readers create no runtime. Old capture APIs and desktop/comparison consumers explicitly refuse this profile; B2 supplies no new GUI graph. + +## Source and evidence subjects + +All140 pins match consumer `a6e76a9` and final report head. Core `634404e` differs only in the three corrected lifecycle literals in workflow_inspector_tests.rs. Production/library/core/public-test/Cargo/toolchain blobs are identical. Reporting adds only evidence documents. The manifest’s213 passing executions and5 opt-in ignores reconcile arithmetically;19distinct new test definitions and the200-integrated-interval differential test source are present. Raw component logs/archive were unavailable locally; execution/artifact rehash results remain attributed to the recorded component reviewers, not repeated here. + +## Admission and remaining limits + +The existing strict v3 mechanism is sufficient; no selector/schema/oracle/primary change or v4 is required. Its current135-map refusal is correct. Lead may prepare a separately reviewed140-map and appended bounded review, then commit cleanly and run fresh native/rational/packet normal/-O qualification plus separately scoped B2 contracts. Historical133/9c and Q2/9a receipts remain fixed; none transfers to B2. + +**Known legacy G1 defect remains open:** VelocitySlice advection cancellation is labeled Failed by the unchanged configured mapper. It exists in the previously qualified9c/9a subjects; finite qualification did not establish that outcome-label gate. B2 handles it correctly but does not repair or globally accept G1-C. + +No source/inventory/ref/PR edits, builds, campaigns or merge/publication retries occurred. Full C1-B/C/R, stateful/external transaction/replay, whole-family/transfer, optional viscosity, physical/model/GPU/Lean/native-window/performance claims remain outside this approval. + +## Added/changed selected inputs + +| Path | Classification and rationale | +| --- | --- | +| `src/bin/desktop/inspector.rs` | **desktop consumer refusal.** Rejects the complete native-projection-session namespace after clearing cached reader/path/fields/workflow/selection, before adopting the new reader. No new graph or silent legacy interpretation. | +| `src/bin/desktop/workflow_inspector_tests.rs` | **desktop consumer contracts.** Actual projection archive and header-only pre-attempt cancellation fixtures prove namespace refusal clears retained G1 graph/evidence/gesture; future version uses a valid separately created header. Consumer freeze corrects only three lifecycle literals, preserving completed-requires-row. | +| `src/lib.rs` | **public owner registration.** Adds projection_step module without replacing existing provider/native-family paths or importing a numerical campaign. | +| `src/liquid_step.rs` | **atomic numerical publication plumbing.** Adds a private projection input alongside existing explicit legacy None routes, accounts workspace arrays, applies selected qualified faces once, preserves downstream volume/final-cancel ordering, seals prospective output digest before original infallible pressure copy/swaps. | +| `src/projection_step.rs` | **closed builtin execution and typed attempt owner.** Only BuiltinNativeV1 intent; aggregate-capped native/RHS/face/B1 scratch. Actual provisional request feeds original native producer/correction and B1 witness/actual-divergence gate. Producer/witness/fallback diagnostics and timing scopes stay distinct. Mixed witness fallback is retained but refused before publication; immutable accepted Arc and exact phase/iteration/report/index validation. | +| `src/recording.rs` | **existing recording owner registration.** Adds projection codec under the existing SQLite owner; no second archive, application/schema reinterpretation, transaction or store. | +| `src/recording/projection.rs` | **additive cold custody codec.** RPS1/RPP1/RPT1 wrap unchanged native RSC1/RCP2 payloads, bind exact source/intent/configuration/native report/time/output, prior inputs and monotone attempts where retained history permits. Complete encoded metadata shares existing16KiB bound; strict closed enum/version decoders. Terminals expose recorded versus unrecorded accepted tail; no runtime/restart construction. | +| `src/recording/projection_tests.rs` | **cold SQLite and invalid-evidence contracts.** Real Session execution, clean fallback/mixed failure, close/drop/reopen, generation-zero cancellation, actual append quota failure/unrecorded tail, source/intent/version/size/interval/output/native-count corruption and duplicate/prior-input refusal. Existing old capture APIs explicitly refuse new intent. | +| `src/recording/provider.rs` | **shared native payload helper extraction.** Extracts same native capture/decode bodies for new wrapper while retaining old RSC1/RCP2 encoding and validators. Public old capture/run/runtime entrypoints reject projection snapshots before interpreting them as configured provider evidence. | +| `src/session.rs` | **immutable intent/accepted receipt ownership.** Adds private immutable projection intent, bounded accepted Arc and checked attempt counter; registers private projection implementation and guards legacy step paths. Existing constructor defaults remain legacy and accepted quota/state ownership stays in Session. | +| `src/session/configured.rs` | **legacy intent guard.** Clears caller evidence first, then refuses immutable projection Session. Existing configured/G1 algorithm unchanged, including the explicitly known unresolved AdvectionError cancellation-label defect. | +| `src/session/projection.rs` | **actual Session invocation and rollback.** Opt-in constructor validates closed configuration; one call observes an actual numerical interval with real source/generation/start/shortened dt. Checked attempt IDs survive failures; accepted steps/fields/receipt/history change only after complete Liquid success. Cooperative deadline/cancel phases, Arc exclusivity and typed mixed failure preserve accepted state. B2 recognizes advection cancellation without claiming legacy repair. | +| `src/session/projection_tests.rs` | **core rollback and observation contracts.** Both native methods cover real checkpoints, clean field/momentum fallback versus unpublished mixed fallback, early/final deadlines, quota/stop/attempt exhaustion, Arc alias failure, native solve exhaustion/late volume failure, exact accepted receipt retention, successful retry, budget/domain and adversarial receipt-phase controls. | +| `src/simulation.rs` | **existing native kernel integration.** Adds optional private projection branch on actual post-advection/forces faces and actual dt; excludes incompatible boundary/surface/viscosity/provider/emitter/barrier paths. Copies B1 selected faces once without double correction, retains original downstream acceptance/publication path; candidate view is transient for digest sealing. | +| `src/solver_provider/composition/projection.rs` | **private successful scratch accessors.** Only two crate-private read-only pressure/velocity accessors for the integrated owner after successful B1 qualification. Public supplied-array semantics, failure paths and numerical gate remain unchanged. | + +The [machine-readable receipt](readiness-review.json) lists every140 path, digest, predecessor disposition and remaining gate. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/source-map-review-input.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/source-map-review-input.json new file mode 100644 index 00000000..eeb88582 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/source-map-review-input.json @@ -0,0 +1,313 @@ +{ + "status": "REVIEW_INPUT_NOT_ADMISSION", + "source_head": "d3e62377acde6641c8133cf9a9356cc046cfd02a", + "source_tree": "f8be6e0ef85a6a965545b2882bff11500c7f1dfd", + "base_stage": "8bf542eddd8198008b6d77d52e009e9384998f18", + "source_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "src/bin/desktop/settings.rs": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/forces.rs": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/projection_step.rs": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "src/recording/carrier.rs": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/material.rs": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "src/recording/projection.rs": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24", + "src/recording/projection_tests.rs": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338", + "src/recording/provider.rs": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "src/session/projection.rs": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc", + "src/session/projection_tests.rs": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "map_sha256": "08aa3d1b48617763da61291e788fc985bc5d011d8039f9ebf83fbc4ccc2a05a6", + "delta": { + "added": [ + "src/projection_step.rs", + "src/recording/projection.rs", + "src/recording/projection_tests.rs", + "src/session/projection.rs", + "src/session/projection_tests.rs" + ], + "changed": [ + "src/bin/desktop/inspector.rs", + "src/bin/desktop/workflow_inspector_tests.rs", + "src/lib.rs", + "src/liquid_step.rs", + "src/recording.rs", + "src/recording/provider.rs", + "src/recording/workflow.rs", + "src/session.rs", + "src/session/configured.rs", + "src/simulation.rs", + "src/solver_provider/composition/projection.rs" + ], + "unchanged": [ + "Cargo.lock", + "Cargo.toml", + "examples/aligned_strain.rs", + "rust-toolchain.toml", + "src/advection.rs", + "src/aligned_strain.rs", + "src/bin/desktop/README.md", + "src/bin/desktop/accepted_session.rs", + "src/bin/desktop/ai_comparison/accepted_provider.rs", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs", + "src/bin/desktop/ai_comparison/adapter.rs", + "src/bin/desktop/ai_comparison/configured_track.rs", + "src/bin/desktop/ai_comparison/configured_track_tests.rs", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs", + "src/bin/desktop/ai_comparison/diagnostic_view.rs", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs", + "src/bin/desktop/ai_comparison/engine.rs", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs", + "src/bin/desktop/ai_comparison/mod.rs", + "src/bin/desktop/ai_comparison/model_process.rs", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs", + "src/bin/desktop/ai_comparison/record.rs", + "src/bin/desktop/ai_comparison/scene.rs", + "src/bin/desktop/ai_comparison/view.rs", + "src/bin/desktop/ai_comparison/worker.rs", + "src/bin/desktop/archive_view.rs", + "src/bin/desktop/build_identity.rs", + "src/bin/desktop/camera.rs", + "src/bin/desktop/carrier_execution.rs", + "src/bin/desktop/collision_ui.rs", + "src/bin/desktop/comparison.rs", + "src/bin/desktop/comparison_archive.rs", + "src/bin/desktop/comparison_field_view.rs", + "src/bin/desktop/configured_comparison_tests.rs", + "src/bin/desktop/configured_controls.rs", + "src/bin/desktop/configured_producer_exit_tests.rs", + "src/bin/desktop/configured_worker_tests.rs", + "src/bin/desktop/emitter_controls.rs", + "src/bin/desktop/engineering.rs", + "src/bin/desktop/export_ui.rs", + "src/bin/desktop/history.rs", + "src/bin/desktop/identity.rs", + "src/bin/desktop/particle_view.rs", + "src/bin/desktop/run_set_view.rs", + "src/bin/desktop/run_sets.rs", + "src/bin/desktop/run_sets/configured.rs", + "src/bin/desktop/run_sets/configured/archive.rs", + "src/bin/desktop/run_sets/source.rs", + "src/bin/desktop/settings.rs", + "src/bin/desktop/transport_view.rs", + "src/bin/desktop/viewport.rs", + "src/bin/desktop/workflow_inspector.rs", + "src/bin/rheon-ai-compare.rs", + "src/bin/rheon-desktop.rs", + "src/bin/rheon.rs", + "src/box_flux.rs", + "src/box_flux_step.rs", + "src/collision.rs", + "src/column_mac.rs", + "src/column_momentum.rs", + "src/column_shear.rs", + "src/column_surface.rs", + "src/compressible.rs", + "src/coupled_discrete.rs", + "src/dense3d_sequence.rs", + "src/emitter.rs", + "src/emitter_controls.rs", + "src/export.rs", + "src/fitted_height.rs", + "src/fixed_bottom_ale.rs", + "src/forces.rs", + "src/free_surface.rs", + "src/geometry.rs", + "src/liquid_volume.rs", + "src/material.rs", + "src/material_session.rs", + "src/mesh_collision.rs", + "src/mesh_import.rs", + "src/motion.rs", + "src/native_family.rs", + "src/native_family/tests.rs", + "src/observation.rs", + "src/obstacle_pressure.rs", + "src/obstacle_shear.rs", + "src/operator.rs", + "src/parallel.rs", + "src/particle_fluid.rs", + "src/pressure.rs", + "src/pressure_session.rs", + "src/provider_step.rs", + "src/recording/carrier.rs", + "src/recording/comparison.rs", + "src/recording/diagnostic.rs", + "src/recording/material.rs", + "src/recording/provider/comparison.rs", + "src/recording/provider/runtime.rs", + "src/sampling.rs", + "src/scheduling.rs", + "src/sgs.rs", + "src/solver_provider.rs", + "src/solver_provider/composition.rs", + "src/solver_provider/composition/projection_tests.rs", + "src/solver_provider/composition_tests.rs", + "src/solver_provider/configured.rs", + "src/solver_provider/context.rs", + "src/solver_provider/modal.rs", + "src/static_obstacle.rs", + "src/tracer_barrier.rs", + "src/translated_viscous.rs", + "src/viscosity.rs", + "src/vtk_export.rs", + "src/workflow.rs", + "src/workflow/tests.rs", + "tests/aligned_strain_contract.rs", + "tests/obstacle_flow_contract.rs", + "tests/static_obstacle_contract.rs", + "tools/aligned_strain_oracle.py", + "tools/qualify_aligned_strain.py", + "tools/test_aligned_strain_oracle.py", + "tools/test_qualify_aligned_strain.py" + ], + "removed": [] + }, + "delta_from_pr136": { + "src/bin/desktop/workflow_inspector_tests.rs": { + "previous": "36cca640ad182ae9cc16195a2e8a58b110fd731a052047f62794cd004abb0239", + "current": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d" + }, + "src/recording/workflow.rs": { + "previous": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "current": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1" + }, + "src/session/configured.rs": { + "previous": "4fd4f1783c6508e4a70d34bbb80e51cd5307242db31649188843fe59c7e4a054", + "current": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4" + } + }, + "no_Cargo_Q2_delta": true +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-manifest.json b/docs/plans/fluid-accuracy-composition/reports/c1b2-manifest.json new file mode 100644 index 00000000..d9bdacf5 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-manifest.json @@ -0,0 +1,816 @@ +{ + "schema": "rheon-c1b2-local-native-projection-qualification-v1", + "status": "locally qualified closed builtin behavior; integration pending", + "base_commit": "8bf542eddd8198008b6d77d52e009e9384998f18", + "current_main": "718469beedb9a949f4bb6f3299c7b880b4c47e47", + "core_subject": { + "commit": "634404e9d07f1dc0319de48e89875128a28466db", + "tree": "445eff52cbf732a57702ed2b100d0104011bfa1d" + }, + "consumer_subject": { + "commit": "a6e76a91917ec9d85f213fa7387adc2c28feeb33", + "tree": "d27113e99884b0bd0d9319c5a5eb82586d005dcd" + }, + "evidence_split": { + "difference_paths": [ + "src/bin/desktop/workflow_inspector_tests.rs" + ], + "meaning": "three UI-test lifecycle literal corrections only; all production/library/core/public-test/Cargo/toolchain blobs identical", + "independent_architecture_approval": true, + "commands_not_relabelled_to_later_subject": true + }, + "toolchain": { + "rustc": "1.92.0 (ded5c06cf 2025-12-08)", + "cargo": "1.92.0 (344c4567c 2025-10-21)", + "host": "x86_64-unknown-linux-gnu" + }, + "environment": { + "PATH_prefix": "/tmp/rheon-cargo/bin", + "RUSTUP_HOME": "/tmp/rheon-rustup", + "CARGO_HOME": "/tmp/rheon-cargo", + "CARGO_PROFILE_TEST_DEBUG": "0", + "CARGO_PROFILE_DEV_DEBUG": "0", + "core_CARGO_TARGET_DIR": "/workspace/rheon-core-target", + "desktop_CARGO_TARGET_DIR": "/tmp/rheon-target" + }, + "green_summary": { + "passed_test_executions": 213, + "failed": 0, + "ignored_existing_opt_in": 5, + "distinct_new_c1b2_tests": 19, + "actual_integrated_substitution_intervals_per_method": 100, + "methods": 2, + "deciding_substituted_intervals": 200 + }, + "deciding_commands": [ + { + "path": "/workspace/rheon-c1b2-evidence/final-default.log", + "bytes": 2748, + "sha256": "d95c2cf55940bbf55d1f66b78e598d7b3eb1fc1ea3d3bc2d074202f392544709", + "source_commit": "634404e9d07f1dc0319de48e89875128a28466db", + "command": "cargo test --locked --lib --test projection_session_contract c1b2_ -- --nocapture", + "exit_code": 0, + "test_results": [ + "test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 68 filtered out; finished in 0.29s", + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 104.42s" + ] + }, + { + "path": "/workspace/rheon-c1b2-evidence/final-core-lib.log", + "bytes": 9362, + "sha256": "0d4348224cd5eaf0450df434c6962e43bce5d915ecb5f5bff7ff52409d8c2b32", + "source_commit": "634404e9d07f1dc0319de48e89875128a28466db", + "command": "cargo test --locked --no-default-features --lib", + "exit_code": 0, + "test_results": [ + "test result: ok. 82 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 45.84s" + ] + }, + { + "path": "/workspace/rheon-c1b2-evidence/final-contracts.log", + "bytes": 11802, + "sha256": "07cf0cd5494448b9c68634f8c17f8053de805706efa8e551e9a76467b02793ab", + "source_commit": "634404e9d07f1dc0319de48e89875128a28466db", + "command": "cargo test --locked --no-default-features --test recording_contract --test recording_provider_contract --test recording_provider_runtime_contract --test configured_provider_session_contract --test provider_step_contract --test solver_provider_contract --test pressure_session_contract --test recording_comparison_contract", + "exit_code": 0, + "test_results": [ + "test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.22s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.07s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.55s", + "test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s", + "test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.33s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.11s", + "test result: ok. 5 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s" + ] + }, + { + "path": "/workspace/rheon-c1b2-evidence/final-doctests.log", + "bytes": 538, + "sha256": "1aedb36362c8a6f5471d73982cbbebe9ac993c20b980e575f2ea273f410cf8f8", + "source_commit": "634404e9d07f1dc0319de48e89875128a28466db", + "command": "cargo test --locked --no-default-features --doc", + "exit_code": 0, + "test_results": [ + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s" + ] + }, + { + "path": "/workspace/rheon-c1b2-evidence/final-clippy-core.log", + "bytes": 106, + "sha256": "b437094700b39a18bae31cea4d5f4f5251377a3cdf03fc35fd2442e2b37a6598", + "source_commit": "634404e9d07f1dc0319de48e89875128a28466db", + "command": "cargo clippy --locked --no-default-features --all-targets -- -D warnings", + "exit_code": 0, + "test_results": [] + }, + { + "path": "/workspace/rheon-c1b2-evidence/consumer-ui.log", + "bytes": 2056, + "sha256": "b60a368e7f0ac16f0b9d55e3c1b964dc52bfb0a491bae477a92a7dc326d11b82", + "source_commit": "a6e76a91917ec9d85f213fa7387adc2c28feeb33", + "command": "cargo test --locked --features desktop --bin rheon-desktop workflow_inspector::tests::", + "exit_code": 0, + "test_results": [ + "test result: ok. 12 passed; 0 failed; 2 ignored; 0 measured; 152 filtered out; finished in 4.47s" + ] + }, + { + "path": "/workspace/rheon-c1b2-evidence/consumer-clippy-desktop.log", + "bytes": 105, + "sha256": "a78c749628bbf11676e1bb973c7ca5d83a09c2d9982be039351ad247601d7d77", + "source_commit": "a6e76a91917ec9d85f213fa7387adc2c28feeb33", + "command": "cargo clippy --locked --features desktop --all-targets -- -D warnings", + "exit_code": 0, + "test_results": [] + }, + { + "path": "/workspace/rheon-c1b2-evidence/consumer-fmt.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "source_commit": "a6e76a91917ec9d85f213fa7387adc2c28feeb33", + "command": "cargo fmt --all -- --check", + "exit_code": 0, + "test_results": [] + } + ], + "qualified_test_executables": [ + { + "built_path": "/workspace/rheon-core-target/debug/deps/rheon-d293312d0455f2e1", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/9ea2845b2a0186e9689ec8af83f50ec431157e12685f05027e1556d35962b06b-rheon-d293312d0455f2e1", + "sha256": "9ea2845b2a0186e9689ec8af83f50ec431157e12685f05027e1556d35962b06b", + "bytes": 46385024, + "execution_logs": [ + "final-default.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/projection_session_contract-a851ff4fba446d75", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/367859752e22bc43950eb0b202b39b2f056e685664a0e271a5fc218ce5ce577d-projection_session_contract-a851ff4fba446d75", + "sha256": "367859752e22bc43950eb0b202b39b2f056e685664a0e271a5fc218ce5ce577d", + "bytes": 6470488, + "execution_logs": [ + "final-default.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/rheon-2c0b8f9f964eff45", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/416498950dbb1aa6f848a3709c2b4f1e4a1838a8e54c53fe900109de3c664c4b-rheon-2c0b8f9f964eff45", + "sha256": "416498950dbb1aa6f848a3709c2b4f1e4a1838a8e54c53fe900109de3c664c4b", + "bytes": 46339560, + "execution_logs": [ + "final-core-lib.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/configured_provider_session_contract-7a47e2a64e933952", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/8acbee6de4ae30545f07b5e331cb38dc6013c4f5418621a344255281689b37e0-configured_provider_session_contract-7a47e2a64e933952", + "sha256": "8acbee6de4ae30545f07b5e331cb38dc6013c4f5418621a344255281689b37e0", + "bytes": 13113400, + "execution_logs": [ + "final-contracts.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/pressure_session_contract-536f0b07b486b9ae", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/bf7fce625d2179aeedc61e78e158ab6c0998cb3962afc06fddb819ccf3784186-pressure_session_contract-536f0b07b486b9ae", + "sha256": "bf7fce625d2179aeedc61e78e158ab6c0998cb3962afc06fddb819ccf3784186", + "bytes": 2260680, + "execution_logs": [ + "final-contracts.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/provider_step_contract-024046052e7e09fc", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/ea21cc683377a27b5990102a6f963de87ae4c1153d4c9c8275bae41e4da0cf05-provider_step_contract-024046052e7e09fc", + "sha256": "ea21cc683377a27b5990102a6f963de87ae4c1153d4c9c8275bae41e4da0cf05", + "bytes": 9625400, + "execution_logs": [ + "final-contracts.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/recording_comparison_contract-b830fe95a847344e", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/a8ee2ff625363341d8bbfaea1fc6db94e60dc5acd2a086b54761e095ab7bc58a-recording_comparison_contract-b830fe95a847344e", + "sha256": "a8ee2ff625363341d8bbfaea1fc6db94e60dc5acd2a086b54761e095ab7bc58a", + "bytes": 8274072, + "execution_logs": [ + "final-contracts.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/recording_contract-01e8969397d0bfcc", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/2b3609929d9a8ffa6975e50a1d477021c07116b001dd69b8fdd16317776fd9c0-recording_contract-01e8969397d0bfcc", + "sha256": "2b3609929d9a8ffa6975e50a1d477021c07116b001dd69b8fdd16317776fd9c0", + "bytes": 5607672, + "execution_logs": [ + "final-contracts.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/recording_provider_contract-4fd9d23bc6148b03", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/5a1586c7a8bacb0291465788b1df9085819a7ef43aa6161cbcad3f2380efb407-recording_provider_contract-4fd9d23bc6148b03", + "sha256": "5a1586c7a8bacb0291465788b1df9085819a7ef43aa6161cbcad3f2380efb407", + "bytes": 11340704, + "execution_logs": [ + "final-contracts.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/recording_provider_runtime_contract-479509e11f8147d8", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/3efc5c123a7fe32aeb70192cdc69a1ea0ebd98aa9a9d10df3e308ccb21ac68c9-recording_provider_runtime_contract-479509e11f8147d8", + "sha256": "3efc5c123a7fe32aeb70192cdc69a1ea0ebd98aa9a9d10df3e308ccb21ac68c9", + "bytes": 6768568, + "execution_logs": [ + "final-contracts.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/workspace/rheon-core-target/debug/deps/solver_provider_contract-4f9ffb3b3a91bb87", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/ae7a267e8f9f137ae4254f00acc955605098dd00192b4e7f6f1d1714c2605b01-solver_provider_contract-4f9ffb3b3a91bb87", + "sha256": "ae7a267e8f9f137ae4254f00acc955605098dd00192b4e7f6f1d1714c2605b01", + "bytes": 2087376, + "execution_logs": [ + "final-contracts.log" + ], + "source_commits": [ + "634404e9d07f1dc0319de48e89875128a28466db" + ] + }, + { + "built_path": "/tmp/rheon-target/debug/deps/rheon_desktop-1f5fbd0763f87c5a", + "retained_path": "/workspace/rheon-c1b2-evidence/qualified-executables/16e1d055d23f9e475b22bad8b7f743fc1e36b819406bf504f3fb58aeb35e62ae-rheon_desktop-1f5fbd0763f87c5a", + "sha256": "16e1d055d23f9e475b22bad8b7f743fc1e36b819406bf504f3fb58aeb35e62ae", + "bytes": 81673160, + "execution_logs": [ + "consumer-ui.log" + ], + "source_commits": [ + "a6e76a91917ec9d85f213fa7387adc2c28feeb33" + ] + } + ], + "source_files_changed_from_base": { + "docs/plans/fluid-accuracy-composition/reports/c1b2-protocol.md": { + "path": "/workspace/Rheon/docs/plans/fluid-accuracy-composition/reports/c1b2-protocol.md", + "bytes": 15504, + "sha256": "d869f1dbd91be9959eea80c21c296569832039a6b4030e42aa4e8fe984545222" + }, + "src/bin/desktop/inspector.rs": { + "path": "/workspace/Rheon/src/bin/desktop/inspector.rs", + "bytes": 45960, + "sha256": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719" + }, + "src/bin/desktop/workflow_inspector_tests.rs": { + "path": "/workspace/Rheon/src/bin/desktop/workflow_inspector_tests.rs", + "bytes": 44393, + "sha256": "36cca640ad182ae9cc16195a2e8a58b110fd731a052047f62794cd004abb0239" + }, + "src/lib.rs": { + "path": "/workspace/Rheon/src/lib.rs", + "bytes": 8218, + "sha256": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6" + }, + "src/liquid_step.rs": { + "path": "/workspace/Rheon/src/liquid_step.rs", + "bytes": 36342, + "sha256": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d" + }, + "src/projection_step.rs": { + "path": "/workspace/Rheon/src/projection_step.rs", + "bytes": 39120, + "sha256": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3" + }, + "src/recording.rs": { + "path": "/workspace/Rheon/src/recording.rs", + "bytes": 38513, + "sha256": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66" + }, + "src/recording/projection.rs": { + "path": "/workspace/Rheon/src/recording/projection.rs", + "bytes": 41730, + "sha256": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24" + }, + "src/recording/projection_tests.rs": { + "path": "/workspace/Rheon/src/recording/projection_tests.rs", + "bytes": 25135, + "sha256": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338" + }, + "src/recording/provider.rs": { + "path": "/workspace/Rheon/src/recording/provider.rs", + "bytes": 50926, + "sha256": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8" + }, + "src/session.rs": { + "path": "/workspace/Rheon/src/session.rs", + "bytes": 18461, + "sha256": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b" + }, + "src/session/configured.rs": { + "path": "/workspace/Rheon/src/session/configured.rs", + "bytes": 16564, + "sha256": "4fd4f1783c6508e4a70d34bbb80e51cd5307242db31649188843fe59c7e4a054" + }, + "src/session/projection.rs": { + "path": "/workspace/Rheon/src/session/projection.rs", + "bytes": 13763, + "sha256": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc" + }, + "src/session/projection_tests.rs": { + "path": "/workspace/Rheon/src/session/projection_tests.rs", + "bytes": 22118, + "sha256": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6" + }, + "src/simulation.rs": { + "path": "/workspace/Rheon/src/simulation.rs", + "bytes": 48355, + "sha256": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18" + }, + "src/solver_provider/composition/projection.rs": { + "path": "/workspace/Rheon/src/solver_provider/composition/projection.rs", + "bytes": 22377, + "sha256": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3" + }, + "tests/projection_session_contract.rs": { + "path": "/workspace/Rheon/tests/projection_session_contract.rs", + "bytes": 12089, + "sha256": "7af45f857acc24c13d699f42ca8e1b8452d8be3365da39deb79eb661b28193e1" + }, + "tests/recording_comparison_contract.rs": { + "path": "/workspace/Rheon/tests/recording_comparison_contract.rs", + "bytes": 42876, + "sha256": "80421b875312911e0fb0dd01155712df310b67ae21400bebf3bd686cc7ea56f2" + } + }, + "read_only_final_selected_source_map": { + "source": "a6e76a91917ec9d85f213fa7387adc2c28feeb33", + "selected": 140, + "added": [ + "src/projection_step.rs", + "src/recording/projection.rs", + "src/recording/projection_tests.rs", + "src/session/projection.rs", + "src/session/projection_tests.rs" + ], + "removed": [], + "changed": [ + "src/bin/desktop/inspector.rs", + "src/bin/desktop/workflow_inspector_tests.rs", + "src/lib.rs", + "src/liquid_step.rs", + "src/recording.rs", + "src/recording/provider.rs", + "src/session.rs", + "src/session/configured.rs", + "src/simulation.rs", + "src/solver_provider/composition/projection.rs" + ], + "unchanged": 125, + "source_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "src/bin/desktop/settings.rs": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "36cca640ad182ae9cc16195a2e8a58b110fd731a052047f62794cd004abb0239", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/forces.rs": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/projection_step.rs": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "src/recording/carrier.rs": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/material.rs": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "src/recording/projection.rs": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24", + "src/recording/projection_tests.rs": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338", + "src/recording/provider.rs": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "4fd4f1783c6508e4a70d34bbb80e51cd5307242db31649188843fe59c7e4a054", + "src/session/projection.rs": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc", + "src/session/projection_tests.rs": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "canonical_map_sha256": "880129bcbf5a0f29dd82fe1c3bd4627474a97ec6f073a0c14191a9a596deed03" + }, + "source_admission": { + "status": "pending lead-owned new complete-source review/qualification", + "command": "python3 docs/education/check_native_admission.py", + "subject": "a6e76a91917ec9d85f213fa7387adc2c28feeb33", + "exit": 1, + "reason": "reviewed native source inventory added or missing path", + "log": { + "path": "/workspace/rheon-c1b2-evidence/consumer-admission-refusal.log", + "bytes": 406, + "sha256": "c1df4c8bb0c2eb605b803033e3b33a92ced50219d906cd00211b4fc4b408ee86" + }, + "admission_files_modified": false + }, + "historical_evaluations": [ + { + "path": "/workspace/rheon-c1b2-evidence/first-core-evaluation.log", + "bytes": 577, + "sha256": "e8688e3d700f37208e0f5ba98dc1448e899125aaae97d80d8d64532d5e5c3e4a", + "source_commit": "f14c98c21ac8c259a9aa1c2e0ce230656cc73720", + "exit_code": 101, + "meaning": "missing Axis import; no executed tests" + }, + { + "path": "/workspace/rheon-c1b2-evidence/second-core-evaluation.log", + "bytes": 2863, + "sha256": "f6f9a34675f5b8b4af12c2d51697e7fd42cd5fbb3a6a92575685cdfb5a9598f7", + "source_commit": "7cb882b94cf4ec55a48734d75727c41cdbb0c442", + "exit_code": 101, + "meaning": "12 pass2 fail; public trajectory not executed" + }, + { + "path": "/workspace/rheon-c1b2-evidence/third-core-evaluation.log", + "bytes": 2592, + "sha256": "6f822fb689b476e496c10868b01ff1eabc4724085e7f6656cb28ec06ffcbbf42", + "source_commit": "28d8b9c83e671a501f31e8f1c981c8a4c4d36c32", + "exit_code": 0, + "meaning": "14+3 pass; earlier actual200 interval run" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-default.log", + "bytes": 2697, + "sha256": "e117cefbe137e39d875736c0b9c3328f19fd78b4c916f9bb85e9856f72d398b9", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 0, + "meaning": "earlier default14+3 pass" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-core-lib.log", + "bytes": 9317, + "sha256": "d30f5884850a495a4ca5d65a2a77da84f4486702579fa34a3729634d8f3cc0d3", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 0, + "meaning": "earlier82 pass" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-contracts.log", + "bytes": 11803, + "sha256": "c43d2986387a0a5f5cfdeb13d9f0b28019bf38c589a1a52152be3f1c33f5b3e5", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 0, + "meaning": "earlier99 pass3 ignored" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-doctests.log", + "bytes": 538, + "sha256": "fff57a27ea5c21eb35867ae071f04304fbdbacbef747a36306b27b7707648905", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 0, + "meaning": "earlier3 pass" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-desktop-inspector.log", + "bytes": 2833, + "sha256": "b21bf9145dc6da5452db4ad0ec33ebd5ff825e4d46d94fc9df5d98ee9afd39a2", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 101, + "meaning": "11 pass1 invalid-header fixture fail2 ignored" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-clippy-core.log", + "bytes": 4949, + "sha256": "e3e73ffa179d4b0641acd252c2de9babc1333298875d64e2b903454aaa797613", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 101, + "meaning": "5 style lints" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-clippy-desktop.log", + "bytes": 4949, + "sha256": "e3e73ffa179d4b0641acd252c2de9babc1333298875d64e2b903454aaa797613", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 101, + "meaning": "5 style lints" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-fmt.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 0, + "meaning": "format pass" + }, + { + "path": "/workspace/rheon-c1b2-evidence/qualified-admission-refusal.log", + "bytes": 406, + "sha256": "c1df4c8bb0c2eb605b803033e3b33a92ced50219d906cd00211b4fc4b408ee86", + "source_commit": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "exit_code": 1, + "meaning": "new source map not admitted" + }, + { + "path": "/workspace/rheon-c1b2-evidence/final-desktop-inspector.log", + "bytes": 2865, + "sha256": "36e4cc0523dbf2c0837c5cf172cb8ff67e0dc97b7fba1e3665f86d4f297420d1", + "source_commit": "634404e9d07f1dc0319de48e89875128a28466db", + "exit_code": 101, + "meaning": "11 pass1 invalid-completed-zero-row fixture fail2 ignored" + }, + { + "path": "/workspace/rheon-c1b2-evidence/final-clippy-desktop.log", + "bytes": 106, + "sha256": "56a156dae8cb02a0d04b629e36eea5bbceb95e031c54f718208cd9837b2b6f25", + "source_commit": "634404e9d07f1dc0319de48e89875128a28466db", + "exit_code": 0, + "meaning": "strict desktop pass before fixture-only correction" + }, + { + "path": "/workspace/rheon-c1b2-evidence/final-fmt.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "source_commit": "634404e9d07f1dc0319de48e89875128a28466db", + "exit_code": 0, + "meaning": "format pass before fixture-only correction" + } + ], + "initial_subjects_and_failed_executable": { + "path": "/workspace/rheon-c1b2-evidence/initial-evaluation-subjects.json", + "bytes": 736, + "sha256": "ba2e7ae586f16e08b455e40de2e4b5f486760e00b50fc3402d43a0ff3900d757" + }, + "pre_final_exact265_binary_records": { + "path": "/workspace/rheon-c1b2-evidence/pre-final-executables.json", + "bytes": 5896, + "sha256": "5372c00e09c9fd84b2c0f5c8a720b092e87ab630c52e14cb1c935051ca2391ff" + }, + "failed634_desktop_binary_record": { + "path": "/workspace/rheon-c1b2-evidence/failed-desktop-634-executable.json", + "bytes": 335, + "sha256": "dea6dca67b3c6a263d79f5bdce5e42da0cb38bc8f63fae1fd6f8d5ef6a4e776c" + }, + "checkpoint_lineage": [ + { + "local": "510e7736e66094bf7427288e6b626153b26e9ad3", + "published": "a515498e04bea1c0593dd50be94f001bd479ad07", + "tree": "deec5de0de0e4ce39f44cfd4e21505493791a461", + "tree_matches": true + }, + { + "local": "ecb7aa5277457a01364e8e3f62ce2194c4f1ba3c", + "published": "f392d72da49e8df010f7ba860d26242d0356cde2", + "tree": "1bc7b078050f1bf3753096a60a4124de03ff8921", + "tree_matches": true + }, + { + "local": "78a724c2cc6bd106bcc7c3bf0be8b6163ed5d468", + "published": "ef42249ad5db0e82c94482168a78205addda9ccd", + "tree": "b684d426ef8d6dd5d25f6d38ab887ae54497dc32", + "tree_matches": true + }, + { + "local": "25ecd9d36c62d42798768e1acc8af95a5d8523c6", + "published": "6326858dfce25d0d77956c3781b7b3a8e51c3961", + "tree": "69ad46226b4cbfd5d4322c0f2b54212379b91d10", + "tree_matches": true + }, + { + "local": "153b538280432da85b3050bf9d3697bf8d0b2f8e", + "published": "6521ee56502d0efb70008d9a7dbdd175d8bd5769", + "tree": "d7e733380b7bd57f262122fb2b851b0efe26e312", + "tree_matches": true + }, + { + "local": "f14c98c21ac8c259a9aa1c2e0ce230656cc73720", + "published": "20f92a6bffc0be01211e47d8728bb944dddcabc4", + "tree": "cedceb8eabc83221c4e2aaabece2a862d0d0c1a9", + "tree_matches": true + }, + { + "local": "7cb882b94cf4ec55a48734d75727c41cdbb0c442", + "published": "112f6fd591b4560e6c33a04c9f375d0183327ecf", + "tree": "778ba1048f0ee5c8a76b421fa0fd6da8939a3f94", + "tree_matches": true + }, + { + "local": "28d8b9c83e671a501f31e8f1c981c8a4c4d36c32", + "published": "265ce59edc81cfcd4e17f43d3da022d04feee58a", + "tree": "d2fd66fab9ee13dce0a78922dc5550ae72744cc7", + "tree_matches": true + }, + { + "local": "f6084f457143c0e1420f5eb8fc9e1d12e144d371", + "published": "634404e9d07f1dc0319de48e89875128a28466db", + "tree": "445eff52cbf732a57702ed2b100d0104011bfa1d", + "tree_matches": true + }, + { + "local": "898a35383fbdce3f63cd01aab81b263827dc4998", + "published": "a6e76a91917ec9d85f213fa7387adc2c28feeb33", + "tree": "d27113e99884b0bd0d9319c5a5eb82586d005dcd", + "tree_matches": true + } + ], + "archive": { + "path": "/workspace/rheon-c1b2-evidence.zip", + "bytes": 112256348, + "sha256": "d8b83fb55d38eb8c0eafa6f35c460d9b29b2b513b487bc3ca259faec4379c4c5" + }, + "archive_member_count": 63, + "archive_contains_only_external_raw_evidence_not_this_manifest": true, + "separate_existing_G1_finding": { + "meaning": "existing G1 cancellation label defect reproduced, not a passing qualification", + "owner": "configured Session/G1 observation follow-up", + "metadata": { + "path": "/workspace/rheon-c1b2-evidence/legacy-g1-cancel-probe.json", + "bytes": 785, + "sha256": "fb56620279f568445b23bb2f62ee03fe96735e78d13503a11d96fb003d72877e" + }, + "source": { + "path": "/workspace/rheon-c1b2-evidence/legacy-g1-cancel-probe.rs", + "bytes": 1673, + "sha256": "5b6ea4a78b9a52ea2250df312b935c6f79f57fea7588af93d788bde19f21b2bc" + }, + "build_log": { + "path": "/workspace/rheon-c1b2-evidence/legacy-g1-cancel-probe-build.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "log": { + "path": "/workspace/rheon-c1b2-evidence/legacy-g1-cancel-probe.log", + "bytes": 133, + "sha256": "5b8da83fa9b05b6a607cfe6ad60249e52c8eda745afbce56e14976b1b86c4624" + }, + "executable": { + "path": "/workspace/rheon-c1b2-evidence/legacy-g1-cancel-probe", + "bytes": 5818592, + "sha256": "ff909840650d0a89ba87db7188fd6ec6fdcec447fb28616baeb6de8a99b355a7" + }, + "fixed_in_new_B2_path": true, + "fixed_in_legacy_path": false + }, + "independent_reviews": { + "architecture": "PASS core634404e and approved exact evidence split", + "persistence_contracts": "PASS core634404e; independently rehashed63artifact records,8deciding logs,12retained green executables,140source pins,10checkpoint pairs and63ZIPmembers with0mismatches", + "native_consumers": "PASS a6e76a9 completed consumer execution" + }, + "remaining": { + "complete_source_admission": "lead", + "hosted_checks_and_merges": "lead", + "canonical_plan_and_ledger": "lead", + "legacy_G1_advection_cancel_label": "reproduced separate follow-up", + "full_C1_B_C_R_and_stateful_external_providers": "not accepted" + }, + "not_claimed": [ + "new native-window execution", + "performance qualification", + "physical validation", + "scientific accuracy", + "GPU", + "Lean", + "learned provider", + "fresh140-path native/rational admission", + "merge acceptance" + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-protocol.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-protocol.md new file mode 100644 index 00000000..3d547181 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-protocol.md @@ -0,0 +1,63 @@ +# C1-B2 native projection Session and custody protocol + +Frozen before implementation/evaluation on2026-10-20. Canonical authority: docs/plans/fluid-accuracy-composition/plan.md, operation continue under the parent's explicit direction to resume bounded Session/publication/custody integration when PR133 clears local admission. Admitted revision/base:8bf542eddd8198008b6d77d52e009e9384998f18, branch implement/c1b2-native-projection-session-20261020, target PR133 integration/native-admission-fluid-20261020. Current fetched main718469beedb9a949f4bb6f3299c7b880b4c47e47. Lead owns canonical plan/ledger, source admission, serial integration, merges and cleanup; none are delegated here. + +## Gate disposition and retained evidence + +PR131 head97cdce6/tested34e2e73 repairs the iteration validator. PR133 includes it and independently audited clean native/rational/packet and focused contracts at9c04278e6cdd44418628c35f944c1730cbe6173e. Root and independent architecture reviewer each checked all135 selected pins at both9c04278 and8bf542e:270 checks each,0mismatches; map SHA2569af9e8fceeb49febc428301ca51f0c428bfc25e38203d6eccd23fdece031e8e8, admission SHA2563cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330, bound review SHA2569e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c. PR133's last commit changes only documentation. Its retained ZIP is unavailable in this executor; execution/raw48-file/ELF evidence is the committed independent audit, not a duplicate local run. + +Local source-admission/iteration hold is cleared for stacked development. C1-B1 protocol explicitly permits this before dependency merges; pending hosted checks block merges/integration acceptance, not this separately authorized development. PR133 qualifies its fixed subject only. New B2 source will invalidate that source map and requires a new lead-owned admission/qualification before integration. No admission input, selector, inventory, bound review, numerical campaign or Q2 source is edited. Historical failed results/receipts and protected PR59/audit119/plan120 remain intact. No merge, rebase, force update or cleanup. + +## Bounded usable outcome + +Provide an opt-in immutable closed BuiltinNativeV1 intent in the existing SimulationSession. New constructor new_with_projection and step_with_native_projection execute the existing native pressure/correction kernel on actual provisional native faces, qualify those pressure/faces with B1, and adopt all selected faces/pressure only through the existing complete Liquid/Session publication. Existing pressure-v1 APIs, old Session constructors and old archive meanings remain unchanged. Legacy step APIs refuse projection Sessions before mutation; projection step refuses legacy Sessions. No universal scheduler, tensor registry, conversion or second accepted history. Particle and whole-family/transfer variants remain unavailable under their existing gates. + +Only the sealed stationary constant-density MAC domain is admitted, no optional viscosity stage in this bounded new API. Producer and fallback use the Session's actual configured PressureImplementation; both existing implementations are covered. No caller-supplied provider, stateful candidate, subprocess, learned runtime, hidden external transaction or arbitrary side effect is reachable. Such support still needs prepare/abort/uncertain-commit invalidation/replay gates. This delivers actual native subgraph invocation/Session adoption/cold custody, not full C1-B/C/C1-R or physical accuracy. + +At the existing pressure seam after actual advection/forces, bind Session identity/generation, full accepted-input digest, call-controls digest, actual shortened interval and B1's actual provisional field fingerprint. Run the original producer workspace, copy provisional fields to capped candidate arrays and use the original in-place correction. B1 uses a separate capped workspace; copy its qualified velocity exactly once, without another correction. Select its actual final pressure for Liquid's existing precommit pressure copy. Every original Courant/tracer/volume/final-cancel gate stays in order. A transient prospective native view permits output-digest sealing before commit without another history array or liquid_volume.rs edit. + +## Receipt and failure contract + +projection_step.rs owns closed version1 ProjectionIntent, ProjectionStepWorkspace, ProjectionAttempt, attempt/outcome/stage/failure enums and serializable observation facts. ProjectionAttempt binds version/intent/SessionIdentity/monotone attempt_id/accepted_generation/optional next generation/start/requested and actual dt/accepted-input digest/controls digest/optional provisional ProjectionInputId/optional producer and host-qualification facts/outcome/optional full output digest. Outcome is Published with exact generation, Refused with stage/code, Cancelled with stage or Failed with stage/code. Only observed completed facts are present. Bounded source/diagnostic text and unknown variants refuse; no arbitrary decoded static strings. + +Producer facts preserve actual method, real PressureReport iterations and elapsed scope (builtin pressure plus copied-input correction). Host qualification facts preserve selection, closed field/momentum/pressure/actual-divergence rejection, candidate/discarded pressure witness diagnostics, native-fallback method/diagnostics/solve timing and full B1 elapsed time as distinct roles. Pressure witness iterations are0; native iterations are bounded by immutable pressure settings. Do not relabel B1 witness execution as the original native producer. + +Strict custody policy: supplied-candidate success reuses the original real native producer ProviderReport. Field/momentum rejection before bridge dispatch, or a separate actual-divergence retry, may publish only a clean actual native-only final B1 report. If a B1 pressure-witness rejection yields mixed attempted/rejection/candidate metadata, terminate with typed UnrepresentableMixedQualificationFallback before publication, retaining observed failed-attempt facts. Never strip that metadata, invent a pure native timing, duplicate a solve for a receipt or relabel fallback as candidate success. A private cfg(test) fault seam exercises these outcomes; production intent has no fault/provider selector. + +Allocate the Arc receipt before work; mutation requires exclusive Arc ownership and sealing requires another exclusivity check. Complete all fallible validation/allocation and final cancellation before sealing the successful full output digest. Original Liquid swaps and Session receipt adoption then invoke no callbacks or fallible work. Snapshot exposes only the most recent accepted Arc; returned failure carries its separate attempt, preserving all accepted fields/history/quota/receipt. Attempt ids advance across observed failures; checked exhaustion returns a typed error with no fabricated/reused attempt. Deadline remains cooperative, checked before/after callbacks. ProjectionStepStage distinguishes original Liquid checkpoints, producer pressure polls and B1 qualification checkpoints. + +## Additive persistence and consumer boundary + +Use the existing SQLite v1 RecordingRun/RecordedStep/StepRecorder/RecordingReader owner. New profile rheon-native-projection-session-v1; RPS1 configuration binds raw unchanged RSC1 plus immutable intent. RPP1 binds outer source/intent, unchanged native-only RCP2 accepted fields and exact attempt. RPT1 retains source/accepted-position/latest-attempt/cause and explicit recorded versus accepted-unrecorded-tail coverage through the same finish owner. This is inspection evidence, not restart or authentication. + +Internal native capture/decode helper extraction may reuse existing bytes/validators without interpreting old profiles differently. Old configured capture entrypoints explicitly refuse projection snapshots. Decoder checks outer profile/configuration/intent/source binding, inner native method==constructor method, absence of configured-provider bindings, exact interval/generation/publication, bounded native iterations and zero witness iterations, accepted metrics, observed stage consistency, full output digest and prior input/attempt links where retained history supplies them. Provisional identity is retained evidence; do not claim reconstruction without provisional fields. Maximum additional aggregate metadata16KiB; malformed/unknown/corrupt/cross-linked/oversized representations refuse without fallback. Cold inspection needs no producer/runtime. Old RCP2/RCP3/RCP4/RCT1/RCT2 continue unchanged. + +Desktop graph inspection for the new profile is explicitly unavailable in B2. Inspector refuses the new rheon-native-projection-session- namespace before adopting a reader, preserving existing cache/evidence/gesture invalidation. Exact comparison already has a closed supported-profile allow-list; add negative evidence. Do not display a new profile as legacy G1 or reinterpret its fields as configured-pressure evidence. Native library cold inspection is implemented; no new graph GUI feature or native-window acceptance is claimed. + +## Exact write set and owners + +- Core author /root/native_ui: NEW src/projection_step.rs, src/session/projection.rs and focused adjacent core tests; existing src/simulation.rs, src/liquid_step.rs, src/session.rs, src/session/configured.rs only for private intent/plumbing/pressure selection/precommit receipt/legacy guards. No provider_step.rs numerical change is needed. +- Persistence author /root/persistence_review: NEW src/recording/projection.rs and adjacent focused tests; src/recording/provider.rs only helper extraction and projection-profile capture refusal. No old workflow/runtime format change. +- Root: src/lib.rs and src/recording.rs module declarations/reexports; NEW tests/projection_session_contract.rs; src/bin/desktop/inspector.rs and src/bin/desktop/workflow_inspector_tests.rs for explicit unavailable consumer/test; tests/recording_comparison_contract.rs for closed-profile refusal. c1b2-prefixed reports/protocol/review/manifest under this directory. Canonical plan/ledger/claim register stay lead-owned. + +Shared declarations remain serially root-owned; other workers do not edit them. New source owner, runtime, schema reinterpretation, numerical formula, Q2 or admission-file need triggers bounded replan before expansion. Independent architecture, persistence/contracts and native-consumer reviewers author no implementation for this slice. Root coordinates one build owner; no duplicate parallel Cargo builds. + +## Fixed deciding evidence + +Freeze before evaluation: Rust1.92.0, locked dependencies, native CPU f32 faces/f64 pressure/fractions. G1/C1-A fixture16³ over1m³, rho998.2, fraction.5, acceleration[.001,0,0], requested dt.001, pressure relative1e-10/absolute1e-12/predicted1e-8/actual1e-5/max2000, maxCourant1,16MiB individual declared caps, quota>=100. For EACH existing pressure implementation compare100 actually accepted integrated new-path intervals against the same direct original Session native path, bitwise every field/stamp/pressure/fraction/time, numerical diagnostics excluding elapsed-time equality. Validate accepted receipt and request/output linkage at every interval. This is contract equivalence, not new accuracy. + +Actual shortening reuses configured_provider_session_contract's5³/.25/rho2/fraction1 binary uniform acceleration[.125,.0625,.0625], maxCourant1/128, requested dt2, relative1e-14/absolute1e-16/predicted1e-7/actual1e-5/max3000,4MiB caps; assert actual dt clean same-input native fallback; bad gauge/pressure causing mixed B1 metadata -> typed unpublished failure, preserving all diagnostics. B1 already owns representation/shape/gauge/wrong-dynamics negatives; rerun those as applicable rather than claiming arbitrary candidate support. + +Real SQLite constructor/accepted/failed/cancelled/accepted-unrecorded-tail capture, close/drop producer and cold reopen; corrupt profile/version/size/source/intent/interval/input/output/count/duplicate-attempt tests; selected and whole-history validation; old serializer and desktop/comparison refusal. Existing workflow/native-family/composition/configured-provider/recording/runtime contracts, borrow doctests, strict no-default/desktop all-target Clippy and formatting. All regression fixture values/tolerances above stay fixed; failed runs remain retained. No allocator fault injection, arbitrary process failure, native-window/performance/physical/GPU/learned acceptance inferred. + +Lifecycle: Active -> Implemented -> Verifying -> locally qualified only for this closed B2 behavior if evidence passes. Publish focused dependent draft PR with exact tested source, commands/log/executable/source hashes and independent dispositions. Lead-owned fresh complete-source admission, hosted checks and integration remain pending before merge; do not mutate admission to make local CI green. + +Independent architecture admission at510e773: PASS. Before codec evaluation, clarify the16KiB budget above as the maximum for EACH COMPLETE encoded RPS1/RPP1/RPT1 metadata string, including prefix, wrapped inner payload and hex overhead, within the existing recording MAX_TEXT; it is not16KiB of outer additions. On qualification Err, unobserved partial diagnostics remain absent/unavailable. Checkpoint callback phase never establishes an unobserved pressure acceptance or fallback report. These clarifications preserve existing limits and observation semantics. + +Within the new projection_step owner, the producer may own the original ProviderWorkspace plus a counted RHS array directly (the same nine-cell-array footprint), rather than the ProviderStepWorkspace wrapper. Its private RHS does not expose the observed receipt threshold. Call the same existing build_rhs/solve(None) kernels and derive receipt-only residual_l2_limit with the identical compensated norm; change no numerical solve, correction, order or accepted gate. This avoids an extra provider_step.rs owner and keeps its source unchanged. + +Bounded owner addition before evaluation: root may add only a crate-private read-only selected-pressure scratch accessor to src/solver_provider/composition/projection.rs. Liquid's infallible commit needs the successful B1 pressure after the borrowed qualified view ends. This avoids a duplicate pressure array and reads only after successful qualification; it changes no solver, formula, public qualifier semantics or error path. No other B1 edit is admitted. + +The same bounded accessor admission includes a crate-private read-only qualified-velocity scratch accessor. End the immutable provisional-field borrow before obtaining the mutable carrier fields, then copy directly from B1's selected XYZ once. This avoids an intermediate face copy and changes no algorithm or public qualifier contract. Both accessors are root-owned; the core author does not edit B1. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-qualification.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-qualification.md new file mode 100644 index 00000000..7e0efe59 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-qualification.md @@ -0,0 +1,64 @@ +# C1-B2 closed native projection Session qualification + +Status: **locally qualified closed native projection invocation/publication/custody; integration pending**. This delivers actual accepted Session intervals and cold SQLite inspection, not only supplied-array interfaces. The [frozen protocol](c1b2-protocol.md) retains the bounded scope and pre-evaluation amendments. [Independent reviews](c1b2-review.md) and [exact evidence manifest](c1b2-manifest.json) retain subjects, failures and limits. Canonical plan/ledger reconciliation belongs to the repository lead. + +## Admission and current authority + +Parent explicitly authorized resuming this integration after inspecting PR133's fixed admission. Base/admitted revision is8bf542eddd8198008b6d77d52e009e9384998f18, tested base9c04278e6cdd44418628c35f944c1730cbe6173e, with PR131 iteration repair retained. Root and independent architecture reviewer each verified135 selected pins at both base subjects with0mismatches. The retained native-qualification ZIP is unavailable in this executor; its18-command/packet/ELF execution evidence is the committed independent audit, not a duplicate local execution. + +Frozen C1-B1 explicitly permits stacked development after local prerequisites; it does not require their merge. Thus the local development hold cleared, while hosted checks and merge acceptance stayed pending. Fresh final lookup still found PR133 draft/unmerged at8bf542e and fetched main718469beedb9a949f4bb6f3299c7b880b4c47e47. The new branch targets integration/native-admission-fluid-20261020. No rebase, merge, force update, cleanup, canonical status edit, admission-file edit or Q2 numerical edit was performed. + +## Implemented behavior + +SimulationSession::new_with_projection fixes a closed BuiltinNativeV1 intent. step_with_native_projection obtains actual post-advection/force native faces and shortened dt from the existing Simulation owner, executes the configured native pressure/correction producer, and runs the existing B1 host qualifier. All selected qualified faces are copied once and the selected B1 pressure feeds the existing Liquid pressure copy. Original Courant, tracer, volume and final cancellation gates still precede the sole infallible publication swaps. A full output digest and exclusively owned Arc receipt are sealed before those swaps; Session adopts that same Arc only after complete publication. + +The accepted snapshot exposes its most recent accepted projection receipt. Observed attempts, including failures, advance identity; an exhausted counter returns a typed error without fabricating an attempt. Observed failures retain separate evidence, consume no accepted-step quota, and preserve accepted arrays/pressure/frame/receipt. Producer pressure iterations/timings, B1 zero-iteration pressure witness, discarded witness, actual native fallback solve and final native dispatcher report remain distinct. Selected native diagnostics and times are linked to their observed owner rather than inferred from passing residuals. + +Both existing pressure implementations are supported, with producer==configured native fallback. Production accepts no caller provider, process, model, stateful candidate, optional viscosity stage, alternative family or implicit transfer. Private test-only faults exercise actual clean same-input field/momentum fallback. Mixed pressure-witness fallback retains its observations but terminates unpublished, because this bounded native-only inner custody cannot truthfully represent it as a clean native call. No metadata stripping or duplicate solve creates apparent success. Full C1-B/C/C1-R and stateful/external transaction/replay support remain unaccepted. + +The additive rheon-native-projection-session-v1 profile uses RPS1/RPP1/RPT1 in the existing SQLite owner, with unchanged inner native RSC1/RCP2 semantics. Cold readers verify source/intent/configuration, actual interval/generation, input/output/prior links, observed phase, native iteration limits, witness zero counts and exact selected native reports. Prior-input links require a preceding retained native publication; missing history is reported as unavailable coverage. Complete encoded metadata is capped at the existing16KiB limit. Recorded failure and accepted-unrecorded-tail coverage remain distinct. Inspection reconstructs no process, model or restart state. Old configured capture APIs explicitly refuse projection snapshots; old RCP2/RCP3/RCP4/RCT1/RCT2 parser semantics remain unchanged. + +The new profile's native desktop graph is explicitly unavailable. Inspector refuses its namespace before adopting a reader and clears prior selection/graph/evidence/gesture state. Existing comparison refuses it as UnsupportedProfile even with compatible native field shapes. The native library's typed projection reader provides actual cold inspection. Old G1 terminal None on this profile means unavailable G1 evidence, not proof of a legacy archive or absent terminal status. + +## Exact qualification matrix + +Core execution subject: **634404e9d07f1dc0319de48e89875128a28466db**, tree445eff52cbf732a57702ed2b100d0104011bfa1d. Final consumer subject: **a6e76a91917ec9d85f213fa7387adc2c28feeb33**, tree d27113e99884b0bd0d9319c5a5eb82586d005dcd. The only difference is three lifecycle literals in workflow_inspector_tests.rs: the empty test archives now declare cancellation before any numerical attempt, preserving the generic rule that completed archives need a row. Every production/library/core-test/public-contract/Cargo/toolchain blob is identical. Independent architecture review approved this precise evidence split; core checks are not relabelled as execution at the later consumer head. + +| Command | Exact subject | Observed result | +| --- | --- | --- | +| cargo test --locked --lib --test projection_session_contract c1b2_ -- --nocapture | 634404e | 14 unit +3 public contracts pass | +| cargo test --locked --no-default-features --lib | 634404e | 82 pass,0 ignored | +| cargo test --locked --no-default-features --test recording_contract --test recording_provider_contract --test recording_provider_runtime_contract --test configured_provider_session_contract --test provider_step_contract --test solver_provider_contract --test pressure_session_contract --test recording_comparison_contract | 634404e | 99 pass,3 existing opt-in ignored | +| cargo test --locked --no-default-features --doc | 634404e | 3 compile-fail borrow contracts pass | +| cargo clippy --locked --no-default-features --all-targets -- -D warnings | 634404e | exit0 | +| cargo test --locked --features desktop --bin rheon-desktop workflow_inspector::tests:: | a6e76a9 | 12 pass,2 existing opt-in ignored | +| cargo clippy --locked --features desktop --all-targets -- -D warnings | a6e76a9 | exit0 | +| cargo fmt --all -- --check | a6e76a9 | exit0 | + +Total deciding green executions: **213 passed,0 failed,5 existing ignored**. New C1-B2 tests are19 distinct tests, with14 unit tests executed in both feature configurations. The ignored contracts require explicit real learned-artifact exports; ignored UI fixtures are explicit native-smoke preparation and release capture/performance. None ran or counts as passed. + +The public differential test advances100 actually accepted integrated intervals for EACH pressure implementation against the original native Session path:200 substituted intervals, with corresponding baseline intervals. Every native field/pressure/fraction bit, time/stamp/frame and numerical report matches; timings are excluded from equality. The actual shortened5³ fixture matches and binds actual dt. Earlier successful exploratory subjects28d8b9c/265ce59 retain their separate200-interval executions; they are not additional accuracy campaigns or silently transferred subjects. + +Other deciding groups cover observed cancellation checkpoints, final-crossed deadline, native iteration exhaustion, actual late volume failure, quota/stop/counter exhaustion, Arc alias refusal, immutable accepted receipt/history and clean retry; impossible phase/report/count/index combinations; real SQLite close/drop producer/reopen; source/intent/version/size/input/output/interval/attempt corruption; actual append-limit accepted tail; and configured/desktop/comparison profile refusal. Header-only UI fixtures declare pre-attempt cancellation; they do not claim a simulated cancelled interval. Actual numerical cancellation is exercised separately in core/cold tests. + +Environment: Rust/Cargo1.92.0, x86_64-unknown-linux-gnu; RUSTUP_HOME=/tmp/rheon-rustup, CARGO_HOME=/tmp/rheon-cargo, PATH prefix /tmp/rheon-cargo/bin, dev/test debug information0. Core target /workspace/rheon-core-target; desktop target /tmp/rheon-target. Root coordinated all Cargo execution. Reviewers performed no duplicate builds. Logs and preserved executables remain under /workspace/rheon-c1b2-evidence; the manifest binds exact source/log/binary identities. + +Raw evidence archive: /workspace/rheon-c1b2-evidence.zip,112256348bytes, SHA256d8b83fb55d38eb8c0eafa6f35c460d9b29b2b513b487bc3ca259faec4379c4c5,63members. It contains retained logs/metadata/probe/executables; these reports and manifest are separate, avoiding a self-referential hash. No prior campaign archive was overwritten. + +## Retained failed evaluations + +All checkpoints and failed logs remain. f14c98c first failed compilation due to a missing test Axis import, with no executed tests. 7cb882b executed12 passing/2 failing library tests: an actual advection cancellation was mislabeled Failed in the new receipt, and a private64-cell fault was applied to an8-cell test fixture. Its executable is retained separately; the public trajectory binary was not executed on that failing run. 28d8b9c corrected cancellation, fixture and independently discovered reverse mixed-report validation, then passed14+3 focused tests. + +265ce59 broad core/default/contracts/doctests passed, while five style lints and the future-profile UI fixture failed. That fixture's direct header mutation invalidated its archive digest before reaching the intended guard. 634404e fixed style and used a fresh valid future header; its UI fixture then exposed the unchanged completed-archive-requires-row rule. The final test-only cancellation declarations fix both empty fixtures without changing production or weakening either guard. Both failed desktop binaries, failed outputs and exact subjects remain retained. No earlier failure is presented as a final pass. + +Git HTTPS publication remained unavailable after credential loss. Official authorized GitHub create-tree/create-commit/expected-head non-forced update published byte-identical local checkpoint trees. The manifest preserves local/published lineage, including failed checkpoints. Final tests ran on fetched published subjects as recorded. No credential extraction, history rewrite or cleanup was used. + +Retained resources: no task-created worktree. Local implement/c1b2-native-projection-session-20261020 retains28d8b9c, implement/c1b2-evaluated-20261020 retainsf6084f4, implement/c1b2-qualified-20261020 retains898a353, and implement/c1b2-consumer-qualified-20261020 retainsa6e76a9 plus reporting descendants. Final implement/c1b2-published-20261020 retains the published reporting head. The remote implementation branch retains the published equivalent trees and final reports. All original G1/C1/audit/plan/PR59 resources remain protected. Terminal cleanup is handed to the lead after accepted-target reachability and commit disposition; none was performed here. + +## Remaining integration gates and separate finding + +At final consumer source the unchanged educational checker still exits1 with `reviewed native source inventory added or missing path`. Read-only discovery selects140 paths:5 added,10 changed,125 unchanged,0 removed against PR133's135. The complete handoff map is retained externally and hashed in the manifest. This is a source-identity gate before numerical comparison, not a numerical test failure. The lead must independently review and freshly qualify its actual final integration source; no inventory, admission review, selector, packet or qualifier was modified here. Hosted CI/Pages/browser and merge disposition remain pending with the lead. Historical G1 normal-window/performance evidence and PR133 native/rational receipts retain their own sources. + +A separate existing G1 observation defect was reproduced using the retained native library: step_with_configured_pressure_observed cancelled at VelocitySlice returns Step(Carrier(Advection(Cancelled))) but its workflow outcome is Failed, with publicationNone and accepted generation0. The old mapper omits AdvectionError::Cancelled. The new B2 mapper handles it correctly. Source/build/executable/log probe evidence is retained, outside Git, and not counted as a passing qualification. Owner: existing configured Session/G1 observation follow-up; this B2 branch changes that old file only for its admitted intent guard. No old-path repair or fresh full G1 acceptance is claimed. + +No new scientific accuracy, physical validation, GPU, Lean, learned-provider, native-window or performance qualification follows. Future Q2 boundary work and numerical selections remain disjoint and independent of this composition slice. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b2-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b2-review.md new file mode 100644 index 00000000..2f54257b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b2-review.md @@ -0,0 +1,31 @@ +# Independent review: C1-B2 native projection integration + +Scope: frozen c1b2-protocol.md, base8bf542e. Core qualification source634404e9d07f1dc0319de48e89875128a28466db; final consumer sourcea6e76a91917ec9d85f213fa7387adc2c28feeb33. This review is not complete-source admission, merge approval or full C1-B/C/R acceptance. + +## Architecture /root/architecture_review: PASS + +Independently verified the135 selected source identities at PR1338bf542e and its tested9c04278, inventory/review bindings and no production difference. Frozen gates permit stacked local development. The retained qualifier archive is unavailable in this executor; execution evidence rests on its committed independent audit. + +Reviewed actual source flow: actual provisional native request, counted producer/RHS/B1/face capacities, selected B1 pressure, one qualified-face copy, unchanged downstream Courant/tracer/volume gates, prospective full output digest and exclusive receipt sealing before only original infallible swaps/Session adoption. No formula/order/domain widening or second accepted history. Strict mixed-report refusal is coherent and retains observations without fabricating pure native custody. + +Early reachable findings were fixed before qualification: early Liquid validation needed a preparation phase, and the legacy observation guard needed to clear its output first. The reverse mixed-failure implication was also tightened with discriminating negatives. Source PASS at28d8b9c was subsequently bound to published634404e after verifying equivalent style-only changes. + +Approved the final split evidence matrix: a6e76a9 changes only three UI-test lifecycle literals. Every production/library/core/public-test/Cargo/toolchain blob is identical to634404e. Exact core results remain634404e; corrected consumer results remaina6e76a9. Repeating100 integrated intervals solely for a desktop fixture change is unnecessary. Fresh lead-owned140-path admission still must bind final bytes. No reviewer edits or duplicate builds. + +## Contracts/persistence /root/persistence_independent: PASS + +Reviewed closed receipt association tables, rejected IEEE witness preservation with zero iterations, inclusive native caps, bounded indices, observed phase/outcome prefixes, selected producer/fallback numeric/timing equality and symmetric mixed-outcome retention. Early gaps were sent to the author and fixed with negative controls. Positive fallback-cap admission applies only to the new intent, preserving legacy cap-zero semantics. + +Reviewed additive RPS1/RPP1/RPT1 source/configuration/intent binding, unchanged native RSC1/RCP2 nesting and old helpers, complete16KiB limits, exact selected pressure/all four native durations, interval/output/prior-input/attempt ordering, streamed history and unrecorded accepted tails. Old public capture refuses projection Sessions without widening old parsing. Core/codec source PASS at28d8b9c and confirmation at634404e; the final UI-only fixture change does not alter those reviewed owners. No reviewer edits/builds. + +## Native consumers /root/native_ui_independent: PASS + +Final exact subjecta6e76a91917ec9d85f213fa7387adc2c28feeb33, tree d27113e99884b0bd0d9319c5a5eb82586d005dcd. Verified namespace refusal after clearing prior reader/path/record/configured/carrier/material/workflow/selection and before adopting a new reader. WorkflowInspector then clears graph/evidence/pan gesture through its existing unavailable state. Comparison's closed profile allow-list refuses new fields before reduction. Typed projection decoding keeps its separate identity; old G1 terminal None is explicitly unavailable, not a legacy-status inference. + +Independently read complete consumer-ui.log:12 passed,0 failed,2 existing ignored; accepted and constructor-cancelled v1 cases and future-v2 refusal all completed. Strict desktop Clippy and formatting completed cleanly. Earlier failed fixtures are retained and not relabelled. No consumer blockers, reviewer edits/builds or new native-window qualification. + +## Authorship and evidence verification + +/root/native_ui authored core integration/private fixtures; /root/persistence_review authored custody/helper extraction/SQLite fixtures; root authored shared declarations, public trajectory and consumer refusal/tests, publication and coordinated verification. None self-accepts their authored scope. Final report/manifest identities are independently verified before publication. Canonical status, complete-source admission, hosted integration and merges remain lead-owned. + +Final artifact verification by /root/persistence_independent: PASS,0mismatches. Rehashed63artifact records, all8deciding logs and213/0/5 totals,12retained green executables,140source pins against both exacta6 committed blobs and worktree, unchanged selector/path delta,10local/published checkpoint tree pairs/lineage, exact core/consumer difference and all63ZIPmembers against external originals. Archive SHA256d8b83fb55d38eb8c0eafa6f35c460d9b29b2b513b487bc3ca259faec4379c4c5 and112256348bytes verified. The separate G1 probe remains a reproduced defect, not a passing gate. Architecture independently recomputed213passing executions and19distinct new tests and approved final claim limits. Its counter-exhaustion/coverage wording corrections are incorporated. Only the manifest's review-status text changed after the rehash; no evidence bytes/values changed. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.json b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.json new file mode 100644 index 00000000..4e1d1497 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.json @@ -0,0 +1,107 @@ +{ + "schema": "rheon-c1b3-final-admission-metadata-independent-review-v1", + "status": "APPROVED_EXACT_METADATA_PROTOCOL_DRIVER_FOR_CLEAN_COMMIT_AND_FRESH_QUALIFICATION_ATTEMPT", + "reviewed_at_utc": "2026-10-20T04:55:53.125270+00:00", + "candidate_head": "906928dbbd83286f7a106ac06fe9e377dac785b0", + "candidate_tree": "7bf2d474d2351c23599c59984102bed5e2b2a8ee", + "candidate_has_uncommitted_reviewed_metadata": true, + "retained_ancestors": [ + "186dc0a18f787748eb723d91321e44ffd0e374d5", + "5dc1741feffa88b857194559b3e7e79be5369a64", + "38c40ca7b4b2401e0ac802f12c647f7229072f52" + ], + "selected_count": 140, + "selected_map_sha256": "6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d", + "selected_delta_vs186": { + "changed": 8, + "unchanged": 132, + "added": 0, + "removed": 0 + }, + "all140working_candidate_committed_and_owner5dcpins_verified": true, + "selected_complete_working_and_committed_sets_verified": true, + "proposed_repo_document_count": 6, + "proposed_repo_doc_sha256": { + "docs/education/aligned-strain-native-sources-integration-20261014.json": "8cc04634cb3e7831884273bf3c9a4bac21f52e3b0735be344101cba6bcf058ba", + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/protocol.md": "1a0191d997fceb54002f647996c609a46387e003dd524c12090a8faeef74c16c", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.json": "6463884e5a2ed9fd079ea72d77d5790dba951efcb08f495330ba0bfcf997b3ab", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.md": "989a54f511e7b9ba69d33bcfbfaa76b93d348c5c3bbff6ee7ab31bed2ae1c7ea", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/source-map-review-input.json": "7fa2845366100c768049a482f33d496b2f19c25c4ceed50691cb5ccdbfd9fa2d" + }, + "external_driver_sha256": "797cf4495fa3eb7f3539f22a5a92c0342d6f83663bc409bce6575f1ce93e2163", + "total_reviewed_change_inputs_including_driver": 7, + "old186_bound_review_sha256": "caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941", + "old186_review_prefix_bytes": 81227, + "full_prefix_byte_preserved": true, + "v3_schema_base_predecessors_and_binding_verified": true, + "immutable_mechanism_and_cargo_pins": { + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800" + }, + "final141_docs_merge": { + "guard_sha256": "9eca6036aa27782c914995fdcef67fec28af62086175cf997ca75e0d1784cf83", + "head": "38c40ca7b4b2401e0ac802f12c647f7229072f52", + "actual11pathdiff": [ + "docs/plans/fluid-accuracy-composition/execution-ledger.md", + "docs/plans/fluid-accuracy-composition/issues.md", + "docs/plans/fluid-accuracy-composition/plan.md", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md", + "docs/plans/fluid-accuracy-composition/reports/cv3a-review/audit.json", + "docs/plans/fluid-accuracy-composition/reports/cv3a-review/recommendation.md", + "docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.json", + "docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.md", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "docs/plans/fluid-accuracy-composition/reports/verification.md" + ], + "selected_and_metadata_protocol_unchanged": true + }, + "driver_static_review": { + "executed": false, + "syntax_ast_checked": true, + "assert_nodes": 0, + "normal_python_optimization_cleared": true, + "packet26eachmode_and_exact_OK_guard": true, + "exclusive_initial_journal_logs_nativecopy": true, + "actual_native_build_receipt_hash_check": true, + "testELF_hashcopy_and_duplicate_identity_check": true, + "fresh_target_native_packet_journal_absent_observed": true, + "command_failure_stops_and_preserves_results": true, + "clean_HEAD_before_after": true, + "ambient_compiler_override_observation": {}, + "scope": "Bounded task-owned recipe, not a hermetic build wrapper or sandbox. Existing inherited environment must remain declared; no auth/reproclaim." + }, + "prospective_protocol_review": { + "claim": "Separate closed stateless producer-selection/reference/native-contract attempt, no new whole-C1/physical/model/desktop/runtime capability.", + "execution": "Unchanged18native/35Rust/5specimens, newreal26normal+26-Opacket0skip, fullno-default97library expectedsource, all6B2+B3public contracts, legacy99+volume23 andborrow3; actualcountsrecorded, existingignoreshonest.", + "custody": "Fullcommittedsource andactualexecutables/rawsource/receipts/packet retained; nativeharness collection/archive/CRC/Library andindependentfinalaudit remain post-driver obligations.", + "resource": "New task-ownedtarget/output, jobs2/incremental0/debug0 with unchanged opt-level/debugassertions; disk/RAM/command failure blocked, nootherownerdeletion/skip/stalereceipt.", + "failure": "Anyfailed/incomplete driver state isnot final acceptance. No numerical campaign/implicit retry/refresh." + }, + "findings": [], + "approval_conditions": [ + "Commit exactly reviewed metadata/protocol/source-review bytes before invoking driver; actual qualification source is that fresh clean commit, not906 orowner5dc.", + "If any selected input/mechanism/Cargo/boundreview/protocol/driver changes, re-review relevant delta before execution.", + "Preserve old186/Q2/owner227receipts andfailed evidence; no metadata edits afterqualification.", + "Driver command PASSED doesnotitselfseal/archive/collectnestednativeharnesses: complete protocolpostprocessing and independently verify actualfocused/nativeELFcounts+everyartifact/CRC before final evidence acceptance.", + "Missing/unreadable parsed testELF isnot finalcustody success: driver only copies observed existing files, so finalactual-executable audit mustrejectmissingrecords.", + "Refreshcaptureactualtoolchain/declaredcompiler overrides atlaunch; ambient knownoverride observationwasempty here, butdriverisinheritedenvnothermetic.", + "Hosted/default/desktop/nativewindow/release/performance/model/physical/Lean/GPU,combinedQ2andfullC1remainseparate." + ], + "limits": [ + "No driver/native/test/campaign execution, source/ref/PR edits, builds or merges by reviewer. Only external review receipts written.", + "Actualfinal141docs-onlymergeverifiednow; no futuremergefactsapproved.", + "No authenticity or bitreproducibility claim." + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.md new file mode 100644 index 00000000..e3a92307 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.md @@ -0,0 +1,29 @@ +# C1-B3 final admission metadata/protocol review + +**Approved exact proposed metadata/protocol/driver for a clean commit and fresh qualification attempt; no material finding. No execution or qualification acceptance is implied.** + +Current composed head `906928dbbd83286f7a106ac06fe9e377dac785b0`, tree `7bf2d474d2351c23599c59984102bed5e2b2a8ee`, retains both qualified186 `186dc0a18f787748eb723d91321e44ffd0e374d5` and owner `5dc1741feffa88b857194559b3e7e79be5369a64`. All140 working and committed selected identities equal the approved owner map `6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d`:8changed/132same/0added/removed vs186. Complete working/committed selectors match;132exact reused inputs, immutable primary/mechanism, Cargo/toolchain and original v1/v2 inventories remain unchanged. + +Inventory `8cc04634cb3e7831884273bf3c9a4bac21f52e3b0735be344101cba6bcf058ba` binds appended review `a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b`. Every81227byte of the186 review (SHA256 `caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941`) remains an exact prefix. Schema/base/predecessor identities are unchanged. Copies of the independent140-path source review are verbatim. There are **6proposed repository document files**, plus the separately reviewed externaldriver (7inputs total), not7repositorydocs. + +Final PR141 `38c40ca7b4b2401e0ac802f12c647f7229072f52` was actually merged into this candidate. Its saved guard matches the exact11docs-only diff from1405179. None changes the140selected map, admission files or prospective protocol. This is verified actual composition, not approval of a future unspecified merge. + +The protocol keeps owner227/5, prior186 and independentQ2 custody/source scopes separate. It calls for fresh unchanged18-command native/rational execution,35Rust/5specimens, an actual packet with26normal+26optimized checks/no skips, complete no-defaultlibrary, all6B2/B3public projection tests, eightlegacy targets/twovolume suites andborrow compile-fail tests. Finalcounts must come from logs; no model/artifactignore becomes an executed pass. Bounded scratch failure stops/replans; no resource policy permits deleting another owner's cache or importing stale evidence. + +Externaldriver SHA256 `797cf4495fa3eb7f3539f22a5a92c0342d6f83663bc409bce6575f1ce93e2163` was read and syntax/AST checked without execution. Its guards use explicit require/raises (0assertnodes), clear ambient Pythonoptimization for normalmode, require a clean source/new target/new native+packet+journal, open initial journal/log/nativecopy exclusively, bind actual native ELF hash to its receipt, retain observed testELF copies by hash, stop on command failure and verify cleanunchanged HEAD at completion. Packetguards require exactly26 and exactOK, thereby refusing skipped suites normally and under-O. Known ambient compiler override variables were unset at review; recordactual launch toolchain/overrides, since this inherited-environment recipe is not hermetic. + +**Attempt conditions:** commit these exact bytes first; re-review any input change. Freeze boundmetadata/protocol afterexecution. The driver records command completion, while native nestedharness capture, archive sealing/CRC/hash/Library and final independent evidence review remain mandatory postprocessing. Its observed-testELF loop copies only files present: a missing executable must be caught as failedcustody by that final audit, never inferred present from a testsummary. Do not equate driverPASSED with completeartifactacceptance. + +No source changes, builds/tests/campaigns, ref/PR mutations or merges were performed by this reviewer. Full hosted/default/desktop/nativewindow/release/performance/physical/model/Lean/GPU,combinedQ2andfullC1acceptance remain separate. Bytecustody is not authentication or bitreproducibility. + +| Reviewed path | SHA256 | +| --- | --- | +| `docs/education/aligned-strain-native-sources-integration-20261014.json` | `8cc04634cb3e7831884273bf3c9a4bac21f52e3b0735be344101cba6bcf058ba` | +| `docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md` | `a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b` | +| `docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/protocol.md` | `1a0191d997fceb54002f647996c609a46387e003dd524c12090a8faeef74c16c` | +| `docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.json` | `6463884e5a2ed9fd079ea72d77d5790dba951efcb08f495330ba0bfcf997b3ab` | +| `docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.md` | `989a54f511e7b9ba69d33bcfbfaa76b93d348c5c3bbff6ee7ab31bed2ae1c7ea` | +| `docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/source-map-review-input.json` | `7fa2845366100c768049a482f33d496b2f19c25c4ceed50691cb5ccdbfd9fa2d` | +| external `run-fresh-qualification.py` | `797cf4495fa3eb7f3539f22a5a92c0342d6f83663bc409bce6575f1ce93e2163` | + +The [machine-readable review](final-admission-review.json) records exact ancestry, mergeguard, preservedprefix, mechanism pins, driver findings and attempt conditions. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/protocol.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/protocol.md new file mode 100644 index 00000000..fd04a827 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/protocol.md @@ -0,0 +1,99 @@ +# Separate C1-B3 native source admission protocol + +Prospective protocol; no result yet. The separate stage retains final PR140 +`5dc1741feffa88b857194559b3e7e79be5369a64`, core +`4af3802babe332d8dfeb926c19159b4b656be775` and consumer +`9ddf8d2fd860c73bbcc35a077e08099d894db07a`, alongside the independently qualified +PR141/186dc0a source and its immutable evidence. The consumer changes only one +UI-test call to the public selection API. Final owner reporting changes no +source. Normal local composition preserves both histories; no public merge, +production implementation, user-data mutation or model training is authorized. + +## Complete reviewed subject + +The unchanged complete selector finds the same 140 regular nonsymlink inputs: +0 added, 8 changed, 132 unchanged, 0 removed against both PR137 and qualified +186dc0a. Canonical sorted compact map SHA256 (no trailing newline): +`6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d`. +The eight pins are desktop inspector/tests, projection-step contract, +recording projection/tests/provider, Session projection/tests. Two changed public +contract targets are also independently reviewed and executed, although outside +the existing selector. All committed files are recorded in the fresh source +receipt. Cargo, toolchain, selector, checker, primary ancestry, v1/v2 predecessors, +oracle, qualifier, packet and 132 reused inputs remain exact. Q2 Cargo/CV1/CV2 +sources are not included. Old 140-map refusal is expected and retained. + +Use the existing explicit v3 reviewed-refresh mechanism only. Preserve every +prior bound-review byte, append the independently approved decision, and bind its +digest and complete reviewed map in the inventory. Commit protocol/reviews and +metadata together before clean fresh qualification; freeze these bytes after +execution. Admission permits an attempt and does not turn hashes into evidence. + +## Bounded behavioral claim + +ClassicalSelectionV1 chooses the other existing native pressure method with a +positive producer cap no greater than the constructor's cap. Among producer errors, +only actual IterationLimit is recoverable by retrying the original immutable +input with constructor full-cap fallback; cancellation/other errors terminate +unpublished. Existing B1 field/momentum-rejection fallback remains; mixed-pressure +witness fallback refuses publication. Existing B1 qualifier, +Liquid gates, actual shortened interval and complete Session atomic commit remain +owners. Additive RPS2/RPP2/RPT2 record distinct producer/fallback/actual identities. +Foreign outer-intent and embedded-attempt versions must refuse before payload +parsing at configuration, publication and terminal ingress. Existing configured +and version-1 custody remains strict; desktop graph/comparison explicitly refuses +the new namespace. No stateful/learned/external/whole-family admission follows. + +Owner 227 passing executions and five existing ignored tests, original compile +and old-profile refusal-category failures, repairs and custody remain attributed +to core/consumer subjects. Fresh lead evidence is a different recipe and cannot +be relabelled as those owner runs. No owner raw archive is claimed rehashed. + +## Frozen execution and resource recipe + +Use a new external target `/workspace/rheon-c1b3-admission-20261020-build` and new +output `/workspace/rheon-c1b3-admission-20261020-evidence`, including previously +absent initial journal, native output, actual executable copy and packet. Use +Rust/Cargo1.92.0, actual Python3.12 patch recorded, jobs2, incremental0, dev/test +debug0; retain default opt-level0/debug assertions and clear ambient Python +optimization. Record all compiler overrides, exact driver hash, commands, +head/tree, full source hashes and every exit/log. No allow-dirty, dirty refresh, +stale receipt, source edit, scientific campaign or implicit retry. + +1. Validate committed admission, locked Cargo metadata and formatting. +2. Run the unchanged native qualifier:18 commands,35 Rust contracts,5 actual + exporter/rational specimens, normal/optimized gate5+5 and oracle10+10. +3. Copy the actual newly built exporter ELF, verify its receipt hash, generate a + new packet and execute exactly26 normal plus26 optimized packet tests with + zero skips. Cardinality/skip guards must fail closed. +4. Execute complete no-default library, all public projection_session_contract + cases, eight legacy recording/provider/session/comparison targets, two volume + targets and borrow compile-fail doctests. This verifies both old B2 and new B3 + differentials, actual low-cap fallback and strict legacy refusal behavior. Do + not guess final counts; record actual summaries and existing ignores. +5. Verify source/head still clean and unchanged. Retain actual test ELF paths and + bytes from Cargo execution lines, native harnesses and actual exporter. Seal + all raw logs, receipts, actual packets/source hashes/ELFs into a new archive; + check every member CRC/hash, retain in Library and persist all returned xattrs. +6. Obtain independent execution and result-document reviews. Publish results as + separate files, never edit the bound protocol/inventory/review after execution. + +Scratch was measured at roughly400MiB after verifying all17 prior actual ELFs +and the98-member sealed C1-B2 archive, then retiring only root's reconstructible +306MiB C1-B2 target. Retained source/evidence/Library files and other-owner caches +are untouched. New build/evidence must fit available scratch; disk/RAM/command +failure is retained as a blocked result, not permission to delete another owner's +files, skip a gate or reuse a receipt. CPU jobs remain2; no numerical experiment +is part of this contract execution. Scope-expanding backend or resource changes +require a recorded replan. + +## Publication and remaining gates + +Publish a separate dependent draft on final PR141; leave PR133/138/141 and their +actual qualified subjects/receipts unchanged. Recheck exact-head hosted results +on each dependency. Queued/skipped runs are not acceptance; full combined Q2/C1 +closure requires another explicit source review and fresh qualification. +Default/desktop/native-window/release/performance, scientific/physical/Lean/GPU, +full C1-R and production acceptance remain separate. CV3-A is a separate numerical +preparation admission and has no result. Public merges remain paused after the +automatic approval rejection; no alternate merge route or repeated retry. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.json b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.json new file mode 100644 index 00000000..5839824f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.json @@ -0,0 +1,502 @@ +{ + "actual_retained_ELFs": [ + { + "bytes": 62095984, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/3c98f5ffdc3211c4d503ddd60b76bcc516ee498579490ad55a48459ded53143e-rheon-a429e726eb179735", + "sha256": "3c98f5ffdc3211c4d503ddd60b76bcc516ee498579490ad55a48459ded53143e" + }, + { + "bytes": 7247240, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/9f082291f8120480b312ea471db2981e7516557d647f3b148181665dc48562ba-projection_session_contract-99cd44f78c569f0c", + "sha256": "9f082291f8120480b312ea471db2981e7516557d647f3b148181665dc48562ba" + }, + { + "bytes": 13178288, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/841d8e7f29ff10e0603aa600cb078400039d9225456ed80e0b8b502a018aa035-configured_provider_session_contract-18899f217e5c3858", + "sha256": "841d8e7f29ff10e0603aa600cb078400039d9225456ed80e0b8b502a018aa035" + }, + { + "bytes": 3664232, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/1d66871fd50c6e17e690de4af830d970ea1a23f7c364a655e8745c7e754e0f4d-liquid_volume_contract-feec3ae32dcbefe5", + "sha256": "1d66871fd50c6e17e690de4af830d970ea1a23f7c364a655e8745c7e754e0f4d" + }, + { + "bytes": 1859016, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/ddf6d008a7668da8cb1f08388d66c4d69c064a07b2bc19e52e6a3b405caa239f-liquid_volume_periodic_contract-09940e33b41d83b5", + "sha256": "ddf6d008a7668da8cb1f08388d66c4d69c064a07b2bc19e52e6a3b405caa239f" + }, + { + "bytes": 2250688, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/f279d97d83367466737d5e57486ee1b1b6fce06ef21a800be480216d0a46883c-pressure_session_contract-e18df0f878334b98", + "sha256": "f279d97d83367466737d5e57486ee1b1b6fce06ef21a800be480216d0a46883c" + }, + { + "bytes": 9668656, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/bfd5f2f24b273c8019f30b4761f202f87f0a90f1246d42ca08a805aca81b556b-provider_step_contract-952a7149c0ec5a53", + "sha256": "bfd5f2f24b273c8019f30b4761f202f87f0a90f1246d42ca08a805aca81b556b" + }, + { + "bytes": 8299296, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/251a48387dde81fae81af42b862fe5f1da90198869fc671b2595b42898bfc0d1-recording_comparison_contract-205af27e4f04bdad", + "sha256": "251a48387dde81fae81af42b862fe5f1da90198869fc671b2595b42898bfc0d1" + }, + { + "bytes": 5595152, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/faff5e7060dfecf7705ebb1092d454e217ceb6d79b181f36e09ffef30566fa5f-recording_contract-db2765a72a4388d0", + "sha256": "faff5e7060dfecf7705ebb1092d454e217ceb6d79b181f36e09ffef30566fa5f" + }, + { + "bytes": 11376632, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/be26241d906d86f9a2dd6cb626fc81015d267a3f5f11cdedd017644c46cd006f-recording_provider_contract-4563aa0dbc51be38", + "sha256": "be26241d906d86f9a2dd6cb626fc81015d267a3f5f11cdedd017644c46cd006f" + }, + { + "bytes": 6771328, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/486873ea3032ee5777f0c0f50176ccd4260f375cff5052768dd5bc50bdeaf140-recording_provider_runtime_contract-5507579fbf15a50a", + "sha256": "486873ea3032ee5777f0c0f50176ccd4260f375cff5052768dd5bc50bdeaf140" + }, + { + "bytes": 2077080, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-executables/c0c961f403eef7dfbe61aaa338c53d093167a4c90626dd670714ec9c8af3f6ee-solver_provider_contract-c6be55ff3e264ba9", + "sha256": "c0c961f403eef7dfbe61aaa338c53d093167a4c90626dd670714ec9c8af3f6ee" + }, + { + "bytes": 2142488, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-native-contract-executables/8a2d89690bdb9299c95148fb296229e2216a590fc7a56dfe13fee83b942bee4e-aligned_strain_contract-2260b287e32432c2", + "sha256": "8a2d89690bdb9299c95148fb296229e2216a590fc7a56dfe13fee83b942bee4e" + }, + { + "bytes": 2691368, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-native-contract-executables/7da18661e6be7924196d00fde9afd0192cf5266c35a3e66b15343bad56ede2fc-obstacle_flow_contract-960c9dc0be44c2f9", + "sha256": "7da18661e6be7924196d00fde9afd0192cf5266c35a3e66b15343bad56ede2fc" + }, + { + "bytes": 2039176, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-native-contract-executables/060183193e6aa352af74279da3ecb1a86b9e4ba4f6477de150c09f1b6ea8b7eb-static_obstacle_contract-b0d0ccb0b94e567b", + "sha256": "060183193e6aa352af74279da3ecb1a86b9e4ba4f6477de150c09f1b6ea8b7eb" + }, + { + "bytes": 1599680, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/qualified-native-contract-executables/c4fc04c31ef9b34efa8dfc9badb0608f19a021b16aa682cd5889d1319f024a37-aligned_strain-e0c34e514a40a128", + "sha256": "c4fc04c31ef9b34efa8dfc9badb0608f19a021b16aa682cd5889d1319f024a37" + }, + { + "bytes": 1477264, + "path": "/workspace/rheon-c1b3-admission-20261020-evidence/aligned-strain-native-executable", + "sha256": "76564683b20d236c8b6ac0f7240d43f36289485dded8e18dd6b2c62b2a2bb0bb" + } + ], + "archive": { + "all_crc_hash_and_raw_bytes_match": true, + "bytes": 28934812, + "member_count": 76, + "members": { + "aligned-strain-native-executable": { + "bytes": 1477264, + "sha256": "76564683b20d236c8b6ac0f7240d43f36289485dded8e18dd6b2c62b2a2bb0bb" + }, + "ambient-compiler-overrides.json": { + "bytes": 216, + "sha256": "5ef0d59aa992da29b9b39219bb5e176069ff08f82dd1482b64e6555d4e099274" + }, + "borrow-doctests.log": { + "bytes": 538, + "sha256": "b48541ae21c30a52a64e05a1a790d0563edf8097edf4f35b297cc67f11fd6934" + }, + "build-cache-retirement.json": { + "bytes": 1646, + "sha256": "46f612e309501de4f680f568549e00f0008c33434df0fc55a2964a3d15ea7408" + }, + "committed-admission-check.log": { + "bytes": 262, + "sha256": "6c7012e74731646f8e0096e8fc59a099453fe1acf73624bc139a76c3acae44a1" + }, + "committed-format-check.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "committed-locked-metadata.log": { + "bytes": 33632, + "sha256": "013f1ebdb923726d78e19e40d1a3fddcd63206f129e8ddf5b49aca56704fe96d" + }, + "complete-source-review-input.json": { + "bytes": 15290, + "sha256": "7fa2845366100c768049a482f33d496b2f19c25c4ceed50691cb5ccdbfd9fa2d" + }, + "execution-context.json": { + "bytes": 17373, + "sha256": "00191b291832547e2c037044b56ba6401ed2c993760220db294a46c661986e43" + }, + "final-admission-review/final-admission-review.json": { + "bytes": 7915, + "sha256": "c55e52878f4f357494e75609f5055b8e94063b3d5b7ef6fa027a17d7bfbc5643" + }, + "final-admission-review/final-admission-review.md": { + "bytes": 5149, + "sha256": "8101644a9391537be9ce18fc7b8b8af1c400ebec5de8bc1b4be7ee09b63df3e9" + }, + "final141-docs-only-merge-guard.json": { + "bytes": 985, + "sha256": "9eca6036aa27782c914995fdcef67fec28af62086175cf997ca75e0d1784cf83" + }, + "focused-complete-library.log": { + "bytes": 11103, + "sha256": "3264e091275a01e4794773926e8cf4f51cd67d28f925ba53d795399ae270af74" + }, + "focused-legacy-recording-volume.log": { + "bytes": 14403, + "sha256": "81c132c72d7ec100d0aa1b87691fe69bd7779cf9e222436e86ac68222d22ef16" + }, + "focused-projection-session.log": { + "bytes": 1117, + "sha256": "7f6678b960001158d63d8d6d971992e64728177f0d603b1cc6bfe618718a8348" + }, + "frozen-admission-bindings.json": { + "bytes": 649, + "sha256": "c2c574845abfe96e6a1a05b4797a75efe8b60846bb461ea1b73b511587026474" + }, + "native-contract-executables.json": { + "bytes": 2637, + "sha256": "9eedd376eac2d59c2402c73361a2fc0876d3ef4df093d8b3184961ddf2b90ac3" + }, + "native-qualified-v1/format.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native-qualified-v1/large-origin-nonmidpoint-oracle-comparison.log": { + "bytes": 852, + "sha256": "5710867d831faf32c5aa6f5f6305a7aedb70d69799d8fa39cc545e23ac7f691d" + }, + "native-qualified-v1/large-origin-nonmidpoint-oracle-summary.json": { + "bytes": 852, + "sha256": "5710867d831faf32c5aa6f5f6305a7aedb70d69799d8fa39cc545e23ac7f691d" + }, + "native-qualified-v1/large-origin-nonmidpoint-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native-qualified-v1/large-origin-nonmidpoint.tsv": { + "bytes": 39656, + "sha256": "38405a03996ba2be5dc952b85b1d7e0b0e7df4d115e30b9bdfe14852e55c3628" + }, + "native-qualified-v1/native-oracle-comparison.log": { + "bytes": 432, + "sha256": "1bdaf51b2edbe8169d0e93801fcb53a680eb4764c4ab191d1da826551c9752c6" + }, + "native-qualified-v1/native-oracle-summary.json": { + "bytes": 432, + "sha256": "1bdaf51b2edbe8169d0e93801fcb53a680eb4764c4ab191d1da826551c9752c6" + }, + "native-qualified-v1/native-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native-qualified-v1/native.tsv": { + "bytes": 112802, + "sha256": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45" + }, + "native-qualified-v1/oracle-tests-optimized.log": { + "bytes": 1633, + "sha256": "1ca4aa2c203f4c656f13d33f8ca7dc3ffdce402ef5415f6b3d5b2bc5cf27bdad" + }, + "native-qualified-v1/oracle-tests.log": { + "bytes": 1633, + "sha256": "100d5d055a812c4ededf29c9a685d4a04c2c9794de21a7b161f2610344305b93" + }, + "native-qualified-v1/qualification-gate-tests-optimized.log": { + "bytes": 872, + "sha256": "4ec5cd67020ce197551adc94edc14e7ed79e34049fab6116b60c2a6c7b5742ae" + }, + "native-qualified-v1/qualification-gate-tests.log": { + "bytes": 872, + "sha256": "4ec5cd67020ce197551adc94edc14e7ed79e34049fab6116b60c2a6c7b5742ae" + }, + "native-qualified-v1/qualification.json": { + "bytes": 192934, + "sha256": "96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366" + }, + "native-qualified-v1/reflected-anisotropic-oracle-comparison.log": { + "bytes": 448, + "sha256": "2186139b1e27a96cc78d2248fdbede6f8783b7b3f14df1cca1d257b13e7aea6f" + }, + "native-qualified-v1/reflected-anisotropic-oracle-summary.json": { + "bytes": 448, + "sha256": "2186139b1e27a96cc78d2248fdbede6f8783b7b3f14df1cca1d257b13e7aea6f" + }, + "native-qualified-v1/reflected-anisotropic-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native-qualified-v1/reflected-anisotropic.tsv": { + "bytes": 100823, + "sha256": "04821a0128a562dc796b5ec369e552eff2b867d09c55a7d1333cdfb35048b4d3" + }, + "native-qualified-v1/represented-nonmidpoint-oracle-comparison.log": { + "bytes": 1077, + "sha256": "271172fa04b40b7d53438dafd2a07bcad13f5d4f6a1f91802604345a41b4d7a8" + }, + "native-qualified-v1/represented-nonmidpoint-oracle-summary.json": { + "bytes": 1077, + "sha256": "271172fa04b40b7d53438dafd2a07bcad13f5d4f6a1f91802604345a41b4d7a8" + }, + "native-qualified-v1/represented-nonmidpoint-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native-qualified-v1/represented-nonmidpoint.tsv": { + "bytes": 112802, + "sha256": "c7eed9042d4806d437a573ddae91817c692c8cbd77b32e2df296b0e0b38d96f2" + }, + "native-qualified-v1/rust-build.log": { + "bytes": 120, + "sha256": "db55f073805de2e35019639ba981c36f3a8f95a55a04dcc52b31c2270d03f59f" + }, + "native-qualified-v1/rust-clippy.log": { + "bytes": 1378, + "sha256": "a9dc1909697046ca66616d8fd9070a8926cc3d5c33bc5ec99ebcc5fc8e8938a2" + }, + "native-qualified-v1/rust-contracts.log": { + "bytes": 5586, + "sha256": "7aac9855eba85039d566cc688ecd6397031e8b671a31fdec609ca12302433e4b" + }, + "native-qualified-v1/unit-center-cube-oracle-comparison.log": { + "bytes": 430, + "sha256": "1437948d56a251ce807b74a8cfae66c47455acef4911d4e1f390b1a4ee90580a" + }, + "native-qualified-v1/unit-center-cube-oracle-summary.json": { + "bytes": 430, + "sha256": "1437948d56a251ce807b74a8cfae66c47455acef4911d4e1f390b1a4ee90580a" + }, + "native-qualified-v1/unit-center-cube-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native-qualified-v1/unit-center-cube.tsv": { + "bytes": 39656, + "sha256": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566" + }, + "native-qualifier-driver.log": { + "bytes": 263, + "sha256": "b8ee8c1a5dbfb2acc2bf99d9139636b048df5bab49f10d9d21e1b584584e16e9" + }, + "packet-create.log": { + "bytes": 273, + "sha256": "269386682d146441f6bf37cc23c2880bf0173c1aeab68609059579ce419b177f" + }, + "packet-tests-normal.log": { + "bytes": 4272, + "sha256": "44d27f3acd4218cbc45e92373794790edbbfeec18c3bee5c9872323d7818e9f0" + }, + "packet-tests-optimized.log": { + "bytes": 4272, + "sha256": "9849e72fbde1dd4f83ef733bea833958f8e7806fe01c18e2e25c07805500040a" + }, + "packet-v1/data.json": { + "bytes": 131754, + "sha256": "99bb05fe61844f7ed1a4f8ad3e86ed123679895f696edbd99f396fb23090622c" + }, + "packet-v1/native.tsv": { + "bytes": 39656, + "sha256": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566" + }, + "packet-v1/primary-qualification.json": { + "bytes": 192934, + "sha256": "96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366" + }, + "packet-v1/qualification.json": { + "bytes": 16116, + "sha256": "dcfaa61e2bbe0858137ea939bd4c1314f0e8afa07d49d2a33a59dbe8cde98636" + }, + "pre-admission-expected-refusal.stderr": { + "bytes": 412, + "sha256": "e10e268667da451e36d0985f6442d38192a1f4421de651c964f19b9bc765a8f1" + }, + "pre-admission-expected-refusal.stdout": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "qualified-executables/1d66871fd50c6e17e690de4af830d970ea1a23f7c364a655e8745c7e754e0f4d-liquid_volume_contract-feec3ae32dcbefe5": { + "bytes": 3664232, + "sha256": "1d66871fd50c6e17e690de4af830d970ea1a23f7c364a655e8745c7e754e0f4d" + }, + "qualified-executables/251a48387dde81fae81af42b862fe5f1da90198869fc671b2595b42898bfc0d1-recording_comparison_contract-205af27e4f04bdad": { + "bytes": 8299296, + "sha256": "251a48387dde81fae81af42b862fe5f1da90198869fc671b2595b42898bfc0d1" + }, + "qualified-executables/3c98f5ffdc3211c4d503ddd60b76bcc516ee498579490ad55a48459ded53143e-rheon-a429e726eb179735": { + "bytes": 62095984, + "sha256": "3c98f5ffdc3211c4d503ddd60b76bcc516ee498579490ad55a48459ded53143e" + }, + "qualified-executables/486873ea3032ee5777f0c0f50176ccd4260f375cff5052768dd5bc50bdeaf140-recording_provider_runtime_contract-5507579fbf15a50a": { + "bytes": 6771328, + "sha256": "486873ea3032ee5777f0c0f50176ccd4260f375cff5052768dd5bc50bdeaf140" + }, + "qualified-executables/841d8e7f29ff10e0603aa600cb078400039d9225456ed80e0b8b502a018aa035-configured_provider_session_contract-18899f217e5c3858": { + "bytes": 13178288, + "sha256": "841d8e7f29ff10e0603aa600cb078400039d9225456ed80e0b8b502a018aa035" + }, + "qualified-executables/9f082291f8120480b312ea471db2981e7516557d647f3b148181665dc48562ba-projection_session_contract-99cd44f78c569f0c": { + "bytes": 7247240, + "sha256": "9f082291f8120480b312ea471db2981e7516557d647f3b148181665dc48562ba" + }, + "qualified-executables/be26241d906d86f9a2dd6cb626fc81015d267a3f5f11cdedd017644c46cd006f-recording_provider_contract-4563aa0dbc51be38": { + "bytes": 11376632, + "sha256": "be26241d906d86f9a2dd6cb626fc81015d267a3f5f11cdedd017644c46cd006f" + }, + "qualified-executables/bfd5f2f24b273c8019f30b4761f202f87f0a90f1246d42ca08a805aca81b556b-provider_step_contract-952a7149c0ec5a53": { + "bytes": 9668656, + "sha256": "bfd5f2f24b273c8019f30b4761f202f87f0a90f1246d42ca08a805aca81b556b" + }, + "qualified-executables/c0c961f403eef7dfbe61aaa338c53d093167a4c90626dd670714ec9c8af3f6ee-solver_provider_contract-c6be55ff3e264ba9": { + "bytes": 2077080, + "sha256": "c0c961f403eef7dfbe61aaa338c53d093167a4c90626dd670714ec9c8af3f6ee" + }, + "qualified-executables/ddf6d008a7668da8cb1f08388d66c4d69c064a07b2bc19e52e6a3b405caa239f-liquid_volume_periodic_contract-09940e33b41d83b5": { + "bytes": 1859016, + "sha256": "ddf6d008a7668da8cb1f08388d66c4d69c064a07b2bc19e52e6a3b405caa239f" + }, + "qualified-executables/f279d97d83367466737d5e57486ee1b1b6fce06ef21a800be480216d0a46883c-pressure_session_contract-e18df0f878334b98": { + "bytes": 2250688, + "sha256": "f279d97d83367466737d5e57486ee1b1b6fce06ef21a800be480216d0a46883c" + }, + "qualified-executables/faff5e7060dfecf7705ebb1092d454e217ceb6d79b181f36e09ffef30566fa5f-recording_contract-db2765a72a4388d0": { + "bytes": 5595152, + "sha256": "faff5e7060dfecf7705ebb1092d454e217ceb6d79b181f36e09ffef30566fa5f" + }, + "qualified-native-contract-executables/060183193e6aa352af74279da3ecb1a86b9e4ba4f6477de150c09f1b6ea8b7eb-static_obstacle_contract-b0d0ccb0b94e567b": { + "bytes": 2039176, + "sha256": "060183193e6aa352af74279da3ecb1a86b9e4ba4f6477de150c09f1b6ea8b7eb" + }, + "qualified-native-contract-executables/7da18661e6be7924196d00fde9afd0192cf5266c35a3e66b15343bad56ede2fc-obstacle_flow_contract-960c9dc0be44c2f9": { + "bytes": 2691368, + "sha256": "7da18661e6be7924196d00fde9afd0192cf5266c35a3e66b15343bad56ede2fc" + }, + "qualified-native-contract-executables/8a2d89690bdb9299c95148fb296229e2216a590fc7a56dfe13fee83b942bee4e-aligned_strain_contract-2260b287e32432c2": { + "bytes": 2142488, + "sha256": "8a2d89690bdb9299c95148fb296229e2216a590fc7a56dfe13fee83b942bee4e" + }, + "qualified-native-contract-executables/c4fc04c31ef9b34efa8dfc9badb0608f19a021b16aa682cd5889d1319f024a37-aligned_strain-e0c34e514a40a128": { + "bytes": 1599680, + "sha256": "c4fc04c31ef9b34efa8dfc9badb0608f19a021b16aa682cd5889d1319f024a37" + }, + "resource-completed-elf-deduplication.json": { + "bytes": 762, + "sha256": "b5b406238777355ea424c9df9ecbd435bea4a38b423308cd367f8e7b4fbb6009" + }, + "run-fresh-qualification.py": { + "bytes": 6583, + "sha256": "797cf4495fa3eb7f3539f22a5a92c0342d6f83663bc409bce6575f1ce93e2163" + }, + "seal-qualification.py": { + "bytes": 7062, + "sha256": "27ec277e07361c692372cdbd14266baf7c6bf7f219bc1aa67f4d8c6d5b5cb3f1" + }, + "toolchain-at-launch.json": { + "bytes": 648, + "sha256": "d0e531c0d4ae39a5883db763dfded5e4f65aec9e1091225031a48e3c3fbc39c2" + } + }, + "path": "/workspace/rheon-c1b3-stage-3b3b667.zip", + "sha256": "5e40f320799865ba6c3e945499c5da1e6d7a6068deea0ab19b59b511f9d284a1" + }, + "changed_selected_vs_186dc0a": [ + "src/bin/desktop/inspector.rs", + "src/bin/desktop/workflow_inspector_tests.rs", + "src/projection_step.rs", + "src/recording/projection.rs", + "src/recording/projection_tests.rs", + "src/recording/provider.rs", + "src/session/projection.rs", + "src/session/projection_tests.rs" + ], + "committed_source_hashes_verified": 1489, + "current_head": "3b3b667a8b81942a3ca95c7531b29525ac4494b2", + "current_worktree_status": "", + "decision": "APPROVED_SCOPED_LOCAL_EXECUTION_EVIDENCE", + "execution_context_sha256": "00191b291832547e2c037044b56ba6401ed2c993760220db294a46c661986e43", + "findings": [], + "focused": { + "borrow-doctests": { + "failed": 0, + "ignored": 0, + "passed": 3, + "suites": 1 + }, + "focused-complete-library": { + "failed": 0, + "ignored": 0, + "passed": 97, + "suites": 1 + }, + "focused-legacy-recording-volume": { + "failed": 0, + "ignored": 3, + "passed": 122, + "suites": 10 + }, + "focused-projection-session": { + "failed": 0, + "ignored": 0, + "passed": 6, + "suites": 1 + } + }, + "focused_total_ignored": 3, + "focused_total_passed": 228, + "frozen_bindings": { + "actual_frozen_commit": "3b3b667a8b81942a3ca95c7531b29525ac4494b2", + "actual_frozen_tree": "e0255bc77e935159517482b39d3c542243fe069e", + "admission_inventory_sha256": "8cc04634cb3e7831884273bf3c9a4bac21f52e3b0735be344101cba6bcf058ba", + "bound_review_sha256": "a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b", + "protocol_sha256": "1a0191d997fceb54002f647996c609a46387e003dd524c12090a8faeef74c16c", + "reviewed_driver_sha256": "797cf4495fa3eb7f3539f22a5a92c0342d6f83663bc409bce6575f1ce93e2163", + "source_map_sha256": "6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d", + "status": "FROZEN_BEFORE_EXECUTION" + }, + "ignored_tests": { + "pressure_session_contract": "frozen_model_selection_and_unsupported_domain_fallback_are_visible", + "provider_step_contract": "real_model_advances_production_session_for_twenty_four_intervals", + "solver_provider_contract": "real_checkpoint_support_replay_and_corruption" + }, + "library": { + "current_version_number": 0, + "file_id": "file_000000002104823089a3b3eb2c45641d", + "file_name": "rheon-c1b3-stage-3b3b667.zip", + "library_file_id": "libfile_61d39f8d955c81918f2c22927e011fa4", + "path": "/rheon-c1b3-stage-3b3b667.zip" + }, + "library_limits": "Saved successful official-helper receipt and local persisted attributes verified; no fresh remote download or authentication/reproducibility claim.", + "library_receipt_sha256": "f75ae9dbdec541b4fc6cf069b61c36df6f96fa2f346323022c53f3aad387004a", + "library_xattrs": { + "user.library-file-id": "libfile_61d39f8d955c81918f2c22927e011fa4", + "user.library-file-version": "0" + }, + "method": "Read-only actual Git blob comparison, complete source/selected/hash/log checks, retained executable magic/length/SHA256 and Cargo execution-path checks, ZIP CRC plus all member/raw byte comparisons, saved Library helper receipt/local xattr validation. No build/test/numerical/model execution or repository mutation.", + "native_commands_verified": 18, + "native_receipt_sha256": "96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366", + "native_rust_passed": 35, + "native_specimens": 5, + "prior_186_protocol_and_compact_summary_unchanged": true, + "prior_186_review_exact_prefix_preserved": true, + "python_test_counts": { + "native-qualified-v1/oracle-tests-optimized.log": 10, + "native-qualified-v1/oracle-tests.log": 10, + "native-qualified-v1/qualification-gate-tests-optimized.log": 5, + "native-qualified-v1/qualification-gate-tests.log": 5, + "packet-tests-normal.log": 26, + "packet-tests-optimized.log": 26 + }, + "qualification_summary_sha256": "68393fd154282259d79e42923088bf5354f795fca36a4f888b7954c40082aa2a", + "remaining_gates": [ + "Separate result/canonical document review and exact-head hosted acceptance.", + "Default/desktop/native-window/release/performance, scientific/physical/Lean/GPU, stateful/external/whole-family/C1-R and public merge acceptance remain outside scope." + ], + "resource_custody": "Completed current library ELF was task-owner hardlinked after matching source/destination hashes; only own reconstructible target retired after all executing ELF copies. All17 retained hashes/bytes were independently reverified after target unlink; scratch action is no performance/provenance guarantee.", + "schema": "rheon-c1b3-independent-qualification-execution-review-v1", + "scope": "Independent read/hash/log/ZIP audit only; no qualification/test/model/scientific rerun. Fresh evidence applies only to scoped clean frozen3b3b667, not owner227 or previous186, nor default/desktop/release/UI/physics/whole-family/Lean/hosted/merge acceptance.", + "selected_working_and_committed_hashes_verified": 140, + "source_head": "3b3b667a8b81942a3ca95c7531b29525ac4494b2", + "source_tree": "e0255bc77e935159517482b39d3c542243fe069e", + "summary_remained_unchanged_during_audit": true, + "top_level_commands_verified": 11 +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.md new file mode 100644 index 00000000..fa07cb93 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.md @@ -0,0 +1,46 @@ +# Independent C1-B3 qualification execution review + +**Approved scoped local execution evidence; no material findings.** + +Actual clean qualified source is `3b3b667a8b81942a3ca95c7531b29525ac4494b2`, tree `e0255bc77e935159517482b39d3c542243fe069e`. This is a fresh separate C1-B3 admission stage retaining PR140 `5dc1741` and prior PR141/186 evidence. It is not the owner's separately reported 227-execution run and does not transfer either prior receipt. + +The final compact summary was received and independently verified at SHA256 `68393fd154282259d79e42923088bf5354f795fca36a4f888b7954c40082aa2a`; all five Library fields, including version 0 and filename, were present before this audit and stayed unchanged. + +## Source and command evidence + +- All **1,489** recorded source hashes match the exact committed Git blobs and complete tracked file set. All **140** selected native hashes match the inventory, committed blobs and current files. The closure is 0 added / 8 changed / 132 unchanged / 0 removed against qualified186. +- Native inventory `8cc04634cb3e7831884273bf3c9a4bac21f52e3b0735be344101cba6bcf058ba`, bound review `a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b`, protocol `1a0191d997fceb54002f647996c609a46387e003dd524c12090a8faeef74c16c` and reviewed driver `797cf4495fa3eb7f3539f22a5a92c0342d6f83663bc409bce6575f1ce93e2163` match their frozen bindings. The old186 review remains an exact prefix; its protocol and compact result summary remain unchanged. +- All **11 top-level commands** have matching logs, source identity and exit0. Within the unchanged qualifier, all **18 commands** pass. Actual Rust summaries total **35 passes** (7 aligned-strain +16 obstacle-flow +10 static-obstacle +2 example harness tests). All five exporter specimens retain rational oracle output and eleven declared rejected mutations per specimen. Gate checks are **5 normal +5 optimized**; oracle checks **10+10**. +- Both real packet test logs contain exactly **26 tests, bare OK and zero skips**. The four packet artifacts, actual exporter hash, native source map and primary qualification receipt link agree. The native receipt SHA256 is `96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366`. + +Actual focused summaries, with no nested-child count inflation: + +| Executed target group | Passed | Failed | Existing ignored | +| --- | ---: | ---: | ---: | +| Complete no-default library | 97 | 0 | 0 | +| All public projection Session contracts | 6 | 0 | 0 | +| Eight legacy/provider/recording targets plus two volume targets | 122 | 0 | 3 | +| Borrow compile-fail doctests | 3 | 0 | 0 | +| **Total** | **228** | **0** | **3** | + +The three ignores explicitly require unavailable checkpoint exports: pressure Session model selection, provider 24-interval production run and solver-provider checkpoint replay. They are not counted as passes. This fresh recipe differs from the owner 227-pass/five-ignore matrix; neither replaces the other. + +Toolchain logs record Rust/Cargo1.92.0 and actual Python3.12.14. Jobs2, incremental0, dev/test debug0 and cleared ambient Python optimization are recorded. The normal unoptimized/debug-assertion profile remains; no release or performance inference follows. + +## Actual executable and archive custody + +All **17 distinct retained actual ELF files** were read and verified for ELF magic, bytes and SHA256. Twelve focused ELF identities match the actual Cargo execution paths in their command logs; four native contract/example harness ELFs match the native execution log; the actual exporter is `76564683b20d236c8b6ac0f7240d43f36289485dded8e18dd6b2c62b2a2bb0bb`. These are retained executed artifacts, not paths to a removed target or substitutes from old runs. + +The completed library ELF hardlink deduplication and subsequent retirement of only the task's own reconstructible target are recorded and sealed. After target unlink, all 17 retained ELF hashes and bytes still match. This proves retained-byte custody, not timing, hermeticity or authentication. No other-owner/prior evidence deletion was performed by this review. + +Raw archive `/workspace/rheon-c1b3-stage-3b3b667.zip` is **28,934,812 bytes**, SHA256 `5e40f320799865ba6c3e945499c5da1e6d7a6068deea0ab19b59b511f9d284a1`. All **76 distinct regular members** pass CRC, exact expected membership, SHA256 and full byte equality against retained raw files. This includes logs, source hashes, executing ELFs, driver/sealer and resource disposition receipts. + +The successful saved official Library receipt, all five summary fields and persisted local attributes agree: Library file `libfile_61d39f8d955c81918f2c22927e011fa4`, file `file_000000002104823089a3b3eb2c45641d`, path `/rheon-c1b3-stage-3b3b667.zip`, filename `rheon-c1b3-stage-3b3b667.zip`, version0. Returned version attribute and Library ID attribute are present on unchanged ZIP bytes. This review verifies the saved successful receipt and local attributes; it does not claim a new remote download/roundtrip or authenticity/reproducibility proof. + +## Scope and remaining gates + +This was a read/hash/log/ZIP audit only: no build, test, scientific campaign or model execution and no repository, target, ref or PR mutation. The working source was clean at audit. Only external review receipts were written. + +Approval covers the declared native/rational/real-packet and focused no-default B2/B3, legacy custody/volume/borrow contract execution at this exact source. Result/canonical documentation and exact-head hosted gates remain separate. No default/desktop/native-window/release/performance, physical/scientific/Lean/GPU, stateful/external/whole-family/full C1-R or merge acceptance follows. CV3 remains separate prospective numerical preparation. + +[Machine-readable review](qualification-3b3b667-review.json) includes every retained executable and archive-member hash, exact commands/counts, frozen bindings and remaining gates. Its own copies are outside the raw archive and original qualification summary; neither was changed by this review. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.json b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.json new file mode 100644 index 00000000..51932908 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.json @@ -0,0 +1,181 @@ +{ + "schema": "rheon-c1b3-native-admission-qualification-v1", + "status": "passed-scoped-local-qualification-hosted-pending", + "source_head": "3b3b667a8b81942a3ca95c7531b29525ac4494b2", + "source_tree": "e0255bc77e935159517482b39d3c542243fe069e", + "clean": true, + "source_file_count": 1489, + "retained_owner_head": "5dc1741feffa88b857194559b3e7e79be5369a64", + "fixed_prior_stage": { + "PR141_head": "38c40ca7b4b2401e0ac802f12c647f7229072f52", + "actual_qualified_source": "186dc0a18f787748eb723d91321e44ffd0e374d5", + "unchanged": true + }, + "selected_native": { + "count": 140, + "added": 0, + "changed": 8, + "unchanged": 132, + "removed": 0, + "map_sha256": "6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d" + }, + "admission_inventory_sha256": "8cc04634cb3e7831884273bf3c9a4bac21f52e3b0735be344101cba6bcf058ba", + "bound_review_sha256": "a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b", + "native_qualification": { + "commands": 18, + "receipt_sha256": "96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366", + "executable_sha256": "76564683b20d236c8b6ac0f7240d43f36289485dded8e18dd6b2c62b2a2bb0bb", + "lean_checked": false + }, + "packet": { + "normal": 26, + "optimized": 26, + "skipped": 0, + "artifacts_sha256": { + "data.json": "99bb05fe61844f7ed1a4f8ad3e86ed123679895f696edbd99f396fb23090622c", + "native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "primary-qualification.json": "96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366", + "qualification.json": "dcfaa61e2bbe0858137ea939bd4c1314f0e8afa07d49d2a33a59dbe8cde98636" + } + }, + "focused": { + "focused-complete-library": { + "passed": 97, + "failed": 0, + "ignored": 0, + "summary_lines": [ + "test result: ok. 97 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 48.89s" + ] + }, + "focused-projection-session": { + "passed": 6, + "failed": 0, + "ignored": 0, + "summary_lines": [ + "test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 125.04s" + ] + }, + "focused-legacy-recording-volume": { + "passed": 122, + "failed": 0, + "ignored": 3, + "summary_lines": [ + "test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s", + "test result: ok. 18 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s", + "test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.07s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.84s", + "test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.60s", + "test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.50s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.07s", + "test result: ok. 5 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s" + ] + }, + "borrow-doctests": { + "passed": 3, + "failed": 0, + "ignored": 0, + "summary_lines": [ + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s" + ] + } + }, + "focused_total_passed": 228, + "focused_total_ignored": 3, + "executing_elf_count": 17, + "raw_archive": { + "path": "/workspace/rheon-c1b3-stage-3b3b667.zip", + "bytes": 28934812, + "sha256": "5e40f320799865ba6c3e945499c5da1e6d7a6068deea0ab19b59b511f9d284a1", + "member_count": 76, + "all_crc_and_member_hashes_verified": true, + "library": { + "library_file_id": "libfile_61d39f8d955c81918f2c22927e011fa4", + "file_id": "file_000000002104823089a3b3eb2c45641d", + "path": "/rheon-c1b3-stage-3b3b667.zip", + "file_name": "rheon-c1b3-stage-3b3b667.zip", + "current_version_number": 0 + }, + "library_xattrs_persisted": true + }, + "raw_files_sha256": { + "aligned-strain-native-executable": "76564683b20d236c8b6ac0f7240d43f36289485dded8e18dd6b2c62b2a2bb0bb", + "ambient-compiler-overrides.json": "5ef0d59aa992da29b9b39219bb5e176069ff08f82dd1482b64e6555d4e099274", + "borrow-doctests.log": "b48541ae21c30a52a64e05a1a790d0563edf8097edf4f35b297cc67f11fd6934", + "build-cache-retirement.json": "46f612e309501de4f680f568549e00f0008c33434df0fc55a2964a3d15ea7408", + "committed-admission-check.log": "6c7012e74731646f8e0096e8fc59a099453fe1acf73624bc139a76c3acae44a1", + "committed-format-check.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "committed-locked-metadata.log": "013f1ebdb923726d78e19e40d1a3fddcd63206f129e8ddf5b49aca56704fe96d", + "complete-source-review-input.json": "7fa2845366100c768049a482f33d496b2f19c25c4ceed50691cb5ccdbfd9fa2d", + "execution-context.json": "00191b291832547e2c037044b56ba6401ed2c993760220db294a46c661986e43", + "final-admission-review/final-admission-review.json": "c55e52878f4f357494e75609f5055b8e94063b3d5b7ef6fa027a17d7bfbc5643", + "final-admission-review/final-admission-review.md": "8101644a9391537be9ce18fc7b8b8af1c400ebec5de8bc1b4be7ee09b63df3e9", + "final141-docs-only-merge-guard.json": "9eca6036aa27782c914995fdcef67fec28af62086175cf997ca75e0d1784cf83", + "focused-complete-library.log": "3264e091275a01e4794773926e8cf4f51cd67d28f925ba53d795399ae270af74", + "focused-legacy-recording-volume.log": "81c132c72d7ec100d0aa1b87691fe69bd7779cf9e222436e86ac68222d22ef16", + "focused-projection-session.log": "7f6678b960001158d63d8d6d971992e64728177f0d603b1cc6bfe618718a8348", + "frozen-admission-bindings.json": "c2c574845abfe96e6a1a05b4797a75efe8b60846bb461ea1b73b511587026474", + "native-contract-executables.json": "9eedd376eac2d59c2402c73361a2fc0876d3ef4df093d8b3184961ddf2b90ac3", + "native-qualified-v1/format.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/large-origin-nonmidpoint-oracle-comparison.log": "5710867d831faf32c5aa6f5f6305a7aedb70d69799d8fa39cc545e23ac7f691d", + "native-qualified-v1/large-origin-nonmidpoint-oracle-summary.json": "5710867d831faf32c5aa6f5f6305a7aedb70d69799d8fa39cc545e23ac7f691d", + "native-qualified-v1/large-origin-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/large-origin-nonmidpoint.tsv": "38405a03996ba2be5dc952b85b1d7e0b0e7df4d115e30b9bdfe14852e55c3628", + "native-qualified-v1/native-oracle-comparison.log": "1bdaf51b2edbe8169d0e93801fcb53a680eb4764c4ab191d1da826551c9752c6", + "native-qualified-v1/native-oracle-summary.json": "1bdaf51b2edbe8169d0e93801fcb53a680eb4764c4ab191d1da826551c9752c6", + "native-qualified-v1/native-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/native.tsv": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45", + "native-qualified-v1/oracle-tests-optimized.log": "1ca4aa2c203f4c656f13d33f8ca7dc3ffdce402ef5415f6b3d5b2bc5cf27bdad", + "native-qualified-v1/oracle-tests.log": "100d5d055a812c4ededf29c9a685d4a04c2c9794de21a7b161f2610344305b93", + "native-qualified-v1/qualification-gate-tests-optimized.log": "4ec5cd67020ce197551adc94edc14e7ed79e34049fab6116b60c2a6c7b5742ae", + "native-qualified-v1/qualification-gate-tests.log": "4ec5cd67020ce197551adc94edc14e7ed79e34049fab6116b60c2a6c7b5742ae", + "native-qualified-v1/qualification.json": "96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366", + "native-qualified-v1/reflected-anisotropic-oracle-comparison.log": "2186139b1e27a96cc78d2248fdbede6f8783b7b3f14df1cca1d257b13e7aea6f", + "native-qualified-v1/reflected-anisotropic-oracle-summary.json": "2186139b1e27a96cc78d2248fdbede6f8783b7b3f14df1cca1d257b13e7aea6f", + "native-qualified-v1/reflected-anisotropic-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/reflected-anisotropic.tsv": "04821a0128a562dc796b5ec369e552eff2b867d09c55a7d1333cdfb35048b4d3", + "native-qualified-v1/represented-nonmidpoint-oracle-comparison.log": "271172fa04b40b7d53438dafd2a07bcad13f5d4f6a1f91802604345a41b4d7a8", + "native-qualified-v1/represented-nonmidpoint-oracle-summary.json": "271172fa04b40b7d53438dafd2a07bcad13f5d4f6a1f91802604345a41b4d7a8", + "native-qualified-v1/represented-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/represented-nonmidpoint.tsv": "c7eed9042d4806d437a573ddae91817c692c8cbd77b32e2df296b0e0b38d96f2", + "native-qualified-v1/rust-build.log": "db55f073805de2e35019639ba981c36f3a8f95a55a04dcc52b31c2270d03f59f", + "native-qualified-v1/rust-clippy.log": "a9dc1909697046ca66616d8fd9070a8926cc3d5c33bc5ec99ebcc5fc8e8938a2", + "native-qualified-v1/rust-contracts.log": "7aac9855eba85039d566cc688ecd6397031e8b671a31fdec609ca12302433e4b", + "native-qualified-v1/unit-center-cube-oracle-comparison.log": "1437948d56a251ce807b74a8cfae66c47455acef4911d4e1f390b1a4ee90580a", + "native-qualified-v1/unit-center-cube-oracle-summary.json": "1437948d56a251ce807b74a8cfae66c47455acef4911d4e1f390b1a4ee90580a", + "native-qualified-v1/unit-center-cube-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/unit-center-cube.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "native-qualifier-driver.log": "b8ee8c1a5dbfb2acc2bf99d9139636b048df5bab49f10d9d21e1b584584e16e9", + "packet-create.log": "269386682d146441f6bf37cc23c2880bf0173c1aeab68609059579ce419b177f", + "packet-tests-normal.log": "44d27f3acd4218cbc45e92373794790edbbfeec18c3bee5c9872323d7818e9f0", + "packet-tests-optimized.log": "9849e72fbde1dd4f83ef733bea833958f8e7806fe01c18e2e25c07805500040a", + "packet-v1/data.json": "99bb05fe61844f7ed1a4f8ad3e86ed123679895f696edbd99f396fb23090622c", + "packet-v1/native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "packet-v1/primary-qualification.json": "96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366", + "packet-v1/qualification.json": "dcfaa61e2bbe0858137ea939bd4c1314f0e8afa07d49d2a33a59dbe8cde98636", + "pre-admission-expected-refusal.stderr": "e10e268667da451e36d0985f6442d38192a1f4421de651c964f19b9bc765a8f1", + "pre-admission-expected-refusal.stdout": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "qualified-executables/1d66871fd50c6e17e690de4af830d970ea1a23f7c364a655e8745c7e754e0f4d-liquid_volume_contract-feec3ae32dcbefe5": "1d66871fd50c6e17e690de4af830d970ea1a23f7c364a655e8745c7e754e0f4d", + "qualified-executables/251a48387dde81fae81af42b862fe5f1da90198869fc671b2595b42898bfc0d1-recording_comparison_contract-205af27e4f04bdad": "251a48387dde81fae81af42b862fe5f1da90198869fc671b2595b42898bfc0d1", + "qualified-executables/3c98f5ffdc3211c4d503ddd60b76bcc516ee498579490ad55a48459ded53143e-rheon-a429e726eb179735": "3c98f5ffdc3211c4d503ddd60b76bcc516ee498579490ad55a48459ded53143e", + "qualified-executables/486873ea3032ee5777f0c0f50176ccd4260f375cff5052768dd5bc50bdeaf140-recording_provider_runtime_contract-5507579fbf15a50a": "486873ea3032ee5777f0c0f50176ccd4260f375cff5052768dd5bc50bdeaf140", + "qualified-executables/841d8e7f29ff10e0603aa600cb078400039d9225456ed80e0b8b502a018aa035-configured_provider_session_contract-18899f217e5c3858": "841d8e7f29ff10e0603aa600cb078400039d9225456ed80e0b8b502a018aa035", + "qualified-executables/9f082291f8120480b312ea471db2981e7516557d647f3b148181665dc48562ba-projection_session_contract-99cd44f78c569f0c": "9f082291f8120480b312ea471db2981e7516557d647f3b148181665dc48562ba", + "qualified-executables/be26241d906d86f9a2dd6cb626fc81015d267a3f5f11cdedd017644c46cd006f-recording_provider_contract-4563aa0dbc51be38": "be26241d906d86f9a2dd6cb626fc81015d267a3f5f11cdedd017644c46cd006f", + "qualified-executables/bfd5f2f24b273c8019f30b4761f202f87f0a90f1246d42ca08a805aca81b556b-provider_step_contract-952a7149c0ec5a53": "bfd5f2f24b273c8019f30b4761f202f87f0a90f1246d42ca08a805aca81b556b", + "qualified-executables/c0c961f403eef7dfbe61aaa338c53d093167a4c90626dd670714ec9c8af3f6ee-solver_provider_contract-c6be55ff3e264ba9": "c0c961f403eef7dfbe61aaa338c53d093167a4c90626dd670714ec9c8af3f6ee", + "qualified-executables/ddf6d008a7668da8cb1f08388d66c4d69c064a07b2bc19e52e6a3b405caa239f-liquid_volume_periodic_contract-09940e33b41d83b5": "ddf6d008a7668da8cb1f08388d66c4d69c064a07b2bc19e52e6a3b405caa239f", + "qualified-executables/f279d97d83367466737d5e57486ee1b1b6fce06ef21a800be480216d0a46883c-pressure_session_contract-e18df0f878334b98": "f279d97d83367466737d5e57486ee1b1b6fce06ef21a800be480216d0a46883c", + "qualified-executables/faff5e7060dfecf7705ebb1092d454e217ceb6d79b181f36e09ffef30566fa5f-recording_contract-db2765a72a4388d0": "faff5e7060dfecf7705ebb1092d454e217ceb6d79b181f36e09ffef30566fa5f", + "qualified-native-contract-executables/060183193e6aa352af74279da3ecb1a86b9e4ba4f6477de150c09f1b6ea8b7eb-static_obstacle_contract-b0d0ccb0b94e567b": "060183193e6aa352af74279da3ecb1a86b9e4ba4f6477de150c09f1b6ea8b7eb", + "qualified-native-contract-executables/7da18661e6be7924196d00fde9afd0192cf5266c35a3e66b15343bad56ede2fc-obstacle_flow_contract-960c9dc0be44c2f9": "7da18661e6be7924196d00fde9afd0192cf5266c35a3e66b15343bad56ede2fc", + "qualified-native-contract-executables/8a2d89690bdb9299c95148fb296229e2216a590fc7a56dfe13fee83b942bee4e-aligned_strain_contract-2260b287e32432c2": "8a2d89690bdb9299c95148fb296229e2216a590fc7a56dfe13fee83b942bee4e", + "qualified-native-contract-executables/c4fc04c31ef9b34efa8dfc9badb0608f19a021b16aa682cd5889d1319f024a37-aligned_strain-e0c34e514a40a128": "c4fc04c31ef9b34efa8dfc9badb0608f19a021b16aa682cd5889d1319f024a37", + "resource-completed-elf-deduplication.json": "b5b406238777355ea424c9df9ecbd435bea4a38b423308cd367f8e7b4fbb6009", + "run-fresh-qualification.py": "797cf4495fa3eb7f3539f22a5a92c0342d6f83663bc409bce6575f1ce93e2163", + "seal-qualification.py": "27ec277e07361c692372cdbd14266baf7c6bf7f219bc1aa67f4d8c6d5b5cb3f1", + "toolchain-at-launch.json": "d0e531c0d4ae39a5883db763dfded5e4f65aec9e1091225031a48e3c3fbc39c2" + }, + "scope": "unchanged native/rational/real-packet plus complete no-default library, all B2+B3 public projection, legacy/volume/borrow contracts; not owner227 rerun, scientific/physical/default/desktop/release/window/whole-family/hosted/merge acceptance" +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.md new file mode 100644 index 00000000..5e2b1527 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.md @@ -0,0 +1,115 @@ +# Separate C1-B3 source qualification + +**Scoped local qualification passed; hosted integration remains pending.** +Actual clean executed source: `3b3b667a8b81942a3ca95c7531b29525ac4494b2`, tree +`e0255bc77e935159517482b39d3c542243fe069e`. This separate stage retains final +PR140 `5dc1741feffa88b857194559b3e7e79be5369a64` and fixed PR141 +`38c40ca7b4b2401e0ac802f12c647f7229072f52`, including its qualified186dc0a ancestry. +The lead authored admission/results documentation only; implementation remains +with the existing Session/provider/recording owners. No scientific campaign, +production implementation, training, user-data change or public merge occurred. + +## Source and prospective review + +The [complete-source review](source-review/readiness-review.md), +[140-path receipt](source-review/readiness-review.json) and +[final admission review](final-admission-review.md) approve the unchanged selector: +140 regular nonsymlink inputs, zero added/removed, eight changed and 132 reused +versus both PR137 and qualified186dc0a. Two public contract targets outside that +selector are also independently reviewed and executed. Canonical compact map: +`6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d`. + +The explicit v3 refresh retains its schema/base, exact v1/v2 identities, primary +ancestry/tree, Cargo/toolchain and every prior bound-review byte as an exact +prefix. Inventory SHA256 is +`8cc04634cb3e7831884273bf3c9a4bac21f52e3b0735be344101cba6bcf058ba`; +bound review SHA256 is +`a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b`. +[Protocol](protocol.md) SHA256 is +`1a0191d997fceb54002f647996c609a46387e003dd524c12090a8faeef74c16c`. +All were committed before execution and remain frozen; results are separate files. +The expected old inventory refusal remains retained. Separate Q2 Cargo/CV inputs +are excluded; fixed PR133, PR138 and PR141 subjects/receipts remain unchanged. + +## Actual execution + +Rust/Cargo 1.92.0 and Python 3.12.14 ran on native CPU, jobs 2, incremental 0, +dev/test debug 0, default opt-level 0/debug assertions retained. Normal Python +cleared optimization; ambient compiler override variables were unset. Exact +commands, environment, exits and logs are bound in the raw archive. + +| Gate | Actual result | +| --- | --- | +| Committed admission, locked metadata, formatting | Passed; 140 matching inputs | +| Unchanged native qualifier |18 commands; 35 Rust tests, including the 2-test example harness | +| Native/rational cases |5 actual exporter specimens; gate 5+5 and oracle 10+10 normal/optimized tests | +| New real packet |26 normal + 26 optimized tests; zero skips | +| Complete no-default library |97 passed, zero failed/ignored; includes the existing workflow and new B3 contracts | +| All public projection contracts |6 passed; actual B2 and B3 differential, shortened-interval and genuine low-cap fallback cases | +| Eight legacy plus two volume targets |122 passed, zero failed, 3 existing opt-in artifact tests ignored | +| Borrow compile-fail doctests |3 passed; these intentionally produce no successful runtime ELF | +| Focused total |228 passed, zero failed, 3 existing artifact ignores | + +The public B3 differential advances 100 actually SuppliedCandidate-selected +intervals per ordered distinct native pair, bitwise against the direct **same +producer** baseline; the retained B2 differential separately advances 100 per +method. These are contract equivalence cases, not cross-method or new physical +accuracy. Actual low-cap producer failure/fallback, cancellation without retry, +rollback/reused scratch, foreign-version refusal and cold custody run through the +existing owners. Among producer errors, only actual IterationLimit is recoverable; +existing B1 field/momentum rejection fallback remains. Mixed-pressure witness +fallback still refuses publication. + +Owner 227 passing/5 existing ignored executions remain separately attributed to +core 4af3802 and consumer 9ddf8d2, whose only difference is one public UI-test API +call. They overlap and are not 227 distinct tests. Initial compile failures and +94-pass/1-failure old-profile refusal-category run remain retained; no failure +was relabelled. This fresh 228 recipe is different and does not claim a rerun or +raw-archive audit of the owner 227. Default/desktop owner evidence stays at those +original subjects. + +## Evidence custody and independent verification + +The unchanged native receipt records **1,489 committed-file hashes** and all 140 +selected inputs. Actual exporter ELF SHA256: +`76564683b20d236c8b6ac0f7240d43f36289485dded8e18dd6b2c62b2a2bb0bb`. +Native receipt SHA256: +`96927dde0106bbf09d2b2489bbfebeda387bd13723aba714949843c5f2a8a366`. +All **17 actual executing ELFs** are retained: 12 focused harnesses, 4 native +harnesses and the exporter. Every raw archive member CRC and SHA256 was checked. + +| Retained artifact | Identity | +| --- | --- | +| Raw ZIP | `rheon-c1b3-stage-3b3b667.zip`; 28,934,812 bytes; 76 regular members | +| ZIP SHA256 | `5e40f320799865ba6c3e945499c5da1e6d7a6068deea0ab19b59b511f9d284a1` | +| Library | `libfile_61d39f8d955c81918f2c22927e011fa4`; `file_000000002104823089a3b3eb2c45641d`; version 0 | +| Compact summary | [qualification.json](qualification.json); SHA256 `68393fd154282259d79e42923088bf5354f795fca36a4f888b7954c40082aa2a` | + +The official Library helper persisted every returned xattr and Library identity; +archive bytes stayed unchanged. Bounded scratch handling deduplicated only the +already completed, hash-identical library ELF against root's own target. After +all commands passed and all 17 ELFs were retained/verified, only that reconstructible +target was retired; retained hashes were verified again. These resource receipts +are sealed. No source, frozen input, prior evidence or other-owner cache changed. + +The [independent execution review](qualification-3b3b667-review.md) and +[machine-readable review](qualification-3b3b667-review.json) verify actual source, +counts, ELFs, packet and complete raw custody. Digest custody does not itself +establish authentication, physical acceptance or universal behavioral coverage. + +## Dependency and remaining gates + +This is a separate dependent draft on fixed PR141; preserve exact PR140 and +qualified186 lineage. Recheck exact new-head hosted Pages/browser/build checks; +queued/skipped jobs are not acceptance. A future joint Q2/C1 stage must reconcile +the two inventories, independently review the entire combined closure and run +fresh applicable qualification. Neither prior source receipt transfers. + +No further composition implementation milestone is admitted. Stateful/learned/ +external providers, whole-family/transfer, full C1-R, default/desktop/native-window, +release/performance, physical/model/Lean/GPU and production acceptance remain +separate. [CV3-A](../cv3a-admission.md) admits next numerical preparation only, +with source/oracle/resource review before one private campaign; no pilot result +exists. Grid-first, then particle/output-surface, then later Lagrangian order +remains unchanged. Public merges remain paused after automatic approval rejected +PR121 and its single requested retry; no alternate path or further retry. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/result-document-review/result-document-review.json b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/result-document-review/result-document-review.json new file mode 100644 index 00000000..0e8b9b81 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/result-document-review/result-document-review.json @@ -0,0 +1,132 @@ +{ + "schema": "rheon-c1b3-result-document-independent-review-v1", + "status": "APPROVED_EXACT_NINE_RESULT_DOCUMENT_PATHS_NO_MATERIAL_FINDING", + "reviewed_at_utc": "2026-10-20T05:07:12.993518+00:00", + "executed_subject": { + "head": "3b3b667a8b81942a3ca95c7531b29525ac4494b2", + "tree": "e0255bc77e935159517482b39d3c542243fe069e" + }, + "result_descendant_commit": "NOT_YET_COMMITTED_NOT_EXECUTION_SUBJECT", + "exact_result_path_count": 9, + "result_path_sha256": { + "docs/plans/fluid-accuracy-composition/execution-ledger.md": "05b30707f38630c4e50c95c72641964f053ac4aa4b1be832bcffb06e7eb5fa5b", + "docs/plans/fluid-accuracy-composition/issues.md": "da3e62008a5dfff24e541646423de794de9bbb08397f91f3b5241f3e1b082c68", + "docs/plans/fluid-accuracy-composition/plan.md": "a3de5caaa0516f3af162796150f8f37a767b4a749b3b9d15992c4ff6ff207c29", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.json": "5b8e13f7e6f584afa38d6fbaf5a396d0d11c23ac4cfe99cdd60a46df9b289738", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.md": "ca9380253f27cd236796889383795a8e33cc63b443b480681a6b0b8ccd282463", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.json": "68393fd154282259d79e42923088bf5354f795fca36a4f888b7954c40082aa2a", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.md": "ee5ecf9c83d71e2d055dd4c5098b35eb0e5a07a4f95c1b3e50c8452f09f25286", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md": "1fe3a8664d028135552340478b1c91d19a1219eb4b52b3a1c3a0f5e92cb32a33", + "docs/plans/fluid-accuracy-composition/reports/verification.md": "f3f006caed0d48f41c17b58ce3da47e0c34375693b86dd727f6a190d8d6ca7fb" + }, + "compact_summary_sha256": "68393fd154282259d79e42923088bf5354f795fca36a4f888b7954c40082aa2a", + "summary_verbatim_external": true, + "independent_execution_review_copies_verbatim": true, + "execution_audit_attribution": "Full1489committedblob/140selected/17ELF/76ZIPmemberCRCbyteaudit independently approved by designreview at exact copied receipt. This review independently re-read actuallogcounts/frozeninputs and rehashed summary/nativeELF/receipt/archive, without rerunning tests.", + "actual_log_counts": { + "focused-complete-library.log": [ + 97, + 0, + 0 + ], + "focused-projection-session.log": [ + 6, + 0, + 0 + ], + "focused-legacy-recording-volume.log": [ + 122, + 0, + 3 + ], + "borrow-doctests.log": [ + 3, + 0, + 0 + ] + }, + "actual_python_log_counts": { + "packet-tests-normal.log": 26, + "packet-tests-optimized.log": 26, + "native-qualified-v1/qualification-gate-tests.log": 5, + "native-qualified-v1/qualification-gate-tests-optimized.log": 5, + "native-qualified-v1/oracle-tests.log": 10, + "native-qualified-v1/oracle-tests-optimized.log": 10 + }, + "native_qualifier_commands": 18, + "native_rust_passed": 35, + "native_specimens": 5, + "focused_total": 228, + "focused_failed": 0, + "focused_existing_ignored": [ + "frozen_model_selection_and_unsupported_domain_fallback_are_visible", + "real_model_advances_production_session_for_twenty_four_intervals", + "real_checkpoint_support_replay_and_corruption" + ], + "owner227_5": "Retained independent owner source/execution/failure history, not relabelled as this fresh lead228 recipe. No rawownerarchiveaudit claimed.", + "frozen_admission_files_verified": { + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.json": "c55e52878f4f357494e75609f5055b8e94063b3d5b7ef6fa027a17d7bfbc5643", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.md": "8101644a9391537be9ce18fc7b8b8af1c400ebec5de8bc1b4be7ee09b63df3e9", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/protocol.md": "1a0191d997fceb54002f647996c609a46387e003dd524c12090a8faeef74c16c", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.json": "6463884e5a2ed9fd079ea72d77d5790dba951efcb08f495330ba0bfcf997b3ab", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.md": "989a54f511e7b9ba69d33bcfbfaa76b93d348c5c3bbff6ee7ab31bed2ae1c7ea", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/source-map-review-input.json": "7fa2845366100c768049a482f33d496b2f19c25c4ceed50691cb5ccdbfd9fa2d", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "8cc04634cb3e7831884273bf3c9a4bac21f52e3b0735be344101cba6bcf058ba", + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b" + }, + "frozen_selected_working_and_committed_count": 140, + "prior186_result_files_verified": { + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md": "f6a8032808693936504bcb2818835754261a2f3293c6beca9d42e6fb1b988347", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json": "26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.md": "41c0cd342a9a8e6a5d47708354c17eeec9d20b378db2ae4c92ebe937d9b46deb", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.json": "e69a689a2fb30ad3dcdd237cc8c3d34edd5161796b41d5d76c7adec3eaeabf58" + }, + "prior133_138_141_public_heads_verified": [ + { + "baseRefName": "main", + "headRefOid": "8bf542eddd8198008b6d77d52e009e9384998f18", + "isDraft": true, + "number": 133, + "state": "OPEN" + }, + { + "baseRefName": "integration/native-admission-fluid-20261020", + "headRefOid": "a6bfcc94481b1bafbe61be804a1abc3426927bbd", + "isDraft": true, + "number": 138, + "state": "OPEN" + }, + { + "baseRefName": "fix/g1-advection-cancel-20261020", + "headRefOid": "38c40ca7b4b2401e0ac802f12c647f7229072f52", + "isDraft": true, + "number": 141, + "state": "OPEN" + } + ], + "public_head_receipt_sha256": "80561e674fe1e72614c74a59b80ac17e79a9e82ca053203c0277f3070cb8a471", + "thresholds_and_completion_rule_unchanged": true, + "link_checks": { + "public_occurrences": 40, + "local_occurrences": 53, + "all_local_targets_exist": true, + "public_scope": "PinnedGitHubsource/PRlinks reviewed for attribution; fixedpublicPRheadsqueried. Nofreshhostedgateacceptance claim; nofullremoteHTTPcrawl." + }, + "archive_rehashed": { + "path": "/workspace/rheon-c1b3-stage-3b3b667.zip", + "bytes": 28934812, + "sha256": "5e40f320799865ba6c3e945499c5da1e6d7a6068deea0ab19b59b511f9d284a1" + }, + "findings": [], + "remaining_gates": [ + "Commit only reviewed resultdocs plus subsequent appended independently frozen reviewcopies; no selected/frozenmetadata change.", + "Resultdescendant isnot anewexecutionsubject; followdeclaredpacketdescendant/sourceguardvalidation beforepublicdraft.", + "Exact newheadhostedPages/browser/build/default/desktopchecks andpublicintegration/merge remainpending. Fixed133/138/141muststayunchanged.", + "CombinedQ2/C1needsseparatecompleteclosure/admission/qualification. CV3-Acurrentlypreparationonly; genericPDE/stability/movinggeometry/physics/model/wholefamily/stateful/learned/external/fullC1-R remainunaccepted." + ], + "limits": [ + "No builds/tests/campaign/source/ref/PRmutations; onlyexternalreviewreceiptwrites/read-onlyfixedPRqueries.", + "No newsimulation/numerical/compositionimplementation orthresholdchange approved.", + "Digests/custody do not confer authentication, reproducibility orphysicalacceptance." + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/result-document-review/result-document-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/result-document-review/result-document-review.md new file mode 100644 index 00000000..cfce7e18 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/result-document-review/result-document-review.md @@ -0,0 +1,29 @@ +# C1-B3 result-document independent review + +**Approved the exact9result-document paths below; no material finding.** Executed subject stays `3b3b667a8b81942a3ca95c7531b29525ac4494b2`, tree `e0255bc77e935159517482b39d3c542243fe069e`. The future result-document commit is a reporting descendant, not a newly executed subject. + +The compact qualification JSON is byte-identical to final external summary `68393fd154282259d79e42923088bf5354f795fca36a4f888b7954c40082aa2a`; both copied execution-review files are exact independent originals. Their full artifact audit remains attributed to that reviewer. I independently re-read actual counts, source/frozen bindings and local links, and rehashed the summary, native ELF/receipt and sealed archive. No tests/builds/campaigns were rerun. + +Actual results reconcile to18nativecommands,35Rusttests (including2exampletests),5native/rational specimens,gate5+5/oracle10+10,26normal+26optimized realpacket checks without skips, and **228focused=97library+6publicB2/B3+122legacy/volume+3compile-faildoctests**,0failures,3existingartifact/modelignores. Owner227/5anditscompiler/compatibilityfailures retain exact originalsource/evidence; none is relabelled. The1489fullsource/140input/17actualELF/76member completeaudit is source-bound, not universalbehavioralcoverage. + +Archive remains28,934,812bytes at `5e40f320799865ba6c3e945499c5da1e6d7a6068deea0ab19b59b511f9d284a1`. The Library61d39f8d/version0 declaration and localcustody limits agree with finalsummary/independentaudit. No new remoteLibrarydownload/authentication claim is introduced. Resource deduplication/owncompletedtargetretirement is reported as resource handling, not a new test run; retained artifact evidence stays intact. + +All140selected inputs and all pre-existing B3admission/protocol/source-review/final-review bytes remain unchanged against frozen3b3b667. Prior186result files and retained ancestry are unchanged. Fresh read-onlyGitHub queries confirm PR133=`8bf542e`,PR138=`a6bfcc9`,PR141=`38c40ca`, all stilldraft/open. The canonical verification diff changes only the C1-Rstatuscell; all numericalthresholds and planCompletionrule remain exact. No Q-Scriteria or CV3scope change occurs in this delta. + +All53local Markdownlink occurrences across the reviewedfiles resolve;40publiclinks retain source/PRattribution. No newhosted acceptance is inferred. The documents distinguish boundedlocalqualification from pending exact-headhosted/merge, default/desktop/window/release/performance, physical/model/Lean/GPU, jointQ2/C1 and fullC1/stateful/external/learned/wholefamily gates. CV3-Aremains separate prospective preparation and no newcompositionimplementation is admitted. + +Beforepublication, commit only these reviewedresultbytes and separately frozenreviewcopies; preserve boundmetadata. Complete the declared reporting-descendant packet/sourceguardvalidation and exact-headhostedgates. No publicmerge or source/refmutation was performed by this reviewer. + +| Exact reviewed result path | SHA256 | +| --- | --- | +| `docs/plans/fluid-accuracy-composition/execution-ledger.md` | `05b30707f38630c4e50c95c72641964f053ac4aa4b1be832bcffb06e7eb5fa5b` | +| `docs/plans/fluid-accuracy-composition/issues.md` | `da3e62008a5dfff24e541646423de794de9bbb08397f91f3b5241f3e1b082c68` | +| `docs/plans/fluid-accuracy-composition/plan.md` | `a3de5caaa0516f3af162796150f8f37a767b4a749b3b9d15992c4ff6ff207c29` | +| `docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.json` | `5b8e13f7e6f584afa38d6fbaf5a396d0d11c23ac4cfe99cdd60a46df9b289738` | +| `docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.md` | `ca9380253f27cd236796889383795a8e33cc63b443b480681a6b0b8ccd282463` | +| `docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.json` | `68393fd154282259d79e42923088bf5354f795fca36a4f888b7954c40082aa2a` | +| `docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.md` | `ee5ecf9c83d71e2d055dd4c5098b35eb0e5a07a4f95c1b3e50c8452f09f25286` | +| `docs/plans/fluid-accuracy-composition/reports/integration-20261020.md` | `1fe3a8664d028135552340478b1c91d19a1219eb4b52b3a1c3a0f5e92cb32a33` | +| `docs/plans/fluid-accuracy-composition/reports/verification.md` | `f3f006caed0d48f41c17b58ce3da47e0c34375693b86dd727f6a190d8d6ca7fb` | + +[Machine-readable receipt](result-document-review.json) records exact paths, frozeninputs, counts, priorpublicheadchecks and remaininggates. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.json b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.json new file mode 100644 index 00000000..5237f012 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.json @@ -0,0 +1,1512 @@ +{ + "schema": "rheon-c1b3-complete-selected-source-readiness-independent-review-v1", + "status": "APPROVED_EXACT140_SOURCE_FOR_SEPARATE_EXPLICIT_ADMISSION_AND_FRESH_COMPOSED_QUALIFICATION", + "reviewed_at_utc": "2026-10-20T04:52:19.215407+00:00", + "subject": { + "head": "5dc1741feffa88b857194559b3e7e79be5369a64", + "tree": "3192914b27bed0bff9c07320b0ee2145656d5f53", + "base_pr137": "d3e62377acde6641c8133cf9a9356cc046cfd02a", + "qualified_lead_stage": "186dc0a18f787748eb723d91321e44ffd0e374d5", + "descends_pr137": true, + "descends_qualified186": false + }, + "selected_count": 140, + "source_map_sha256": "6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d", + "delta_vs_both_pr137_and_qualified186": { + "changed": 8, + "unchanged": 132, + "added": 0, + "removed": 0 + }, + "complete_committed_selector_and_all140pins_verified": true, + "paths": [ + { + "path": "Cargo.lock", + "sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "pr137_and_qualified186_sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "Cargo.toml", + "sha256": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "pr137_and_qualified186_sha256": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "examples/aligned_strain.rs", + "sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "pr137_and_qualified186_sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "rust-toolchain.toml", + "sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "pr137_and_qualified186_sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/advection.rs", + "sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "pr137_and_qualified186_sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/aligned_strain.rs", + "sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "pr137_and_qualified186_sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/README.md", + "sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "pr137_and_qualified186_sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/accepted_session.rs", + "sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "pr137_and_qualified186_sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider.rs", + "sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "pr137_and_qualified186_sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs", + "sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "pr137_and_qualified186_sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider_tests.rs", + "sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "pr137_and_qualified186_sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs", + "sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "pr137_and_qualified186_sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/adapter.rs", + "sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "pr137_and_qualified186_sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/configured_track.rs", + "sha256": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "pr137_and_qualified186_sha256": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/configured_track_tests.rs", + "sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "pr137_and_qualified186_sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/cpu_contract_tests.rs", + "sha256": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "pr137_and_qualified186_sha256": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_runs.rs", + "sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "pr137_and_qualified186_sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_view.rs", + "sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "pr137_and_qualified186_sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_worker.rs", + "sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "pr137_and_qualified186_sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs", + "sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "pr137_and_qualified186_sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/engine.rs", + "sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "pr137_and_qualified186_sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/engine_typed_tests.rs", + "sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "pr137_and_qualified186_sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/mod.rs", + "sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "pr137_and_qualified186_sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/model_process.rs", + "sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "pr137_and_qualified186_sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/prediction_contract_tests.rs", + "sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "pr137_and_qualified186_sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/record.rs", + "sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "pr137_and_qualified186_sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/scene.rs", + "sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "pr137_and_qualified186_sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/view.rs", + "sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "pr137_and_qualified186_sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/ai_comparison/worker.rs", + "sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "pr137_and_qualified186_sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/archive_view.rs", + "sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "pr137_and_qualified186_sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/build_identity.rs", + "sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "pr137_and_qualified186_sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/camera.rs", + "sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "pr137_and_qualified186_sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/carrier_execution.rs", + "sha256": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "pr137_and_qualified186_sha256": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/collision_ui.rs", + "sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "pr137_and_qualified186_sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/comparison.rs", + "sha256": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "pr137_and_qualified186_sha256": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/comparison_archive.rs", + "sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "pr137_and_qualified186_sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/comparison_field_view.rs", + "sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "pr137_and_qualified186_sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/configured_comparison_tests.rs", + "sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "pr137_and_qualified186_sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/configured_controls.rs", + "sha256": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "pr137_and_qualified186_sha256": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/configured_producer_exit_tests.rs", + "sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "pr137_and_qualified186_sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/configured_worker_tests.rs", + "sha256": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "pr137_and_qualified186_sha256": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/emitter_controls.rs", + "sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "pr137_and_qualified186_sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/engineering.rs", + "sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "pr137_and_qualified186_sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/export_ui.rs", + "sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "pr137_and_qualified186_sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/history.rs", + "sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "pr137_and_qualified186_sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/identity.rs", + "sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "pr137_and_qualified186_sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/inspector.rs", + "sha256": "54c68139c0aee8d8bcb24ea3fa303ecff6405ce75689fb440ef3184a75bcbe69", + "pr137_and_qualified186_sha256": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719", + "disposition": "changed", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "explicit desktop consumer refusal", + "rationale": "Extends existing pre-adoption refusal/cache invalidation to complete native-projection-selection namespace, including future versions; no graph or native-window feature." + }, + { + "path": "src/bin/desktop/particle_view.rs", + "sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "pr137_and_qualified186_sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/run_set_view.rs", + "sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "pr137_and_qualified186_sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/run_sets.rs", + "sha256": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "pr137_and_qualified186_sha256": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/run_sets/configured.rs", + "sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "pr137_and_qualified186_sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/run_sets/configured/archive.rs", + "sha256": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "pr137_and_qualified186_sha256": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/run_sets/source.rs", + "sha256": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "pr137_and_qualified186_sha256": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/settings.rs", + "sha256": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "pr137_and_qualified186_sha256": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/transport_view.rs", + "sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "pr137_and_qualified186_sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/viewport.rs", + "sha256": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "pr137_and_qualified186_sha256": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/workflow_inspector.rs", + "sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "pr137_and_qualified186_sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/desktop/workflow_inspector_tests.rs", + "sha256": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922", + "pr137_and_qualified186_sha256": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d", + "disposition": "changed", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "dual-profile consumer contracts", + "rationale": "Real builtin/selection accepted and header-only cancelled archives, literal RPS/RPP/RPT versions, future namespace refusal and prior G1 evidence/gesture cache clearing. Single consumer-only repair replaces private select_record with public select; old assertions retained." + }, + { + "path": "src/bin/rheon-ai-compare.rs", + "sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "pr137_and_qualified186_sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/rheon-desktop.rs", + "sha256": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "pr137_and_qualified186_sha256": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/bin/rheon.rs", + "sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "pr137_and_qualified186_sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/box_flux.rs", + "sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "pr137_and_qualified186_sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/box_flux_step.rs", + "sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "pr137_and_qualified186_sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/collision.rs", + "sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "pr137_and_qualified186_sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/column_mac.rs", + "sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "pr137_and_qualified186_sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/column_momentum.rs", + "sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "pr137_and_qualified186_sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/column_shear.rs", + "sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "pr137_and_qualified186_sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/column_surface.rs", + "sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "pr137_and_qualified186_sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/compressible.rs", + "sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "pr137_and_qualified186_sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/coupled_discrete.rs", + "sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "pr137_and_qualified186_sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/dense3d_sequence.rs", + "sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "pr137_and_qualified186_sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/emitter.rs", + "sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "pr137_and_qualified186_sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/emitter_controls.rs", + "sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "pr137_and_qualified186_sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/export.rs", + "sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "pr137_and_qualified186_sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/fitted_height.rs", + "sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "pr137_and_qualified186_sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/fixed_bottom_ale.rs", + "sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "pr137_and_qualified186_sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/forces.rs", + "sha256": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "pr137_and_qualified186_sha256": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/free_surface.rs", + "sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "pr137_and_qualified186_sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/geometry.rs", + "sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "pr137_and_qualified186_sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/lib.rs", + "sha256": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "pr137_and_qualified186_sha256": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/liquid_step.rs", + "sha256": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "pr137_and_qualified186_sha256": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/liquid_volume.rs", + "sha256": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "pr137_and_qualified186_sha256": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/material.rs", + "sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "pr137_and_qualified186_sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/material_session.rs", + "sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "pr137_and_qualified186_sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/mesh_collision.rs", + "sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "pr137_and_qualified186_sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/mesh_import.rs", + "sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "pr137_and_qualified186_sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/motion.rs", + "sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "pr137_and_qualified186_sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/native_family.rs", + "sha256": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "pr137_and_qualified186_sha256": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/native_family/tests.rs", + "sha256": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "pr137_and_qualified186_sha256": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/observation.rs", + "sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "pr137_and_qualified186_sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/obstacle_pressure.rs", + "sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "pr137_and_qualified186_sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/obstacle_shear.rs", + "sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "pr137_and_qualified186_sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/operator.rs", + "sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "pr137_and_qualified186_sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/parallel.rs", + "sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "pr137_and_qualified186_sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/particle_fluid.rs", + "sha256": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "pr137_and_qualified186_sha256": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/pressure.rs", + "sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "pr137_and_qualified186_sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/pressure_session.rs", + "sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "pr137_and_qualified186_sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/projection_step.rs", + "sha256": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c", + "pr137_and_qualified186_sha256": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3", + "disposition": "changed", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "finite stateless selection and observation owner", + "rationale": "Closed distinct producer/fallback enum and positive producer<=host cap; exact workspace match/capped separate scratch. Original native producer on actual immutable request, only actual IterationLimit recoverable into B1 same-input baseline. Successful candidate pressure/velocity or clean fallback adopted through unchanged publication; cancelled/other errors terminate. Versioned success/failure facts mutually exclusive, exact method/cap/iteration/witness0/metrics/selected role and stage-prefix validation; mixed witness fallback remains unpublished." + }, + { + "path": "src/provider_step.rs", + "sha256": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "pr137_and_qualified186_sha256": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/recording.rs", + "sha256": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "pr137_and_qualified186_sha256": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/recording/carrier.rs", + "sha256": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "pr137_and_qualified186_sha256": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/recording/comparison.rs", + "sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "pr137_and_qualified186_sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/recording/diagnostic.rs", + "sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "pr137_and_qualified186_sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/recording/material.rs", + "sha256": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "pr137_and_qualified186_sha256": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/recording/projection.rs", + "sha256": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588", + "pr137_and_qualified186_sha256": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24", + "disposition": "changed", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "additive typed role-bound cold custody", + "rationale": "New exact selection profile/RPS2/RPP2/RPT2 while preserving v1 namespaces/byte layout. Outer intent/version and embedded attempt version rejected before foreign payload parsing. Outer source/intent/attempt/selected role validated before private method-only inner adaptation. Authoritative public constructor remains fallback, actual selected receipt method separate. Existing SQLite/16KiB/source/prior/output/terminal/unrecorded-tail guards remain; no runtime/graph/restart inferred." + }, + { + "path": "src/recording/projection_tests.rs", + "sha256": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d", + "pr137_and_qualified186_sha256": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338", + "disposition": "changed", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "real SQLite and strict version/role contracts", + "rationale": "Both producers and actual cap1 fallback roundtrip after close/drop; old inner decoder still rejects producer-versus-fallback header mismatch. Actual producer-failure cancellation, final cancellation, mixed failure and accepted-unrecorded tail. Method/source/cap/profile/size/time/failure metrics/input/output/prior/duplicate-attempt corruption rejects. Both outer intent directions and public publication/cold-terminal embedded foreign versions reject Unsupported before truncated/foreign payload parsing." + }, + { + "path": "src/recording/provider.rs", + "sha256": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826", + "pr137_and_qualified186_sha256": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8", + "disposition": "changed", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "private method-only header adapter", + "rationale": "Existing capture_native delegates its original constructor method. New private header reconstruction changes only implementation, revalidates/rebinds exact old configuration encoding/source, and runs unchanged configured receipt validator with that explicitly validated method; no loosening of old configured public API." + }, + { + "path": "src/recording/provider/comparison.rs", + "sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "pr137_and_qualified186_sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/recording/provider/runtime.rs", + "sha256": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "pr137_and_qualified186_sha256": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/recording/workflow.rs", + "sha256": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "pr137_and_qualified186_sha256": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/sampling.rs", + "sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "pr137_and_qualified186_sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/scheduling.rs", + "sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "pr137_and_qualified186_sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/session.rs", + "sha256": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "pr137_and_qualified186_sha256": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/session/configured.rs", + "sha256": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "pr137_and_qualified186_sha256": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/session/projection.rs", + "sha256": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4", + "pr137_and_qualified186_sha256": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc", + "disposition": "changed", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "immutable Session intent integration", + "rationale": "Captures actual immutable intent/version into attempts and checks workspace grid/density/fallback/intent before callbacks/invocation. Reuses existing full-interval owner, atomic publication/accepted Arc/quota and cooperative deadline/cancel behavior; no second commit/history owner." + }, + { + "path": "src/session/projection_tests.rs", + "sha256": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d", + "pr137_and_qualified186_sha256": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6", + "disposition": "changed", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "actual cancellation/failure/rollback and ingress contracts", + "rationale": "Both directions and cap1/fullcap walk every reached checkpoint after prior acceptance; cancellation never retries producer and retains fields/Arc/quota. Same-owner retry equals fresh scratch. Private rejected field/momentum fallback versus unpublished mixed pressure; genuine producer+fallback cap1 failure; inner polls/deadline/late-volume/final/quota/stop/exhaustion and exact workspace/cap/role/version corruptions covered." + }, + { + "path": "src/sgs.rs", + "sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "pr137_and_qualified186_sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/simulation.rs", + "sha256": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "pr137_and_qualified186_sha256": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/solver_provider.rs", + "sha256": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "pr137_and_qualified186_sha256": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/solver_provider/composition.rs", + "sha256": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "pr137_and_qualified186_sha256": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/solver_provider/composition/projection.rs", + "sha256": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "pr137_and_qualified186_sha256": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/solver_provider/composition/projection_tests.rs", + "sha256": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "pr137_and_qualified186_sha256": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/solver_provider/composition_tests.rs", + "sha256": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "pr137_and_qualified186_sha256": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/solver_provider/configured.rs", + "sha256": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "pr137_and_qualified186_sha256": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/solver_provider/context.rs", + "sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "pr137_and_qualified186_sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/solver_provider/modal.rs", + "sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "pr137_and_qualified186_sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/static_obstacle.rs", + "sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "pr137_and_qualified186_sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/tracer_barrier.rs", + "sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "pr137_and_qualified186_sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/translated_viscous.rs", + "sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "pr137_and_qualified186_sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/viscosity.rs", + "sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "pr137_and_qualified186_sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/vtk_export.rs", + "sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "pr137_and_qualified186_sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/workflow.rs", + "sha256": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "pr137_and_qualified186_sha256": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "src/workflow/tests.rs", + "sha256": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "pr137_and_qualified186_sha256": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "tests/aligned_strain_contract.rs", + "sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "pr137_and_qualified186_sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "tests/obstacle_flow_contract.rs", + "sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "pr137_and_qualified186_sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "tests/static_obstacle_contract.rs", + "sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "pr137_and_qualified186_sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "tools/aligned_strain_oracle.py", + "sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "pr137_and_qualified186_sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "tools/qualify_aligned_strain.py", + "sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "pr137_and_qualified186_sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "tools/test_aligned_strain_oracle.py", + "sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "pr137_and_qualified186_sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + }, + { + "path": "tools/test_qualify_aligned_strain.py", + "sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "pr137_and_qualified186_sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "disposition": "unchanged", + "review_disposition": "APPROVED_BOUNDED_SOURCE_FOR_SEPARATE_ADMISSION_AND_FRESH_QUALIFICATION", + "classification": "exact approved PR137/qualified186 source identity reused", + "rationale": "Exact previous reviewed source bytes; prior per-path rationale retained in g1-cancel-followup.json. No historical execution transfer to new B3 closure." + } + ], + "extra_reviewed_public_contracts": { + "tests/projection_session_contract.rs": "0da2954a1be0ffa516287ee62132589a6900be162015d929c1fe1492a401f1cc", + "tests/recording_comparison_contract.rs": "567a33029ba512fd2417555415fa7d8324d7981112c7548917499e596c5a1b61" + }, + "source_evidence_split": { + "core": { + "commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c" + }, + "consumer": { + "commit": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163" + }, + "only_compiled_difference": "diff --git a/src/bin/desktop/workflow_inspector_tests.rs b/src/bin/desktop/workflow_inspector_tests.rs\nindex a81bd09..1522808 100644\n--- a/src/bin/desktop/workflow_inspector_tests.rs\n+++ b/src/bin/desktop/workflow_inspector_tests.rs\n@@ -179,7 +179,7 @@ fn c1b2_projection_profile_refusal_clears_cached_g1_evidence_and_gesture() {\n for ordinal in 0..source.count().unwrap() {\n assert!(\n source\n- .select_record(ordinal)\n+ .select(ordinal)\n .unwrap()\n .controls\n .starts_with(&format!(\"RPP{version}:\"))\n", + "consumer_to_final_changes": [ + "docs/plans/fluid-accuracy-composition/reports/c1b3-manifest.json", + "docs/plans/fluid-accuracy-composition/reports/c1b3-qualification.md", + "docs/plans/fluid-accuracy-composition/reports/c1b3-review.md" + ], + "all_source_manifest_hashes_verified": true + }, + "old_formats_and_role_review": { + "outer_intent": "get_intent matches tuple(expected outer version,tag) before method/cap payload; old-v1/new-v2cross-intents Unsupported. native_header binds exact namespace/configuration prefix/version.", + "embedded_attempt": "get_attempt first reads version and rejects any version different from expected outer intent or outside1/2; both publication decode and terminal call supply outer expected version. No foreign failure byte parsed under oldv1.", + "role": "Attempt source/intent validated before adapting inner method. producer success iff supplied selection, exact producer method/cap; actual producer failure iff new NativeBaseline with distinct host fallback and no witness/rejection; regular witness rejection retains separate NativeFallback. selected_native matches actual role/reports; old configured receipt validator unchanged.", + "old_inner": "capture_native uses actual constructor method as before; new wrapper private method-only adapter explicitly rebinds source/header. New decoded wrapper restores outer constructor fallback and documents separate selected receipt method; no old consumer reinterpretation." + }, + "mechanism": { + "unchanged_owner_pins_vs_pr137": { + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "3cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330", + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5" + }, + "owner_refusal": "Existing owner inventory135 versus complete140: path-set mismatch is exact source-derived expected refusal; reported checker exit1 attributed, no checker rerun on a different checkout.", + "lead186_refusal": "Qualified186 inventory already140, but8new hash mismatches: after composition its old inventory correctly refuses changed inputs, not a135/140shape refusal.", + "decision": "Existing explicit strict v3 mechanism sufficient. Preserve186boundreview/admission/results ancestry; append bounded review and explicitly pin complete newmap, then fresh clean committed qualification. Do not replace whole owner tree over186 or auto-refresh." + }, + "qualification_attribution": { + "reported_passed_executions": 227, + "reported_failed": 0, + "reported_existing_ignored": 5, + "new_test_functions_independently_counted": 15, + "new_test_definitions": { + "src/bin/desktop/inspector.rs": [], + "src/bin/desktop/workflow_inspector_tests.rs": [], + "src/projection_step.rs": [], + "src/recording/projection.rs": [], + "src/recording/projection_tests.rs": [ + "c1b3_projection_cold_cancel_failed_and_accepted_unrecorded_tails", + "c1b3_projection_cold_iteration_failure_corruption_and_history_links_refuse", + "c1b3_projection_intent_decoder_refuses_foreign_version_before_payload", + "c1b3_projection_publication_and_terminal_refuse_foreign_attempt_version_before_payload", + "c1b3_projection_selected_method_source_budget_and_profile_corruptions_refuse", + "c1b3_projection_sqlite_both_producers_and_real_iteration_failure_fallback" + ], + "src/recording/provider.rs": [], + "src/session/projection.rs": [], + "src/session/projection_tests.rs": [ + "c1b3_deadlines_inner_iterations_late_volume_and_terminal_guards_do_not_publish", + "c1b3_distinct_producer_faults_preserve_clean_host_fallback_and_unpublished_mixed_receipts", + "c1b3_each_observed_checkpoint_cancels_without_retry_or_publication_and_reused_scratch_matches_fresh", + "c1b3_genuine_fallback_iteration_failure_is_unpublished_and_repeatable", + "c1b3_invalid_intents_caps_and_exact_workspace_mismatch_refuse_before_invocation", + "c1b3_versioned_receipts_bind_producer_failure_method_cap_and_selected_role" + ], + "tests/projection_session_contract.rs": [ + "c1b3_one_hundred_selected_intervals_match_direct_producer_for_each_pair", + "c1b3_real_iteration_failure_fallback_matches_direct_fallback_for_both_pairs", + "c1b3_shortened_interval_binds_selected_producer_and_fallback" + ], + "tests/recording_comparison_contract.rs": [] + }, + "counts_deliberately_overlap": "12newdefault+3newpublic+97fullno-default+99legacy+3docs+13inspector; default/newunit executions overlap97. Not227distincttests.", + "source_200_intervals": "Public test loops100accepted SuppliedCandidate-selected intervals for each ordered distinct pair vs same producer algorithm direct Session; old B2 builtin100-permethod test remains.", + "source_actual_shortened_and_lowcap": "Both method directions use actual shorteneddt fixture; real cap1 producer failure publishes fallback for2intervals perpair=4. Source asserts actual failures/identities/fieldbitsequivalence, not fabricated failed facts.", + "raw_owner_logs_and_archive_available_locally": false, + "owner_independent_artifact_audit": { + "reviewer": "/root/persistence_independent", + "status": "PASS; no blockers", + "audited_pre_audit_manifest_sha256": "5039f58b41d4a342b4dfc39daee6fc4a1985ac60356f55b0e22dc79fe494b144", + "artifact_hashes_checked": 68, + "deciding_executable_records_checked": 12, + "historical_executable_records_checked": 14, + "deciding_command_logs_checked": 8, + "final_source_pins_checked": 140, + "historical_source_maps_checked": [ + "d7928c8", + "4af3802" + ], + "checkpoint_trees_checked": 15, + "equivalent_checkpoint_pairs_checked": 4, + "archive_members_checked": 68, + "protected_archives_unchanged": true, + "admission_inputs_modified": false, + "mismatches": 0 + }, + "raw_evidence_scope": "Manifest arithmetic/source identity and retained failure-repair code reviewed. No direct227-test log/ELF/68memberZIP rehash or execution claim in this review.", + "negative_evidence": "Compiler RecordedStep.clone and private reader-call failures plus actual d792 legacy-version compatibility failure retained; final version dispatch repairs are source-visible, regressions reach both public decode and actual cold terminals. No threshold/assertion weakening found." + }, + "checkpoint_identity_checks": [ + { + "commit": "4cefec089b797d4ef58994c37128fce712c296c5", + "tree": "8b6ac71a01e35d8c24ae4b13bbbb942ca1f23b5b", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "02cb2ee68a5a62f12d11a3bb112f2a828affd300", + "tree": "2cb8f7fb5ea28881e22d95c0db4eba847c87c3fa", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "2bc59e7c213eeb878653b6eaae3b4befc201250b", + "tree": "4b8ba05d388c62c4942a1999aa2dab5a4b6459aa", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "616492f43cfb93bbb3281427d21473513468b51a", + "tree": "bfac7729ebbcba8fe4c639fed9d85d73be8c3958", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "3c87312febb1ec8ec4b9199e8f19c94aeb86da53", + "tree": "da1eaaa0b1e91560ca5391d5a2c7bc1ccbb673d6", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "cc8be55c1ad67faa1dd75919ce6fbfded9ca69b9", + "tree": "69d7e4b9de6fea7a86d59ce93410a795e77540f5", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "f22513e647092ca85eedc2b3eb1a7c7c0fdadf72", + "tree": "3b820d9cb13a344adf397cb34dcbe7af7990ab21", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "76841b07718ededa7c9b2b8fe1b0ab9f45be8be4", + "tree": "ee410784343955dafeb59e6846e2fb12b1d656ba", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "d7928c8616ce49a2d90685a26636c844913c52b2", + "tree": "ee410784343955dafeb59e6846e2fb12b1d656ba", + "local_git_verified": true + }, + { + "commit": "50c4ad7bffd19b20186dd59cb3be3313b3209cf3", + "tree": "38ee17dd7d0ce98f997ef1c4fe0fa4a730fe14e0", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "f2ebaa7c7706e7f0e6bb2e2d5df117a71f42a681", + "tree": "38ee17dd7d0ce98f997ef1c4fe0fa4a730fe14e0", + "local_git_verified": true + }, + { + "commit": "dd387ff1abed1890154a9dc9d5301db268b49f1b", + "tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "local_git_verified": true + }, + { + "commit": "ae9dbe567eafbbf33f3889e5faf1418d8b4b3a25", + "tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163", + "local_git_verified": false, + "scope": "Owner manifest claim; object unavailable locally." + }, + { + "commit": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163", + "local_git_verified": true + } + ], + "hosted_snapshot": { + "pr": 140, + "url": "https://github.com/MrScripty/Rheon/pull/140", + "state": "OPEN", + "draft": true, + "head": "5dc1741feffa88b857194559b3e7e79be5369a64", + "base": "fix/g1-advection-cancel-20261020", + "mergeable": "MERGEABLE", + "exact_head_check_runs": 14, + "check_status_counts": { + "queued": 14 + }, + "exact_head_workflow_runs": 9, + "workflow_status_counts": { + "queued": 9 + }, + "CodeRabbit": "SUCCESS at PRrollup snapshot; not fullhosted acceptance", + "receipt_sha256": { + "exact-head-hosted.json": "d50f807bbc92b7f23b402d6542ec51d5b779c823843f59bf86c6a307de4bd389", + "exact-head-check-runs.json": "e3ebe10303381c1eae26622a5f6ac82ed01cd603b14a99e702ad78067663b773", + "exact-head-workflow-runs.json": "fb7d009c06dbe2f425c78ae4827bd229dc56c872e56d61af84a4dbe801c32a5e" + } + }, + "findings": [], + "remaining_gates": [ + "Explicitly compose owner history with186/admission/result lineage without source changes orQ2Cargo, review final metadata append/map and freeze clean committed source.", + "Fresh native/rational/actual packet normal/-O plus declared full97library/all6projectionpublic/legacy122volume/borrow3 and any scoped consumer composition checks. Owner227 and186213 receipts stay exact original subjects.", + "Required exact-head hosted gates and leadserial integration/merge disposition: current PR140 draft withall14checks/9runs queued; MERGEABLE/CodeRabbitSUCCESS are insufficient.", + "Graph/nativewindow/performance/model/physical accuracy, external/statefultransactions, learned/particle/whole-family/transfer andfullC1-B/C/R remain separate/unaccepted." + ], + "limits": [ + "No builds/tests/campaigns/source/inventory/ref/PR mutations; only external review artifacts andread-only GitHubqueries.", + "No new API/runtime/solver implementation; no production numerical formula/order orpublication change admitted beyond closed existingmethod choice.", + "Cargo/toolchain/admissionmechanism/privateQ2sources unchanged frompriorclosure. No authentication/bitreproducibility claim." + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.md new file mode 100644 index 00000000..1f10989b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.md @@ -0,0 +1,44 @@ +# C1-B3 exact-source admission readiness — independent review + +**Approved exact140 selected source for separate explicit v3 admission and fresh composed qualification. No material source finding. Not ready for hosted/merge acceptance.** + +Reviewed PR140 `5dc1741feffa88b857194559b3e7e79be5369a64`, tree `3192914b27bed0bff9c07320b0ee2145656d5f53`. Complete committed selector and all140 manifest pins verified: **8changed,132unchanged,0added/removed**, identically relative to PR137 `d3e62377acde6641c8133cf9a9356cc046cfd02a` and qualified leadstage `186dc0a18f787748eb723d91321e44ffd0e374d5`. Map SHA256 `6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d`. Every10changed source/test input is declared:8selected plus the2public contracts. Cargo/toolchain and source-admission mechanism are unchanged. The132 prior identities reuse their exact independent per-path review, not their old execution results. + +## Contracts and strict compatibility + +The closed intent selects one of the two original native methods, distinct from the constructor fallback, with positive producercap<=hostcap. Exact grid/density/fallback/intent matching and aggregate array caps precede invocation. Only actual producer IterationLimit is recoverable; B1 baseline uses the original immutable provisional request and full-cap fallback. Cancellation/other errors do not retry. Successful producer, native baseline after producer failure and witness-rejection fallback retain distinct typed facts/methods/timings. Witness diagnostics remain iteration0; actual producer/fallback iterations and selected report are separately bounded and bound to their roles. Disposable scratch does not establish stateful/external transaction semantics. + +Session remains the sole complete-interval publication/accepted-history/quota owner. B2's original builtin path, precommit sealing, late gates and unpublished mixed-pressure witness refusal remain. Real source tests cover actual selected field equivalence, shorteneddt, actual low-cap failure/fallback, true fallbackfailure, cancellation/deadline/final/late-volume rollback and successful fresh/reused scratch retry; no invented model or physical pass. + +New RPS2/RPP2/RPT2 lives only in the exact selection namespace. **Outer intent and embedded attempt versions are strict before payload parsing**: get_intent matches outerversion/tag; get_attempt rejects wrong expectedversion before any foreign intent/failure payload. Both publication and terminal public callers supply the outer version. Regressions test both directions with truncated and foreign payloads, including actual cold terminals. Old RPS1/RPP1/RPT1 omits the newfailurebyte and keeps its meaning. + +The private inner-header adapter changes only implementation **after outer source/intent/selected-role validation**. Original configured validators/source binding remain strict; direct old decoding rejects producer-versus-fallback headers. The new decoded wrapper retains the actual outer fallback constructor while its selected receipt names the validated actual method. No Sessionconfiguration mutation or unknown-to-legacy normalization. Existing SQLite/16KiB/source/output/prior/terminal/tail custody remains. Desktop explicitly refuses both namespaces and clears prior graph/evidence/gesture state; comparison allowlist remains closed. + +## Source/evidence subjects + +Core `4af3802babe332d8dfeb926c19159b4b656be775` and consumer `9ddf8d2fd860c73bbcc35a077e08099d894db07a` differ by exactly one new UI test call from private select_record to public select. All production/library/core/public-test/Cargo/toolchain bytes are identical. Finalhead adds only3evidence documents beyond consumer. Manifest execution arithmetic is **227passes/0failures/5existingignores**, deliberately overlapping:12newdefault+3newpublic+97fullno-default+99legacy+3doctests+13inspector. There are15new test definitions, not227distinct tests. Public source checks100actually selected intervals per ordered pair (200total),2shortenedcases and4real low-cap fallbackintervals. These remain owner-attributed execution results: raw logs,ELFs and98MB archive were unavailable locally; no duplicate execution/rawartifactaudit is claimed here. + +Retained negative evidence includes compiler fixture errors and a real d792 legacy foreign-version-refusal failure. Final source fixes outer intent and embedded versions without weakening old assertions/criteria. The single consumer API correction did not trigger a false claim of rerun core evidence. Per-checkpoint objects available locally were checked; unavailable local-owner objects remain explicitly attributed in JSON. + +## Admission, dependencies and hosted gates + +Ownerbranch descendsPR137, **not qualified186**; later leadcomposition must retain186inventory/review/result ancestry. The owner's unchanged135inventory correctly refuses its140path closure. Against186's140inventory, these8changed hashes would instead fail the source-hash guard. Existing explicit v3 is sufficient: preserve bound review prefix/history, append independently reviewed newmap, commit cleanly and run fresh native/rational/realpacket plus actual composed library/public/legacy/volume/borrow gates. No source receipt transfers to that new whole-Git subject; Q2Cargo/reference/CV inputs remain separate. + +Read-only GitHub snapshot verifies exacthead5dc: PR140 OPEN,DRAFT,MERGEABLE; **14exact-headcheckruns and9exact-headworkflowruns areQUEUED**. CodeRabbitSUCCESS is separate. Required hostedgates and leadserial integration/merge remain blockers. No merge readiness follows from MERGEABLE. + +No learned/stateful/external/whole-family/particle/transfer, newgraph/nativewindow, physical/model/GPU/Lean/performance or genericfullC1-B/C/R acceptance is inferred. No build/test/campaign/source/ref/PR mutation occurred. + +## Changed selected paths + +| Path | Independent disposition | +| --- | --- | +| `src/bin/desktop/inspector.rs` | Extends existing pre-adoption refusal/cache invalidation to complete native-projection-selection namespace, including future versions; no graph or native-window feature. | +| `src/bin/desktop/workflow_inspector_tests.rs` | Real builtin/selection accepted and header-only cancelled archives, literal RPS/RPP/RPT versions, future namespace refusal and prior G1 evidence/gesture cache clearing. Single consumer-only repair replaces private select_record with public select; old assertions retained. | +| `src/projection_step.rs` | Closed distinct producer/fallback enum and positive producer<=host cap; exact workspace match/capped separate scratch. Original native producer on actual immutable request, only actual IterationLimit recoverable into B1 same-input baseline. Successful candidate pressure/velocity or clean fallback adopted through unchanged publication; cancelled/other errors terminate. Versioned success/failure facts mutually exclusive, exact method/cap/iteration/witness0/metrics/selected role and stage-prefix validation; mixed witness fallback remains unpublished. | +| `src/recording/projection.rs` | New exact selection profile/RPS2/RPP2/RPT2 while preserving v1 namespaces/byte layout. Outer intent/version and embedded attempt version rejected before foreign payload parsing. Outer source/intent/attempt/selected role validated before private method-only inner adaptation. Authoritative public constructor remains fallback, actual selected receipt method separate. Existing SQLite/16KiB/source/prior/output/terminal/unrecorded-tail guards remain; no runtime/graph/restart inferred. | +| `src/recording/projection_tests.rs` | Both producers and actual cap1 fallback roundtrip after close/drop; old inner decoder still rejects producer-versus-fallback header mismatch. Actual producer-failure cancellation, final cancellation, mixed failure and accepted-unrecorded tail. Method/source/cap/profile/size/time/failure metrics/input/output/prior/duplicate-attempt corruption rejects. Both outer intent directions and public publication/cold-terminal embedded foreign versions reject Unsupported before truncated/foreign payload parsing. | +| `src/recording/provider.rs` | Existing capture_native delegates its original constructor method. New private header reconstruction changes only implementation, revalidates/rebinds exact old configuration encoding/source, and runs unchanged configured receipt validator with that explicitly validated method; no loosening of old configured public API. | +| `src/session/projection.rs` | Captures actual immutable intent/version into attempts and checks workspace grid/density/fallback/intent before callbacks/invocation. Reuses existing full-interval owner, atomic publication/accepted Arc/quota and cooperative deadline/cancel behavior; no second commit/history owner. | +| `src/session/projection_tests.rs` | Both directions and cap1/fullcap walk every reached checkpoint after prior acceptance; cancellation never retries producer and retains fields/Arc/quota. Same-owner retry equals fresh scratch. Private rejected field/momentum fallback versus unpublished mixed pressure; genuine producer+fallback cap1 failure; inner polls/deadline/late-volume/final/quota/stop/exhaustion and exact workspace/cap/role/version corruptions covered. | + +The [machine-readable review](readiness-review.json) lists every140pin, priorhash, per-path disposition, exact source/evidence split, hosted snapshots and remaining gates. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/source-map-review-input.json b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/source-map-review-input.json new file mode 100644 index 00000000..640f4d40 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/source-map-review-input.json @@ -0,0 +1,159 @@ +{ + "status": "REVIEW_INPUT_NOT_ADMISSION", + "source_head": "1405179185e3f33b1bd65a5ff1dfbfb4ed8f7dde", + "source_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "54c68139c0aee8d8bcb24ea3fa303ecff6405ce75689fb440ef3184a75bcbe69", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "src/bin/desktop/settings.rs": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/forces.rs": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/projection_step.rs": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "src/recording/carrier.rs": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/material.rs": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "src/recording/projection.rs": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588", + "src/recording/projection_tests.rs": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d", + "src/recording/provider.rs": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "src/session/projection.rs": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4", + "src/session/projection_tests.rs": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "map_sha256": "6cf9712dbebbec79309d9ead4b6514d5cec3cf7559452d0ff16824735d49d22d", + "count": 140, + "changed_from_186dc0a": [ + "src/bin/desktop/inspector.rs", + "src/bin/desktop/workflow_inspector_tests.rs", + "src/projection_step.rs", + "src/recording/projection.rs", + "src/recording/projection_tests.rs", + "src/recording/provider.rs", + "src/session/projection.rs", + "src/session/projection_tests.rs" + ], + "expected_old_inventory_refusal_exit": 1 +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-manifest.json b/docs/plans/fluid-accuracy-composition/reports/c1b3-manifest.json new file mode 100644 index 00000000..98441015 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-manifest.json @@ -0,0 +1,1195 @@ +{ + "schema": "rheon-c1b3-classical-projection-selection-qualification-v1", + "status": "locally qualified; lead complete-source admission and hosted integration pending", + "pull_request": 140, + "base_commit": "d3e62377acde6641c8133cf9a9356cc046cfd02a", + "admission_main": "718469beedb9a949f4bb6f3299c7b880b4c47e47", + "last_fetched_main": "718469beedb9a949f4bb6f3299c7b880b4c47e47", + "core_subject": { + "commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c" + }, + "consumer_subject": { + "commit": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163" + }, + "evidence_split": { + "core": "4af3802babe332d8dfeb926c19159b4b656be775", + "consumer": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "only_changed_path": "src/bin/desktop/workflow_inspector_tests.rs", + "change": "single test call select_record -> public select", + "all_production_library_core_test_public_contract_cargo_toolchain_blobs_identical": true, + "diff": "diff --git a/src/bin/desktop/workflow_inspector_tests.rs b/src/bin/desktop/workflow_inspector_tests.rs\nindex a81bd09..1522808 100644\n--- a/src/bin/desktop/workflow_inspector_tests.rs\n+++ b/src/bin/desktop/workflow_inspector_tests.rs\n@@ -179,7 +179,7 @@ fn c1b2_projection_profile_refusal_clears_cached_g1_evidence_and_gesture() {\n for ordinal in 0..source.count().unwrap() {\n assert!(\n source\n- .select_record(ordinal)\n+ .select(ordinal)\n .unwrap()\n .controls\n .starts_with(&format!(\"RPP{version}:\"))\n" + }, + "toolchain": "Rust1.92.0; locked; native CPU", + "environment": { + "RUSTUP_HOME": "/tmp/rheon-rustup", + "CARGO_HOME": "/tmp/rheon-cargo", + "CARGO_PROFILE_TEST_DEBUG": "0", + "CARGO_PROFILE_DEV_DEBUG": "0" + }, + "green_summary": { + "passing_deciding_executions": 227, + "failed_deciding_executions": 0, + "existing_ignored": 5, + "new_test_functions": 15, + "actually_selected_integrated_intervals": 200, + "selected_intervals_per_ordered_pair": 100, + "shortened_pair_cases": 2, + "actual_low_cap_fallback_intervals": 4 + }, + "deciding_commands": [ + { + "name": "final-new-default", + "command": "cargo test --locked --lib --test projection_session_contract c1b3_ -- --nocapture", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 85 filtered out; finished in 0.99s", + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out; finished in 99.47s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/final-new-default-rheon-d293312d0455f2e1", + "bytes": 62157408, + "sha256": "950f75f29cd8c5102f866d5c672cf00e8c025644928405d3335931c6fda3081a" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-new-default-projection_session_contract-a851ff4fba446d75", + "bytes": 7291176, + "sha256": "b3ca03de15300b5ba7d8fed1aa00b0fe8b9b3f23161c873d43bd001037bc2407" + } + ] + }, + { + "name": "final-core-lib", + "command": "cargo test --locked --no-default-features --lib", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 97 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 42.86s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/final-core-lib-rheon-2c0b8f9f964eff45", + "bytes": 62110480, + "sha256": "04d265471e213b781509e532a969f309a8d272963e540fc3e355dba5de418225" + } + ] + }, + { + "name": "final-contracts", + "command": "cargo test --locked --no-default-features --test recording_contract --test recording_provider_contract --test recording_provider_runtime_contract --test configured_provider_session_contract --test provider_step_contract --test solver_provider_contract --test pressure_session_contract --test recording_comparison_contract", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.19s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.07s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.55s", + "test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s", + "test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.06s", + "test result: ok. 5 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-configured_provider_session_contract-7a47e2a64e933952", + "bytes": 13192448, + "sha256": "4b4421015aa35b266306cb792743d31ba84a4d7975ea69e414f8aaaf86fb7218" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-pressure_session_contract-536f0b07b486b9ae", + "bytes": 2261280, + "sha256": "eaec358eda46426ffb0c3b41fe473635e1ae15317190862245543c239ef192f4" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-provider_step_contract-024046052e7e09fc", + "bytes": 9682512, + "sha256": "d986ea2a0d22478bf7590ca35460a0d303c058662d3c31777d00a97268c17342" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_comparison_contract-b830fe95a847344e", + "bytes": 8316960, + "sha256": "33977e2d23d76e8046e92586e44677fe941095c2402f5820fc03b1d0dd593c3b" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_contract-01e8969397d0bfcc", + "bytes": 5608272, + "sha256": "3b788b6cae06eb17c655c1667d64da50820c6acf50030bfc751f59efdc844fa7" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_provider_contract-4fd9d23bc6148b03", + "bytes": 11392472, + "sha256": "f5f8cb4cfc787da2911b2b5a2b3d11b2695bbcab67bbf033fe9a248c21ca70c5" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_provider_runtime_contract-479509e11f8147d8", + "bytes": 6787840, + "sha256": "de3542d100fe59d75ff8e1e994f4f761ea2df6a57f023a15882415329cbf717a" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-solver_provider_contract-4f9ffb3b3a91bb87", + "bytes": 2087976, + "sha256": "9ff043b78305a18df5d008d6ebb192e00dad8a0086f51e986fff2c831d725ab8" + } + ] + }, + { + "name": "final-doctests", + "command": "cargo test --locked --no-default-features --doc", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s" + ], + "executables": [] + }, + { + "name": "final-clippy-core", + "command": "cargo clippy --locked --no-default-features --all-targets -- -D warnings", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [], + "executables": [] + }, + { + "name": "consumer-ui", + "command": "cargo test --locked --features desktop --bin rheon-desktop workflow_inspector::tests::", + "source_commit": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "source_tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163", + "exit_code": 0, + "target_dir": "/tmp/rheon-target", + "test_results": [ + "test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 152 filtered out; finished in 5.11s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/consumer-ui-rheon_desktop-1f5fbd0763f87c5a", + "bytes": 82896000, + "sha256": "ae4e169aa5e1149c28e2500036e85c27277929149e65c1e39a0247af2a2c7427" + } + ] + }, + { + "name": "consumer-clippy-desktop", + "command": "cargo clippy --locked --features desktop --all-targets -- -D warnings", + "source_commit": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "source_tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163", + "exit_code": 0, + "target_dir": "/tmp/rheon-target", + "test_results": [], + "executables": [] + }, + { + "name": "consumer-fmt", + "command": "cargo fmt --all -- --check", + "source_commit": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "source_tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [], + "executables": [] + } + ], + "source_files_changed_from_base": { + "src/bin/desktop/inspector.rs": "54c68139c0aee8d8bcb24ea3fa303ecff6405ce75689fb440ef3184a75bcbe69", + "src/bin/desktop/workflow_inspector_tests.rs": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922", + "src/projection_step.rs": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c", + "src/recording/projection.rs": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588", + "src/recording/projection_tests.rs": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d", + "src/recording/provider.rs": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826", + "src/session/projection.rs": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4", + "src/session/projection_tests.rs": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d", + "tests/projection_session_contract.rs": "0da2954a1be0ffa516287ee62132589a6900be162015d929c1fe1492a401f1cc", + "tests/recording_comparison_contract.rs": "567a33029ba512fd2417555415fa7d8324d7981112c7548917499e596c5a1b61" + }, + "read_only_final_selected_source_map": { + "source": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "selected": 140, + "added": [], + "removed": [], + "changed_from_pr137": { + "src/bin/desktop/inspector.rs": { + "pr137": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719", + "c1b3": "54c68139c0aee8d8bcb24ea3fa303ecff6405ce75689fb440ef3184a75bcbe69" + }, + "src/bin/desktop/workflow_inspector_tests.rs": { + "pr137": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d", + "c1b3": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922" + }, + "src/projection_step.rs": { + "pr137": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3", + "c1b3": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c" + }, + "src/recording/projection.rs": { + "pr137": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24", + "c1b3": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588" + }, + "src/recording/projection_tests.rs": { + "pr137": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338", + "c1b3": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d" + }, + "src/recording/provider.rs": { + "pr137": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8", + "c1b3": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826" + }, + "src/session/projection.rs": { + "pr137": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc", + "c1b3": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4" + }, + "src/session/projection_tests.rs": { + "pr137": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6", + "c1b3": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d" + } + }, + "unchanged_from_pr137": 132, + "source_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "54c68139c0aee8d8bcb24ea3fa303ecff6405ce75689fb440ef3184a75bcbe69", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "src/bin/desktop/settings.rs": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/forces.rs": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/projection_step.rs": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "src/recording/carrier.rs": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/material.rs": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "src/recording/projection.rs": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588", + "src/recording/projection_tests.rs": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d", + "src/recording/provider.rs": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "src/session/projection.rs": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4", + "src/session/projection_tests.rs": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + } + }, + "source_admission": { + "subject": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "command": "python3 docs/education/check_native_admission.py", + "exit_code": 1, + "reason": "reviewed native source inventory added or missing path", + "admission_files_modified": false, + "status": "pending lead-owned complete-source review/pinning/native-rational qualification" + }, + "historical_evaluations": [ + { + "subject": "f22513e647092ca85eedc2b3eb1a7c7c0fdadf72", + "kind": "compiler", + "result": "4fixture RecordedStep.clone errors; no behavior executed", + "log": "initial-unit.log", + "repair": "76841b07718ededa7c9b2b8fe1b0ab9f45be8be4" + }, + { + "subject": "76841b07718ededa7c9b2b8fe1b0ab9f45be8be4", + "kind": "focused", + "result": "10passed0failed", + "log": "initial-unit-repaired.log" + }, + { + "subject": "d7928c8616ce49a2d90685a26636c844913c52b2", + "kind": "sequential", + "records": [ + { + "name": "final-new-default", + "command": "cargo test --locked --lib --test projection_session_contract c1b3_ -- --nocapture", + "source_commit": "d7928c8616ce49a2d90685a26636c844913c52b2", + "source_tree": "ee410784343955dafeb59e6846e2fb12b1d656ba", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 85 filtered out; finished in 0.93s", + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out; finished in 93.18s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/final-new-default-rheon-d293312d0455f2e1", + "bytes": 62141360, + "sha256": "e362c34784069da27a04ad38c21bcb7ee46b27544b539908d3388f5ad88b5c4e", + "original_path": "/workspace/rheon-c1b3-evidence/final-new-default-rheon-d293312d0455f2e1" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/final-new-default-projection_session_contract-a851ff4fba446d75", + "bytes": 7291176, + "sha256": "089e1e687b13ee27267d92b170bff23af6b44b6f2af74ab9eed0279c5210137b", + "original_path": "/workspace/rheon-c1b3-evidence/final-new-default-projection_session_contract-a851ff4fba446d75" + } + ] + }, + { + "name": "final-core-lib", + "command": "cargo test --locked --no-default-features --lib", + "source_commit": "d7928c8616ce49a2d90685a26636c844913c52b2", + "source_tree": "ee410784343955dafeb59e6846e2fb12b1d656ba", + "exit_code": 101, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: FAILED. 94 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 44.27s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/final-core-lib-rheon-2c0b8f9f964eff45", + "bytes": 62094432, + "sha256": "d680a321e0f38bb94cff497bde18891122742507d4850b95e1aaa9aa69aacb2d", + "original_path": "/workspace/rheon-c1b3-evidence/final-core-lib-rheon-2c0b8f9f964eff45" + } + ] + } + ], + "result": "10newunit+3publicPASS including200selectedintervals;94libraryPASS1legacyforeign-intent-refusalFAIL", + "artifacts": "evaluation-d792; original commands retained, relocated executable paths in retained-commands.json" + }, + { + "subject": "50c4ad7bffd19b20186dd59cb3be3313b3209cf3", + "kind": "focused", + "result": "13passed0failed", + "log": "intent-dispatch-repair.log" + }, + { + "subject": "dd387ff1abed1890154a9dc9d5301db268b49f1b", + "kind": "focused", + "result": "14passed0failed", + "log": "outer-version-dispatch-repair.log" + }, + { + "subject": "4af3802babe332d8dfeb926c19159b4b656be775", + "kind": "sequential", + "records": [ + { + "name": "final-new-default", + "command": "cargo test --locked --lib --test projection_session_contract c1b3_ -- --nocapture", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 85 filtered out; finished in 0.99s", + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out; finished in 99.47s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-new-default-rheon-d293312d0455f2e1", + "bytes": 62157408, + "sha256": "950f75f29cd8c5102f866d5c672cf00e8c025644928405d3335931c6fda3081a", + "original_path": "/workspace/rheon-c1b3-evidence/final-new-default-rheon-d293312d0455f2e1" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-new-default-projection_session_contract-a851ff4fba446d75", + "bytes": 7291176, + "sha256": "b3ca03de15300b5ba7d8fed1aa00b0fe8b9b3f23161c873d43bd001037bc2407", + "original_path": "/workspace/rheon-c1b3-evidence/final-new-default-projection_session_contract-a851ff4fba446d75" + } + ] + }, + { + "name": "final-core-lib", + "command": "cargo test --locked --no-default-features --lib", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 97 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 42.86s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-core-lib-rheon-2c0b8f9f964eff45", + "bytes": 62110480, + "sha256": "04d265471e213b781509e532a969f309a8d272963e540fc3e355dba5de418225", + "original_path": "/workspace/rheon-c1b3-evidence/final-core-lib-rheon-2c0b8f9f964eff45" + } + ] + }, + { + "name": "final-contracts", + "command": "cargo test --locked --no-default-features --test recording_contract --test recording_provider_contract --test recording_provider_runtime_contract --test configured_provider_session_contract --test provider_step_contract --test solver_provider_contract --test pressure_session_contract --test recording_comparison_contract", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.19s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.07s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.55s", + "test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s", + "test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.06s", + "test result: ok. 5 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s" + ], + "executables": [ + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-configured_provider_session_contract-7a47e2a64e933952", + "bytes": 13192448, + "sha256": "4b4421015aa35b266306cb792743d31ba84a4d7975ea69e414f8aaaf86fb7218", + "original_path": "/workspace/rheon-c1b3-evidence/final-contracts-configured_provider_session_contract-7a47e2a64e933952" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-pressure_session_contract-536f0b07b486b9ae", + "bytes": 2261280, + "sha256": "eaec358eda46426ffb0c3b41fe473635e1ae15317190862245543c239ef192f4", + "original_path": "/workspace/rheon-c1b3-evidence/final-contracts-pressure_session_contract-536f0b07b486b9ae" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-provider_step_contract-024046052e7e09fc", + "bytes": 9682512, + "sha256": "d986ea2a0d22478bf7590ca35460a0d303c058662d3c31777d00a97268c17342", + "original_path": "/workspace/rheon-c1b3-evidence/final-contracts-provider_step_contract-024046052e7e09fc" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-recording_comparison_contract-b830fe95a847344e", + "bytes": 8316960, + "sha256": "33977e2d23d76e8046e92586e44677fe941095c2402f5820fc03b1d0dd593c3b", + "original_path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_comparison_contract-b830fe95a847344e" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-recording_contract-01e8969397d0bfcc", + "bytes": 5608272, + "sha256": "3b788b6cae06eb17c655c1667d64da50820c6acf50030bfc751f59efdc844fa7", + "original_path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_contract-01e8969397d0bfcc" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-recording_provider_contract-4fd9d23bc6148b03", + "bytes": 11392472, + "sha256": "f5f8cb4cfc787da2911b2b5a2b3d11b2695bbcab67bbf033fe9a248c21ca70c5", + "original_path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_provider_contract-4fd9d23bc6148b03" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-recording_provider_runtime_contract-479509e11f8147d8", + "bytes": 6787840, + "sha256": "de3542d100fe59d75ff8e1e994f4f761ea2df6a57f023a15882415329cbf717a", + "original_path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_provider_runtime_contract-479509e11f8147d8" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-solver_provider_contract-4f9ffb3b3a91bb87", + "bytes": 2087976, + "sha256": "9ff043b78305a18df5d008d6ebb192e00dad8a0086f51e986fff2c831d725ab8", + "original_path": "/workspace/rheon-c1b3-evidence/final-contracts-solver_provider_contract-4f9ffb3b3a91bb87" + } + ] + }, + { + "name": "final-doctests", + "command": "cargo test --locked --no-default-features --doc", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s" + ], + "executables": [] + }, + { + "name": "final-clippy-core", + "command": "cargo clippy --locked --no-default-features --all-targets -- -D warnings", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [], + "executables": [] + }, + { + "name": "final-ui", + "command": "cargo test --locked --features desktop --bin rheon-desktop workflow_inspector::tests::", + "source_commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "source_tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c", + "exit_code": 101, + "target_dir": "/tmp/rheon-target", + "test_results": [], + "executables": [] + } + ], + "result": "allcore/default/public/library/contracts/docs/strictcorePASS; desktop compileE0624 beforeUIexecution", + "artifacts": "evaluation-4af; original commands retained, relocated executable paths in retained-commands.json", + "repair": "9ddf8d2fd860c73bbcc35a077e08099d894db07a" + } + ], + "checkpoint_lineage": [ + { + "commit": "4cefec089b797d4ef58994c37128fce712c296c5", + "tree": "8b6ac71a01e35d8c24ae4b13bbbb942ca1f23b5b" + }, + { + "commit": "02cb2ee68a5a62f12d11a3bb112f2a828affd300", + "tree": "2cb8f7fb5ea28881e22d95c0db4eba847c87c3fa" + }, + { + "commit": "2bc59e7c213eeb878653b6eaae3b4befc201250b", + "tree": "4b8ba05d388c62c4942a1999aa2dab5a4b6459aa" + }, + { + "commit": "616492f43cfb93bbb3281427d21473513468b51a", + "tree": "bfac7729ebbcba8fe4c639fed9d85d73be8c3958" + }, + { + "commit": "3c87312febb1ec8ec4b9199e8f19c94aeb86da53", + "tree": "da1eaaa0b1e91560ca5391d5a2c7bc1ccbb673d6" + }, + { + "commit": "cc8be55c1ad67faa1dd75919ce6fbfded9ca69b9", + "tree": "69d7e4b9de6fea7a86d59ce93410a795e77540f5" + }, + { + "commit": "f22513e647092ca85eedc2b3eb1a7c7c0fdadf72", + "tree": "3b820d9cb13a344adf397cb34dcbe7af7990ab21" + }, + { + "commit": "76841b07718ededa7c9b2b8fe1b0ab9f45be8be4", + "tree": "ee410784343955dafeb59e6846e2fb12b1d656ba" + }, + { + "commit": "d7928c8616ce49a2d90685a26636c844913c52b2", + "tree": "ee410784343955dafeb59e6846e2fb12b1d656ba" + }, + { + "commit": "50c4ad7bffd19b20186dd59cb3be3313b3209cf3", + "tree": "38ee17dd7d0ce98f997ef1c4fe0fa4a730fe14e0" + }, + { + "commit": "f2ebaa7c7706e7f0e6bb2e2d5df117a71f42a681", + "tree": "38ee17dd7d0ce98f997ef1c4fe0fa4a730fe14e0" + }, + { + "commit": "dd387ff1abed1890154a9dc9d5301db268b49f1b", + "tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c" + }, + { + "commit": "4af3802babe332d8dfeb926c19159b4b656be775", + "tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c" + }, + { + "commit": "ae9dbe567eafbbf33f3889e5faf1418d8b4b3a25", + "tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163" + }, + { + "commit": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163" + } + ], + "equivalent_checkpoint_trees": [ + { + "local": "76841b07718ededa7c9b2b8fe1b0ab9f45be8be4", + "published": "d7928c8616ce49a2d90685a26636c844913c52b2", + "tree": "ee410784343955dafeb59e6846e2fb12b1d656ba" + }, + { + "local": "50c4ad7bffd19b20186dd59cb3be3313b3209cf3", + "published": "f2ebaa7c7706e7f0e6bb2e2d5df117a71f42a681", + "tree": "38ee17dd7d0ce98f997ef1c4fe0fa4a730fe14e0" + }, + { + "local": "dd387ff1abed1890154a9dc9d5301db268b49f1b", + "published": "4af3802babe332d8dfeb926c19159b4b656be775", + "tree": "7f0ca675efeaec55d9fd03f7311c69f45a29b64c" + }, + { + "local": "ae9dbe567eafbbf33f3889e5faf1418d8b4b3a25", + "published": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "tree": "22f6ed965f0aa0250cbf1b567033e0aaee1d0163" + } + ], + "protected_artifacts": [ + { + "path": "/workspace/rheon-c1b2-evidence.zip", + "bytes": 112256348, + "sha256": "d8b83fb55d38eb8c0eafa6f35c460d9b29b2b513b487bc3ca259faec4379c4c5", + "unchanged": true + }, + { + "path": "/workspace/rheon-g1-cancel-evidence.zip", + "bytes": 42886489, + "sha256": "c3f8052c6e98774e36c2faff6660b936ace7f2f1c80b42ec459a5fcb90f6390b", + "unchanged": true + } + ], + "independent_reviews": [ + "architecture_review:PASS; split-source equivalence approved", + "persistence_independent:PASS source/contracts and all-context decoder repair", + "native_ui_independent:PASS exactconsumer13tests/strictdesktop/fmt" + ], + "artifacts": [ + { + "path": "/workspace/rheon-c1b3-evidence/admission-refusal.log", + "archive_member": "admission-refusal.log", + "bytes": 406, + "sha256": "c1df4c8bb0c2eb605b803033e3b33a92ced50219d906cd00211b4fc4b408ee86" + }, + { + "path": "/workspace/rheon-c1b3-evidence/checkpoint-lineage.json", + "archive_member": "checkpoint-lineage.json", + "bytes": 2772, + "sha256": "8df2c7b9cfe4b270b133c645c0c0dcfdea1fd2e4beca725346b732525ed89720" + }, + { + "path": "/workspace/rheon-c1b3-evidence/commands.json", + "archive_member": "commands.json", + "bytes": 6326, + "sha256": "dbdddec861d5ffe1a82247b182e2c1822404152202f98cce6b6af881734ddb41" + }, + { + "path": "/workspace/rheon-c1b3-evidence/consumer-admission-refusal.log", + "archive_member": "consumer-admission-refusal.log", + "bytes": 406, + "sha256": "c1df4c8bb0c2eb605b803033e3b33a92ced50219d906cd00211b4fc4b408ee86" + }, + { + "path": "/workspace/rheon-c1b3-evidence/consumer-clippy-desktop.log", + "archive_member": "consumer-clippy-desktop.log", + "bytes": 106, + "sha256": "3f969a743a44cdff2fd222acb58653699ac94dddc9eaff390dc13f847cb15922" + }, + { + "path": "/workspace/rheon-c1b3-evidence/consumer-commands.json", + "archive_member": "consumer-commands.json", + "bytes": 1408, + "sha256": "a442e8fcef7cf61c7dcbe5a384396dcf1beb30b24092356772bc38be27b10aa3" + }, + { + "path": "/workspace/rheon-c1b3-evidence/consumer-fmt.log", + "archive_member": "consumer-fmt.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "/workspace/rheon-c1b3-evidence/consumer-ui-rheon_desktop-1f5fbd0763f87c5a", + "archive_member": "consumer-ui-rheon_desktop-1f5fbd0763f87c5a", + "bytes": 82896000, + "sha256": "ae4e169aa5e1149c28e2500036e85c27277929149e65c1e39a0247af2a2c7427" + }, + { + "path": "/workspace/rheon-c1b3-evidence/consumer-ui.log", + "archive_member": "consumer-ui.log", + "bytes": 2175, + "sha256": "7cf7f32662883e923811ace435318db0f498a95be7c986e5887681abd10c9a0f" + }, + { + "path": "/workspace/rheon-c1b3-evidence/core-deciding-commands.json", + "archive_member": "core-deciding-commands.json", + "bytes": 5953, + "sha256": "637ed6a7fd3a0b788edce00adcc69cb2ee0b8f358c8ffbd407354dd0348e82ff" + }, + { + "path": "/workspace/rheon-c1b3-evidence/environment.log", + "archive_member": "environment.log", + "bytes": 36, + "sha256": "ecda74ca828b18debf1624cb36209a5b844fb1e1c1905ffb3d51b56cc275f96f" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/commands.json", + "archive_member": "evaluation-4af/commands.json", + "bytes": 6326, + "sha256": "dbdddec861d5ffe1a82247b182e2c1822404152202f98cce6b6af881734ddb41" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-clippy-core.log", + "archive_member": "evaluation-4af/final-clippy-core.log", + "bytes": 106, + "sha256": "0daafdfbdf02ee4be660307aae7687b5311855feac19f56c1c16fe6b08962b3b" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-configured_provider_session_contract-7a47e2a64e933952", + "archive_member": "evaluation-4af/final-contracts-configured_provider_session_contract-7a47e2a64e933952", + "bytes": 13192448, + "sha256": "4b4421015aa35b266306cb792743d31ba84a4d7975ea69e414f8aaaf86fb7218" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-pressure_session_contract-536f0b07b486b9ae", + "archive_member": "evaluation-4af/final-contracts-pressure_session_contract-536f0b07b486b9ae", + "bytes": 2261280, + "sha256": "eaec358eda46426ffb0c3b41fe473635e1ae15317190862245543c239ef192f4" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-provider_step_contract-024046052e7e09fc", + "archive_member": "evaluation-4af/final-contracts-provider_step_contract-024046052e7e09fc", + "bytes": 9682512, + "sha256": "d986ea2a0d22478bf7590ca35460a0d303c058662d3c31777d00a97268c17342" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-recording_comparison_contract-b830fe95a847344e", + "archive_member": "evaluation-4af/final-contracts-recording_comparison_contract-b830fe95a847344e", + "bytes": 8316960, + "sha256": "33977e2d23d76e8046e92586e44677fe941095c2402f5820fc03b1d0dd593c3b" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-recording_contract-01e8969397d0bfcc", + "archive_member": "evaluation-4af/final-contracts-recording_contract-01e8969397d0bfcc", + "bytes": 5608272, + "sha256": "3b788b6cae06eb17c655c1667d64da50820c6acf50030bfc751f59efdc844fa7" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-recording_provider_contract-4fd9d23bc6148b03", + "archive_member": "evaluation-4af/final-contracts-recording_provider_contract-4fd9d23bc6148b03", + "bytes": 11392472, + "sha256": "f5f8cb4cfc787da2911b2b5a2b3d11b2695bbcab67bbf033fe9a248c21ca70c5" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-recording_provider_runtime_contract-479509e11f8147d8", + "archive_member": "evaluation-4af/final-contracts-recording_provider_runtime_contract-479509e11f8147d8", + "bytes": 6787840, + "sha256": "de3542d100fe59d75ff8e1e994f4f761ea2df6a57f023a15882415329cbf717a" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts-solver_provider_contract-4f9ffb3b3a91bb87", + "archive_member": "evaluation-4af/final-contracts-solver_provider_contract-4f9ffb3b3a91bb87", + "bytes": 2087976, + "sha256": "9ff043b78305a18df5d008d6ebb192e00dad8a0086f51e986fff2c831d725ab8" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-contracts.log", + "archive_member": "evaluation-4af/final-contracts.log", + "bytes": 11803, + "sha256": "0c1e5d75bcd45ebc75472e55186a6a5ad253832842d318e5c9ded81007e22f69" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-core-lib-rheon-2c0b8f9f964eff45", + "archive_member": "evaluation-4af/final-core-lib-rheon-2c0b8f9f964eff45", + "bytes": 62110480, + "sha256": "04d265471e213b781509e532a969f309a8d272963e540fc3e355dba5de418225" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-core-lib.log", + "archive_member": "evaluation-4af/final-core-lib.log", + "bytes": 11069, + "sha256": "471ef43811eff34fbca93588c736e364d30d9bf16028b524b3d738080fc062f3" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-doctests.log", + "archive_member": "evaluation-4af/final-doctests.log", + "bytes": 538, + "sha256": "f3b2ce8deb4f8d9c27ba3671ca01d97a8ef7335d4161c2da5eeb06d800514ceb" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-new-default-projection_session_contract-a851ff4fba446d75", + "archive_member": "evaluation-4af/final-new-default-projection_session_contract-a851ff4fba446d75", + "bytes": 7291176, + "sha256": "b3ca03de15300b5ba7d8fed1aa00b0fe8b9b3f23161c873d43bd001037bc2407" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-new-default-rheon-d293312d0455f2e1", + "archive_member": "evaluation-4af/final-new-default-rheon-d293312d0455f2e1", + "bytes": 62157408, + "sha256": "950f75f29cd8c5102f866d5c672cf00e8c025644928405d3335931c6fda3081a" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-new-default.log", + "archive_member": "evaluation-4af/final-new-default.log", + "bytes": 2365, + "sha256": "2e0b728f7502572a1af5a20a8937ce3619ecdf23210bbfa4e640228b2f540eb4" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/final-ui.log", + "archive_member": "evaluation-4af/final-ui.log", + "bytes": 693, + "sha256": "8b2ebf3dfb55f3b442271527ac22813f10a752c484434781c7394ce2cdb3ca05" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/retained-commands.json", + "archive_member": "evaluation-4af/retained-commands.json", + "bytes": 7770, + "sha256": "df5f15f8f51117684eb9923306b9a0078353b50d6d1433d8221a5f564ecefda5" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-4af/source-map.json", + "archive_member": "evaluation-4af/source-map.json", + "bytes": 16547, + "sha256": "c43f427783ac30fabb7a85c4e0fd40d3670f073da074efc9674c81c7791a5e40" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/admission-refusal.log", + "archive_member": "evaluation-d792/admission-refusal.log", + "bytes": 406, + "sha256": "c1df4c8bb0c2eb605b803033e3b33a92ced50219d906cd00211b4fc4b408ee86" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/commands.json", + "archive_member": "evaluation-d792/commands.json", + "bytes": 1752, + "sha256": "4bca019bc569f49975791ec37a8ffbac79954741b89719104d60271b0d6d0cf7" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/final-core-lib-rheon-2c0b8f9f964eff45", + "archive_member": "evaluation-d792/final-core-lib-rheon-2c0b8f9f964eff45", + "bytes": 62094432, + "sha256": "d680a321e0f38bb94cff497bde18891122742507d4850b95e1aaa9aa69aacb2d" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/final-core-lib.log", + "archive_member": "evaluation-d792/final-core-lib.log", + "bytes": 11495, + "sha256": "88f20f374ab14ea4ab956cac8af7ebcdc16217eb8f57ab54a8bfd3b5f8fbad10" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/final-new-default-projection_session_contract-a851ff4fba446d75", + "archive_member": "evaluation-d792/final-new-default-projection_session_contract-a851ff4fba446d75", + "bytes": 7291176, + "sha256": "089e1e687b13ee27267d92b170bff23af6b44b6f2af74ab9eed0279c5210137b" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/final-new-default-rheon-d293312d0455f2e1", + "archive_member": "evaluation-d792/final-new-default-rheon-d293312d0455f2e1", + "bytes": 62141360, + "sha256": "e362c34784069da27a04ad38c21bcb7ee46b27544b539908d3388f5ad88b5c4e" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/final-new-default.log", + "archive_member": "evaluation-d792/final-new-default.log", + "bytes": 2124, + "sha256": "9dc395d3cffdb14682416262417045b6a72d74dcd853cabf8c2887f287b67283" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/retained-commands.json", + "archive_member": "evaluation-d792/retained-commands.json", + "bytes": 2119, + "sha256": "49760da75df45133cbc48a2b84f2258a1aa367fb3b37b78a000a425c22998f46" + }, + { + "path": "/workspace/rheon-c1b3-evidence/evaluation-d792/source-map.json", + "archive_member": "evaluation-d792/source-map.json", + "bytes": 16547, + "sha256": "ec9e2282d2c84bfa2ebd6d6a6e84af759cd8a161fe1beb6a41b5becf5f73dbfc" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-clippy-core.log", + "archive_member": "final-clippy-core.log", + "bytes": 106, + "sha256": "0daafdfbdf02ee4be660307aae7687b5311855feac19f56c1c16fe6b08962b3b" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-configured_provider_session_contract-7a47e2a64e933952", + "archive_member": "final-contracts-configured_provider_session_contract-7a47e2a64e933952", + "bytes": 13192448, + "sha256": "4b4421015aa35b266306cb792743d31ba84a4d7975ea69e414f8aaaf86fb7218" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-pressure_session_contract-536f0b07b486b9ae", + "archive_member": "final-contracts-pressure_session_contract-536f0b07b486b9ae", + "bytes": 2261280, + "sha256": "eaec358eda46426ffb0c3b41fe473635e1ae15317190862245543c239ef192f4" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-provider_step_contract-024046052e7e09fc", + "archive_member": "final-contracts-provider_step_contract-024046052e7e09fc", + "bytes": 9682512, + "sha256": "d986ea2a0d22478bf7590ca35460a0d303c058662d3c31777d00a97268c17342" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_comparison_contract-b830fe95a847344e", + "archive_member": "final-contracts-recording_comparison_contract-b830fe95a847344e", + "bytes": 8316960, + "sha256": "33977e2d23d76e8046e92586e44677fe941095c2402f5820fc03b1d0dd593c3b" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_contract-01e8969397d0bfcc", + "archive_member": "final-contracts-recording_contract-01e8969397d0bfcc", + "bytes": 5608272, + "sha256": "3b788b6cae06eb17c655c1667d64da50820c6acf50030bfc751f59efdc844fa7" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_provider_contract-4fd9d23bc6148b03", + "archive_member": "final-contracts-recording_provider_contract-4fd9d23bc6148b03", + "bytes": 11392472, + "sha256": "f5f8cb4cfc787da2911b2b5a2b3d11b2695bbcab67bbf033fe9a248c21ca70c5" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-recording_provider_runtime_contract-479509e11f8147d8", + "archive_member": "final-contracts-recording_provider_runtime_contract-479509e11f8147d8", + "bytes": 6787840, + "sha256": "de3542d100fe59d75ff8e1e994f4f761ea2df6a57f023a15882415329cbf717a" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts-solver_provider_contract-4f9ffb3b3a91bb87", + "archive_member": "final-contracts-solver_provider_contract-4f9ffb3b3a91bb87", + "bytes": 2087976, + "sha256": "9ff043b78305a18df5d008d6ebb192e00dad8a0086f51e986fff2c831d725ab8" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-contracts.log", + "archive_member": "final-contracts.log", + "bytes": 11803, + "sha256": "0c1e5d75bcd45ebc75472e55186a6a5ad253832842d318e5c9ded81007e22f69" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-core-lib-rheon-2c0b8f9f964eff45", + "archive_member": "final-core-lib-rheon-2c0b8f9f964eff45", + "bytes": 62110480, + "sha256": "04d265471e213b781509e532a969f309a8d272963e540fc3e355dba5de418225" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-core-lib.log", + "archive_member": "final-core-lib.log", + "bytes": 11069, + "sha256": "471ef43811eff34fbca93588c736e364d30d9bf16028b524b3d738080fc062f3" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-doctests.log", + "archive_member": "final-doctests.log", + "bytes": 538, + "sha256": "f3b2ce8deb4f8d9c27ba3671ca01d97a8ef7335d4161c2da5eeb06d800514ceb" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-new-default-projection_session_contract-a851ff4fba446d75", + "archive_member": "final-new-default-projection_session_contract-a851ff4fba446d75", + "bytes": 7291176, + "sha256": "b3ca03de15300b5ba7d8fed1aa00b0fe8b9b3f23161c873d43bd001037bc2407" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-new-default-rheon-d293312d0455f2e1", + "archive_member": "final-new-default-rheon-d293312d0455f2e1", + "bytes": 62157408, + "sha256": "950f75f29cd8c5102f866d5c672cf00e8c025644928405d3335931c6fda3081a" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-new-default.log", + "archive_member": "final-new-default.log", + "bytes": 2365, + "sha256": "2e0b728f7502572a1af5a20a8937ce3619ecdf23210bbfa4e640228b2f540eb4" + }, + { + "path": "/workspace/rheon-c1b3-evidence/final-ui.log", + "archive_member": "final-ui.log", + "bytes": 693, + "sha256": "8b2ebf3dfb55f3b442271527ac22813f10a752c484434781c7394ce2cdb3ca05" + }, + { + "path": "/workspace/rheon-c1b3-evidence/hosted-snapshot.json", + "archive_member": "hosted-snapshot.json", + "bytes": 4446, + "sha256": "912b205ba11320ddd0db8c282b3a7a2542bf2cb9f686b476e1bbcc88615934eb" + }, + { + "path": "/workspace/rheon-c1b3-evidence/initial-root-fmt.log", + "archive_member": "initial-root-fmt.log", + "bytes": 36840, + "sha256": "701a58427f4b231662e30eb3f90af3748b7614ccd4b87230bf5f01cc73b01f5b" + }, + { + "path": "/workspace/rheon-c1b3-evidence/initial-unit-repaired.log", + "archive_member": "initial-unit-repaired.log", + "bytes": 1515, + "sha256": "304b09f4b307b5c22ebed0086f3cd070755c283ac6bdf740f2f3d1565de4b0fd" + }, + { + "path": "/workspace/rheon-c1b3-evidence/initial-unit.log", + "archive_member": "initial-unit.log", + "bytes": 2747, + "sha256": "f251165e8c04fcad658020f29c9c69a5ec5827728d3834caee10ac3e1bf52425" + }, + { + "path": "/workspace/rheon-c1b3-evidence/intent-dispatch-repair.log", + "archive_member": "intent-dispatch-repair.log", + "bytes": 1839, + "sha256": "e2fd6a43286cd7da1044f3d64592001245007d5e574ffdfd305d7114ac162e41" + }, + { + "path": "/workspace/rheon-c1b3-evidence/outer-version-dispatch-repair.log", + "archive_member": "outer-version-dispatch-repair.log", + "bytes": 1968, + "sha256": "0e7411612dc0f07b71b7c4268d0a2f9a8a5aea3878a2e25337a04af24070f321" + }, + { + "path": "/workspace/rheon-c1b3-evidence/protected-artifacts.json", + "archive_member": "protected-artifacts.json", + "bytes": 381, + "sha256": "a6d2e7c1135969165acfdd1a8cfe8bd5641524f2574c39721f4615a2dabb21dc" + }, + { + "path": "/workspace/rheon-c1b3-evidence/run-checks.py", + "archive_member": "run-checks.py", + "bytes": 2559, + "sha256": "7dea5e325cb2907848025249d316c24bdff3058b872bd1607dda3c4059b80af1" + }, + { + "path": "/workspace/rheon-c1b3-evidence/run-consumer-checks.py", + "archive_member": "run-consumer-checks.py", + "bytes": 1727, + "sha256": "9eed14d016565d55f7d57b4ecaad72aaa428aa66ed01c8eb4b2e1a84514c7a1a" + }, + { + "path": "/workspace/rheon-c1b3-evidence/source-map.json", + "archive_member": "source-map.json", + "bytes": 16563, + "sha256": "36a4648d88a8d226b57af85b85cfcda7ff950a419a9667bd092d9d64355ecb7f" + }, + { + "path": "/workspace/rheon-c1b3-evidence/source-split.json", + "archive_member": "source-split.json", + "bytes": 1036, + "sha256": "4454094968c7984b3cd51d0e5644dd0119c4a246bc90e2f12d8c77cb4a357494" + } + ], + "archive": { + "path": "/workspace/rheon-c1b3-evidence.zip", + "bytes": 98823203, + "sha256": "fd5e208b61397f4ad01f64a8bc3532daf07b8549fdd7e32876fc05d446b78759", + "members": 68 + }, + "archive_contains_only_external_raw_evidence_not_this_manifest": true, + "remaining": [ + "lead-owned complete-source review/pinning/native-rational qualification", + "required hosted checks and serial integration/merge disposition" + ], + "not_claimed": [ + "full C1-B/C/C1-R", + "stateful/external/learned provider", + "whole-family substitution or implicit transfer", + "new numerical/physical trajectory accuracy", + "GPU", + "new projection graph GUI/native-window run", + "performance" + ], + "independent_artifact_audit": { + "reviewer": "/root/persistence_independent", + "status": "PASS; no blockers", + "audited_pre_audit_manifest_sha256": "5039f58b41d4a342b4dfc39daee6fc4a1985ac60356f55b0e22dc79fe494b144", + "artifact_hashes_checked": 68, + "deciding_executable_records_checked": 12, + "historical_executable_records_checked": 14, + "deciding_command_logs_checked": 8, + "final_source_pins_checked": 140, + "historical_source_maps_checked": [ + "d7928c8", + "4af3802" + ], + "checkpoint_trees_checked": 15, + "equivalent_checkpoint_pairs_checked": 4, + "archive_members_checked": 68, + "protected_archives_unchanged": true, + "admission_inputs_modified": false, + "mismatches": 0 + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-protocol.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-protocol.md new file mode 100644 index 00000000..b46aa2b5 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-protocol.md @@ -0,0 +1,58 @@ +# C1-B3 classical projection selection — prospective admission + +Frozen before production edits/evaluation, 2026-10-20. Canonical plan `docs/plans/fluid-accuracy-composition/plan.md`, operation `continue` under the parent's explicit prospective C1-B3 implementation authorization. Admitted base PR137 `d3e62377acde6641c8133cf9a9356cc046cfd02a`; source qualification `70da36d` remains immutable. Fetched main `718469beedb9a949f4bb6f3299c7b880b4c47e47`. Branch `implement/c1b3-classical-projection-selection-20261020`, focused draft target `fix/g1-advection-cancel-20261020`. Implementation owner delegated root; lead owns canonical plan/ledger, complete source admission and serial integration/merges/cleanup. + +Lifecycle: **Active** -> Implemented -> Verifying -> locally qualified only when the fixed scoped gates below pass. This is the one next delegated slice, not a canonical plan rewrite. Routing: existing adopted Core/Implementation/Planning/Concurrent Plan Integration/Verification/Contracts+Evolution/Architecture/Resilience/Persistence/Rust API/Commit/Documentation owners; no new IPC, renderer, numerical formulation, Cargo dependency or release contract. + +## Prerequisites and authority + +C1-A/B1/B2 and G1 repairs are locally qualified within their exact sources. Existing B1/B2 protocols explicitly permit stacked development before dependency merges; the parent now authorizes this prospective slice. Lead has PR137's fixed 140-path/three-pin handoff. No unmet hosted/merge prerequisite blocks development. Fresh complete-source admission/native-rational qualification and required hosted integration still block integration/merge acceptance. This branch will invalidate the prior source map; do not modify admission inputs or reuse old numerical receipts as new-source qualification. Preserve all protected audit119/plan120/pressurewarmstart59 references, prior branches, failed evidence and Q2 files. + +## Usable contract and applicability + +Add finite `ProjectionIntent::ClassicalSelectionV1 { producer: PressureImplementation, producer_max_iterations: usize }`. Session configuration's existing `implementation` is the native fallback. The two existing methods are the only producer choices; require producer != fallback and 1 <= producer_max_iterations <= the constructor's host pressure cap. Both supported directions have independent deciding evidence. `BuiltinNativeV1`, old constructors/workspaces/entrypoints and version-1 receipts retain exact behavior. + +Use the existing sealed, stationary, constant-density MAC projection seam after actual advection/forces, with no optional viscosity, arbitrary callback, external process, learned model, stateful candidate, particle conversion or whole-family substitution. Same binary32 staggered fields/binary64 pressure and SI/native operator/gauge contract. A new `ProjectionStepWorkspace::new_with_intent(grid, density, limit, fallback, intent)` owns separately capped producer scratch selected by intent and existing B1 qualifier/fallback scratch. Existing `new` remains BuiltinNativeV1. Validate exact grid/density/fallback/intent workspace match before mutation/invocation. + +Producer settings differ from host settings ONLY by the frozen smaller-or-equal iteration cap. Execute the selected existing native kernel on the actual unchanged provisional fields/RHS and shortened interval, then B1 qualifies all tentative pressure/velocity. If selected, adopt every qualified field and its actual producer pressure through the existing complete Liquid/Session publication; no second pressure correction/history/publisher. + +Only an actual producer `PressureError::IterationLimit` is recoverable in this slice. Retain typed error diagnostics, actual producer identity/cap/residual threshold/elapsed and retry B1 native baseline on exactly the original immutable request with the constructor fallback method and full host cap. Cancellation/deadline and all other producer errors terminate unpublished; no blind retry. A field/momentum qualification rejection may use B1's same-input native fallback. Existing mixed pressure-witness fallback remains explicitly failed/unpublished with all observed facts rather than stripping attempted-witness metadata. Fallback failure/cancellation or late carrier/volume/commit failure leaves accepted fields/history/quota/receipt unchanged. Private test-only faults remain unreachable from public callers. + +Stateless transaction meaning: workspaces retain disposable scratch only, no candidate-owned history/RNG/runtime state. Candidate/qualification/fallback work and fallible receipt sealing precede the original atomic owner commit. Successful adoption is local and infallible, with no callback afterward. Accepted receipt Arc remains distinct from later failed attempts. Repeated same-input calls after failure must match a fresh workspace; no prepare/abort/external-commit promise is introduced. + +## Typed evidence and additive custody + +Version-2 attempts carry the new intent. Add separate optional `producer_failure` facts with closed `ProjectionProducerFailure::IterationLimit { iterations, residual_max }`, method, residual_l2_limit and elapsed; success and failure are mutually exclusive. Version 1 forbids the new failure field and new intent. Successful producer iteration count is <= producer cap. Completed qualification/selected-method facts retain actual identities, and publication requires selected producer OR fallback consistent with observed selection. After producer iteration failure, B1 `NativeBaseline` plus observed fallback facts means attempted producer failed, not an unattempted candidate. Cancellation during that fallback retains producer failure but no fabricated completed qualification. Unknown/inconsistent facts refuse at ingress. + +New outer profile `rheon-native-projection-selection-v1` with RPS2/RPP2/RPT2 and attempt version 2; preserve existing native-projection profile/RPS1/RPP1/RPT1 and all configured/G1 formats. Reuse SQLite v1 owner, accepted/unrecorded-tail semantics and typed cold reader; no migration, second store, runtime reconstruction or graph inference. Complete encoded metadata strings remain <=16KiB existing MAX_TEXT, including inner payload/hex. + +Inner RCP2 is unchanged native-only accepted evidence. A private selected-method header/config adapter at BOTH capture and decode may vary only `implementation`, after outer validation proves the actual selected producer/fallback role. Preserve every other constructor/grid/material/settings/cap/source field and recompute exact inner source binding. Never mutate Session configuration, relax the old configured validator or reinterpret pressure v1. Public projection decoded native configuration retains the authoritative outer constructor; the selected native receipt and new outer facts declare the actual method separately. Outer source/intent/actual interval/input/output and native-method linkage are mandatory. Legacy readers explicitly refuse new profile/version; no unknown-to-legacy fallback. + +Native desktop graph remains explicitly unavailable for both projection profile namespaces. Extend its existing refusal/cache invalidation guard and focused tests only; no new graph feature/native-window acceptance. Existing exact comparison allow-list stays closed. + +## Exact write set and ownership + +- Core implementation `/root/native_ui`: `src/projection_step.rs`, `src/session/projection.rs`, `src/session/projection_tests.rs`. Existing B2 plumbing in simulation/liquid/Session owners is reused unchanged; any required new owner must be prospectively recorded. +- Persistence implementation `/root/persistence_review`: `src/recording/projection.rs`, `src/recording/projection_tests.rs`; `src/recording/provider.rs` only private selected-method capture/header adapter while preserving old wrapper behavior and validators. +- Root integration/evidence: `tests/projection_session_contract.rs`, `src/bin/desktop/inspector.rs`, `src/bin/desktop/workflow_inspector_tests.rs`, `tests/recording_comparison_contract.rs`; c1b3-prefixed reports/protocol/review/manifest here. Shared module declarations and canonical status remain root/lead-owned respectively; no new top-level module expected. +- Independent `/root/architecture_review`, `/root/persistence_independent`, `/root/native_ui_independent` author no implementation. Root alone runs Cargo. Authors own disjoint files; coordinate exact shared types before codec evaluation. + +No `liquid_volume`, Q2 examples, particle formulas, admission/qualifier tooling, browser, Cargo or canonical plan edits. Unexpected source owner, mixed metadata normalization, widened domain/stateful runtime, changed criterion or stale shared authority triggers replan before expansion. + +## Fixed deciding gates + +Rust1.92.0, locked dependencies, native CPU, existing binary32/binary64 kernels. Reuse B2's fixed integrated16^3/1m^3, rho998.2, fraction.5, acceleration[.001,0,0], dt.001, residual relative1e-10/absolute1e-12/predicted1e-8/actual1e-5/max2000, Courant1,16MiB individual declared caps, quota>=100. For EACH ordered distinct producer/fallback choice, run100 actually accepted integrated intervals with producer cap2000 and compare every accepted field/pressure/fraction/stamp/time and numerical diagnostics bitwise against the original direct Session using the SAME producer algorithm/settings/order. Assert actual selection/intent/receipt linkage every interval. This is contract equivalence, not trajectory accuracy qualification across different algorithms. + +Use producer cap1 and the same fixed forcing/material controls on4^3/.25 native grid to exercise a real bounded producer failure and successful full-cap distinct fallback; compare its published fields bitwise with the direct fallback path. Freeze this failure fixture before evaluation; retain failure if not attained rather than relabeling a successful producer. Private fixed4^3 faults exercise B1 field/momentum rejection fallback and mixed pressure-witness no-publication; reuse existing nonfinite/gauge/shape/unit/version/operator/plausible-wrong-dynamics B1 gates without relaxing thresholds. + +Reuse B2's exact5^3/.25/rho2/fraction1 acceleration[.125,.0625,.0625], Courant1/128, requested dt2, residual1e-14/1e-16/predicted1e-7/actual1e-5/max3000,4MiB actual-shortening fixture for both producer directions. Test invalid intent/cap/same-method/workspace/grid/density/budget and legacy path refusal before invocation; both constructors; attempt exhaustion/quota/stop. Cancel at every reached producer/qualification/fallback/Liquid/final-commit poll, deadline before/after callback; assert exact nonpublication, unchanged accepted state/history/receipt, retry/quota and monotonic attempt ids. Producer or fallback genuine numerical failure and late volume failure remain distinct from cancellation. Repeat after prior acceptance and compare fresh/reused scratch paths. + +Real SQLite constructor/accepted/producer-failure-fallback/cancelled/failed/accepted-unrecorded-tail capture, close/drop and cold reopen; source/intent/method/budget/version/size/interval/input/output/attempt-link corruptions refuse. Preserve old codec roundtrips and profile/cache/comparison refusal. Rerun affected B1/B2/workflow/native-family/configured-provider/recording/runtime/borrow contracts, strict no-default+desktop all-target Clippy and formatting. No physical/GPU/learned/native-window/performance gate is claimed. Independent architecture/contracts/persistence/native-consumer review and exact-source artifact audit precede local qualification. Publish focused dependent draft PR; lead owns new complete-source admission and hosted/merge disposition. + +## Composed-design fidelity + +Applicable; existing admission is specialized, not replaced. Numerical owners own pressure/correction; B1 owns witness qualification/fallback; projection_step contains finite selection/budget/disposable scratch and observed facts; Session remains sole accepted state/history/publisher; recording owns outer profile/inner adapter/cold custody; inspector owns explicit unsupported state. Callers supply immutable intent and a matching capped workspace and need no kernel ordering or serialized-layout knowledge. Selection/version changes touch projection intent/receipt plus its codec; numerical method changes remain in original owners. Dependencies carry actual immutable requests/native fields, with private selected-method header knowledge contained in persistence. Producer and qualifier can fail independently before publication; no runtime state crosses commit. Removing new selection would remove only finite choice/budget/failure evidence; original B2 remains usable. Removing the private codec adapter would spread selected-vs-fallback header knowledge across producers/consumers. Retained complexity is the necessary second method identity and additive custody, contained in existing owners; no registry/scheduler/transaction framework is introduced. + +Independent architecture admission at4cefec0: PASS. Clarifications before implementation: observed producer IterationLimit facts require iterations == positive producer cap <= host cap and finite nonnegative measured residual_max/residual_l2_limit; no fabricated successful PressureReport. Workspace matching includes exact intent/method/cap/fallback. The new decoded wrapper explicitly permits native.configuration to remain the outer fallback constructor while native.receipt.selected names the validated actual producer; that invariant belongs only to this new profile, never old configured consumers. + +Before the first B3 evaluation, freeze genuine fallback-failure fixture: same4^3/.25/rho998.2/fraction.5/acceleration[.001,0,0]/dt.001/relative1e-10/absolute1e-12/predicted1e-8/actual1e-5/Courant1/16MiB/quota3; only full host cap=1 and distinct producer cap=1. For EACH ordered pair require actual producer IterationLimit1 followed by B1 native baseline Pressure::IterationLimit1, unpublished, with producer failure retained and no completed qualification/selected native. Establish prior accepted state with a zero-force interval; the forced failed interval preserves it. Retry with zero forcing, compare two accepted zero-force intervals bitwise against a fresh Session/workspace; attempt ids alone differ. Retain failure if either fixed method does not attain this expected actual error; no post-evaluation coefficient adjustment. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-qualification.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-qualification.md new file mode 100644 index 00000000..0823bc71 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-qualification.md @@ -0,0 +1,51 @@ +# C1-B3 classical projection selection qualification + +**Locally qualified** within the closed stateless scope in draft [PR140](https://github.com/MrScripty/Rheon/pull/140), dependent on PR137 `d3e62377acde6641c8133cf9a9356cc046cfd02a`. [Frozen protocol](c1b3-protocol.md), [independent review](c1b3-review.md), [manifest](c1b3-manifest.json). Fresh complete-source admission and required hosted integration remain pending with the repository lead. + +## Delivered behavior + +An immutable `ClassicalSelectionV1` intent selects a producer from the two existing native pressure methods, distinct from the constructor fallback, with a positive producer iteration cap no larger than the host cap. The actual provisional fields, shortened interval and native pressure/correction feed the existing B1 witness qualifier. Successful selection publishes every qualified field through the original complete Liquid/Session commit. + +Only actual producer IterationLimit is recoverable: retain typed failure facts and run the constructor's full-cap native fallback on the original immutable input. Cancellation/deadline and other producer errors terminate unpublished. Field/momentum witness rejection can use the existing native fallback; mixed pressure-witness fallback remains an explicit unpublished failure with its observed facts. Accepted state/history/quota/receipt remain separate from failed attempts. Reused disposable workspace results match fresh workspaces after cancellation and genuine failure; no hidden candidate history, RNG, runtime state or external transaction is admitted. + +RPS2/RPP2/RPT2 in `rheon-native-projection-selection-v1` retain distinct declared producer/fallback identities, actual selected method and success/failure facts. Private inner native headers vary only the selected method after outer role validation; the public decoded wrapper retains the actual outer fallback constructor. Old configured validators and RPS1/RPP1/RPT1 meanings remain strict. Desktop graph and exact comparison explicitly refuse the new profile; existing G1 caches/evidence/gesture state clear before adoption. No new numerical formula, order, domain, public callback provider, graph feature, particle/transfer, stateful, learned, external or whole-family capability is introduced. + +## Exact source and deciding evidence + +Core/default/public-contract/no-default/compatibility/doctest/strict-core results bind `4af3802babe332d8dfeb926c19159b4b656be775`, tree `7f0ca675efeaec55d9fd03f7311c69f45a29b64c`. Native consumer/strict-desktop/format results bind `9ddf8d2fd860c73bbcc35a077e08099d894db07a`, tree `22f6ed965f0aa0250cbf1b567033e0aaee1d0163`. + +The only difference is one new UI test calling public `RecordingReader::select` instead of private `select_record`. Every production, library, core-test, public-contract, Cargo and toolchain blob is identical. Independent architecture review approved these separate source-bound claims; no unaffected numerical gate was rerun for the test-only correction. Later report commits do not change compiled source. Rust1.92.0, locked dependencies, native CPU and disabled binary debug info; exact commands/environment/executable hashes are retained. + +| Deciding check | Result | +| --- | --- | +| Default new library tests | 12 passed | +| New public integrated contracts | 3 passed | +| Complete no-default library | 97 passed | +| Eight affected configured Session/provider/recording/runtime/comparison contract targets | 99 passed, 3 existing opt-in ignored | +| Borrow doctests | 3 passed | +| Native inspector suite | 13 passed, 2 existing opt-in ignored | +| Strict no-default and desktop all-target Clippy | Both passed | +| Formatting | Passed | + +Total: **227 passing deciding test executions, zero failures, five existing ignored**. Counts deliberately overlap default/no-default execution and are not distinct-test counts. There are 15 new test functions, plus expanded existing native/comparison consumer cases. + +The frozen integrated16^3 fixture passes **100 actually SuppliedCandidate-selected intervals per ordered distinct method pair, 200 total**, bitwise against the original direct Session using the SAME producer method/settings/order. Every interval checks selection, absence of fallback/producer failure, actual intent/method/budget and input/output/accepted receipt linkage. Both actual-shortening cases pass. Four real cap1 producer-failure intervals (two per pair) publish full-cap fallback fields bitwise equal to the direct fallback path. These are native contract equivalence results, not cross-method trajectory accuracy or physical validation. + +Other passing deciding evidence includes all reached cancellation phases on producer and fallback paths, no cancellation retry, inner-iteration cancellation, pre/post-callback deadline, late-volume and final-commit failure, quota/stop/exhaustion, exact intent/workspace/grid/density/cap refusal, complete accepted-state/Arc preservation, fixed private field/momentum and mixed-pressure faults, genuine hostcap1/producercap1 failure after prior acceptance, fresh/reused scratch equality, real SQLite close/drop/cold reopen, accepted-unrecorded tails and source/method/role/budget/version/interval/input/output/history corruptions. B1 representation/operator/gauge/plausible-wrong-dynamics and prior B2/G1/old recording contracts remain passing. + +## Retained failed evaluations and repairs + +- Initial `f22513e` compile found four new tests using unavailable `RecordedStep::clone`; `76841b0` recaptures immutable fixtures without widening the API. Focused ten-unit run passed afterward. +- First exact source `d7928c8` passed ten new units and all three public contracts, including its 200-interval comparison. The complete library then returned 94 pass/1 fail: an old unknown-intent corruption expected immediate Unsupported, but the new decoder attempted foreign payload parsing. Both executable/log sets and source map remain in `evaluation-d792`. +- `50c4ad7`/published `f2ebaa7` bound intent parsing to expected outer version. Independent review found the same issue in embedded attempt versions; `dd387ff`/published `4af3802` bound BOTH public publication and terminal paths before payload parsing. New regressions cover both directions and malformed/truncated payloads through real cold terminals. Existing assertions/thresholds were unchanged; targeted suites passed 13 then 14 tests. Final full library passes 97/97. +- At `4af3802`, the desktop compile caught the private reader call in the new assertion, before any UI test ran. The entire sequential evaluation is retained in `evaluation-4af`. `ae9dbe5`/published `9ddf8d2` changes that single test call to the public API; all 13 inspector tests and strict desktop/format checks then passed. No failed run is treated as final qualification. + +## Review, source admission and handoff + +Independent architecture, persistence/contracts and native-consumer reviews pass; the manifest records final artifact-audit disposition. Authoring and independent reviewers are distinct. Root owned the sole Cargo execution stream. No source finding remains undisposed. + +The unchanged admission checker exits1 with `reviewed native source inventory added or missing path`: existing admitted inventory is135, while the complete new selected closure is140. The final committed/worktree/selector maps agree on140 paths, **eight changed relative to PR137, 132 unchanged, zero added/removed**. The manifest includes every final consumer pin and the exact delta. No admission input, Q2 numerical source, Cargo input or canonical plan/status was modified. Main was safely refetched and remained `718469beedb9a949f4bb6f3299c7b880b4c47e47`. Both prior C1-B2/G1-repair evidence ZIPs were rehashed unchanged. + +Lead must explicitly review/pin/qualify this final complete source and finish required hosted checks/serial integration before merge. At the retained source snapshot eight PR-triggered workflows were queued; CodeRabbit success is not full hosted acceptance. No merge, force update, rebase, source cleanup or admission refresh occurred. Further C1-B/C/C1-R, stateful/external/learned support, particle transfer, new-profile graph inspection, scientific/GPU/native-window/performance qualification remain outside this accepted local scope. Numerical repairs continue independently. + +Raw evidence is `/workspace/rheon-c1b3-evidence`; ZIP, member hashes, exact source/executable/command inventory, checkpoint equivalences and retained negative runs are in the manifest. diff --git a/docs/plans/fluid-accuracy-composition/reports/c1b3-review.md b/docs/plans/fluid-accuracy-composition/reports/c1b3-review.md new file mode 100644 index 00000000..0b3a1240 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/c1b3-review.md @@ -0,0 +1,15 @@ +# Independent C1-B3 review + +Frozen prospective admission:02cb2ee, actual fallback-failure addendum3c87312. Core deciding source `4af3802babe332d8dfeb926c19159b4b656be775`; consumer `9ddf8d2fd860c73bbcc35a077e08099d894db07a`. No reviewer edited implementation or ran duplicate Cargo builds. + +| Role | Disposition | +| --- | --- | +| `/root/architecture_review` | PASS. Closed finite stateless intent, exact workspace/cap/method binding, existing native kernels, actual IterationLimit-only same-input fallback, truthful role/failure observations and sole Session publication. Approved prospective boundary and later split qualification: only one UI test API call differs; all core source/tests are byte-identical. Actual 200 selected intervals, two shortened cases and four low-cap fallback intervals support scoped contract equivalence. | +| `/root/persistence_independent` | PASS source/contracts. Private method-only native header adaptation follows outer role validation at capture and decode; authoritative outer fallback is retained, old validators remain strict, v1 omits new failure byte. Reviewed real cold success/failure/tails and corrupted links. Found embedded-version analogue after the original intent fix; both public callers now reject foreign version before parsing payload. All-context repair reviewed and targeted14-pass suite confirmed. | +| `/root/native_ui_independent` | PASS exact consumer. Actual literal old/new solver and RPS/RPP/RPT versions, accepted/header-only archives, future namespace/cache/evidence/gesture clearing and closed comparison refusal covered. Initial profile-assertion omission disposed before evaluation. Private-reader test compile error disposed by one public API call; final13-pass/2-existing-ignore inspector suite, strict desktop Clippy and format all source-bound to9ddf8d2. No new native-window claim. | + +Root authored public/consumer changes, coordinated shared types and owned all builds. `/root/native_ui` authored core; `/root/persistence_review` authored persistence. Fixed criteria remained unchanged through repairs. All initial compiler failures and the d792 compatibility failure are retained, along with exact source lineage. Independent artifact audit is recorded below and in the manifest before final qualification publication. Lead-owned source admission/hosted integration and full C1-B/C/R acceptance remain separate. + +Final independent execution/artifact/scope audit by `/root/persistence_independent`: **PASS, no blockers**. Rehashed all68 artifacts,12 deciding and14 relocated historical executable records; eight deciding logs total227/0/5. All140 final source pins match committed9ddf8d2, worktree and fresh selector; eight changes relative to PR137,132 unchanged, no added/removed selected paths. Historical d792/4af maps,15 checkpoint trees and four local/API equivalence pairs match. The split is exactly one UI test line. All68 ZIP members byte-match retained originals;98,823,203 bytes, SHA256 `fd5e208b61397f4ad01f64a8bc3532daf07b8549fdd7e32876fc05d446b78759`. Both prior protected evidence archives remain unchanged; admission inputs are untouched. The manifest records the audited pre-audit manifest hash; adding this disposition changes report metadata only. + +Final architecture report/claim review independently recomputed227/0/5 and confirmed all interval counts, split source identities, retained failed evaluations and pending admission/hosted/full-replacement gates. No unresolved source, consumer, persistence or evidence finding remains. diff --git a/docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md b/docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md new file mode 100644 index 00000000..a897beae --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md @@ -0,0 +1,178 @@ +# CV3-A admission: static polygon manufactured-solution pilot + +**Admitted next numerical milestone; no evaluation or acceptance yet.** The +parent's 2026-10-20 continuation asks the lead to select the next grid-first slice +after bounded CV2. Resume the existing numerical owner; do not create a duplicate +solver worker. First commit the discovered source/write set, resource plan, +prospective protocol and independent oracle/review, then perform one bounded +private-reference campaign. This admission changes no production capability. + +Dependency: final [PR139](https://github.com/MrScripty/Rheon/pull/139), head +`902f6092de6044419d028f92dabd8e59ae7a87ba`, numerical source +`b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. Its +[sealed custody manifest](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/evidence-manifest.md) +retains all 24 static cases, independent references, six unscaled square +velocity-accuracy failures and unchanged original mass conditioning. CV2 resolves +that fixed solve question; it establishes neither approximation order nor generic +cut stability. Its actual source and evidence remain immutable. + +## Decision and alternatives + +| Route | Disposition and reason | +| --- | --- | +| Repeat CV2 conditioning fixtures | Retain existing results; another same-corpus solve does not test approximation of a field outside the discrete spaces. | +| Full published free-surface disk now | Retain as the canonical later gate. Exact curved geometry, nonpolynomial forcing/integration and feasible 32/64/128 solution/reference machinery need separate preparation. A fixed polygon must not be called the zero-traction circular problem. | +| Static, exact-source polygon MMS with nonrepresentable fields | **Selected CV3-A.** It isolates field/pressure approximation and physical trace errors using existing static geometry and solve owners before expanding geometry or production state. | +| Add guessed stabilization, delete small supports or change pressure rows | Not admitted. Such changes require a distinct method decision and unchanged physical gates; passing residuals or a few positive spectra is insufficient. | + +The [Larionov–Batty–Bridson supplement, section 1 and equations 5–15](https://cs.uwaterloo.ca/~c2batty/papers/Larionov2017/supplemental.pdf) +uses analytic velocity/pressure and total traction to test coupled Stokes. Its +free-surface disk has nonzero interface pressure and zero **total** traction. +Here the exact polygon receives its own analytic prescribed traction; this is +not that circular free-surface test. [Burman–Claus–Massing's abstract](https://arxiv.org/abs/1408.5165v2) +attributes cut-independent stability to their particular stabilized formulation. +It supplies no theorem for Rheon's unstabilized staggered-Q1/P0 reference. + +## Fixed pilot problem + +Use the exact represented-source rectangle and square-17 polygons from CV1, +preserving their physical coordinates, source bytes, orientation and extrusion. +Set rho=1 kg/m³, mu=the represented binary64(.1) Pa s, dt=1 s, +extrusion=1 m, L_ref=1 m and U_ref=1 m/s. Export exact primitive bit identities; +R2 reconstructs those represented primitives before arithmetic rounding. Derive +coefficients symbolically from them rather than substituting rational 1/10 or +independently rounded decimal coefficients. R1 solves actual exported rounded data. +Define X=x/L_ref, Y=y/L_ref and +tau_ref=max(mu*U_ref/L_ref, rho*U_ref*L_ref/dt)=1 Pa. The chosen continuum fields +are deliberately outside the staggered bilinear/P0 spaces: + +```text +psi = U_ref * L_ref * (X^2*Y + X*Y^2) +u = (d_y psi, -d_x psi) +p = tau_ref * (1 + X + 2*Y + X*Y) +sigma = -p I + mu (grad u + grad u^T) +u_star = 0 +f = (rho/dt) u - div sigma +g = sigma n_outward +``` + +Independently derive and dimension-check f, g and div(u)=0 before source freeze. +Integrate these **continuum** body/traction loads. Do not construct a manufactured +discrete RHS from A*u_h and B-transpose*p_h: that would test the solver again. +Include both body and boundary loads in momentum, torque and work/resultant +checks, with each contribution reported separately. The forced problem does not +inherit an unforced nonincreasing-energy inequality. Pressure remains absolute +under the prescribed natural-traction problem; do not +remove a constant pressure row or introduce a gauge by analogy with closed walls. +This is a single time-discrete static verification problem, not temporal-order +or evolving-interface acceptance. + +Freeze nine scenarios before execution: rectangle n=4/8/16 at its existing grid +origin, and square-17 n=4/8/16 at that origin and a grid-origin shift +(.25h,.25h). Source polygons stay fixed in world coordinates. Freeze bounding-box +coverage and all staggered knots/support rules explicitly. Each scenario identity +includes source geometry hash, grid/phase, units/material/dt, field/load version, +basis/reconstruction version and exact command. No phase, case or finest level +may be dropped after seeing outputs. + +## Bounded implementation and ownership + +Use a fresh branch on the exact PR139 dependency, suggested name +`implementation/q2-static-mms-pilot-20261020`. The numerical owner owns only the +private experiment, test adapter, oracle and new q2-static-mms protocol/results +directory. Reuse CV1 M/B/K/physical basis and the CV2 selected solver. No Session, +PressureProvider, worker, SQLite, desktop, source-admission, Cargo or production +owner change is admitted. Composition work remains independently owned. + +Two explicit private-reference prerequisites are admitted for prospective review: + +- CV1 Layout currently refuses n outside 2..=8. Extend only its declared private + ceiling to 16, with allocation/overflow and above-16 refusal controls. Preserve + formulas, support admission, geometry semantics and all old-case behavior. + Record the exact helper/test write set before editing; do not silently coarsen + the pilot to avoid the ceiling. +- The old constant-stress trace rule uses two Gauss points. Quadratic pressure + times a bilinear basis trace can have degree four on an oblique segment. + Freeze a separately reviewed degree-at-least-four-exact load/traction rule + (for example three-point Gauss after **all** staggered-knot and P0 splits), + checked against independent exact polynomial moments. Verify volume-load and + squared-error degree requirements too. This is a new reference integration + contract, not retroactive qualification of old quadrature for new loads. + +Any broader helper, discretization, boundary policy, sparse backend, stabilization +or support/pressure elimination need requires a recorded bounded replan before +expansion. Preserve CV1/CV2 frozen sources, campaign receipts and negative data; +old scientific campaigns are not repeated or relabelled as CV3 evidence. + +## Deciding verification and resource gate + +Keep the canonical [grid verification criteria](verification.md#grid-stokes-transport-and-traction) +unchanged. The pilot uses the same 5% finest relative velocity/pressure and +characteristic-stress-scaled physical traction budgets, and L1/L2 observed order +at least .9 on the declared finest refinement pairs. Freeze component/vector +norms, pressure weighting, cross-phase comparisons and pairwise order formulas +before evaluation. Report L-infinity without assuming second order at cut faces. +Use actual field reconstruction on the exact polygons, not coefficient errors, +cell counts or nominal full-cell weights as substitutes. + +Retain original-coordinate normalized momentum/continuity and work/residual-work +budgets at 1e-10. Distinguish algebraic weak boundary satisfaction from independent +physical traction error; the former cannot establish the latter. Prescribed g +must be subtracted in the physical traction comparison. The separate canonical +zero-traction enforcement target remains 1e-8 of the same positive stress scale. + +The independent reference must integrate continuum polynomial body/traction +loads and reconstructed L2 **squared** errors independently of native assembly. +L1 absolute norms are not globally polynomial; freeze separate bounded integration +and propagate its uncertainty. Independent exported-target solution checks must +quantify original-coordinate algebraic uncertainty below a predeclared numerical +error budget, propagated into every deciding physical norm and refinement +difference. Require at most 1% of each reported discretization error and +refinement difference; apply 5%/.9 decisions conservatively to the resulting +error intervals. Agreement of 80/120-digit references alone is a numerical estimate, +not a certified forward-error bound. Before launch, freeze either a validated +solve/residual-plus-verified-inverse enclosure or an explicitly estimated budget; +an estimated budget cannot satisfy a claimed guaranteed-bound requirement. A +resource or uncertainty failure stops the campaign; a small native residual alone cannot do this, as CV2's retained +unscaled failures demonstrate. Exact-integral reference and rounded exported +target errors stay separate. Unresolved reference/quadrature uncertainty cannot +be labelled pass or used to infer order. + +Record exact B rank, pressure modes and a dimensionally declared velocity-H1 / +pressure-L2 scaled spectral diagnostic across grids/phases, including the fixed +alternating-cell pressure pattern. Keep physical constant-pressure semantics. +Freeze the full consistent velocity H1 Riesz matrix +Gv=integral(grad(phi_i):grad(phi_j)+L_ref^-2 phi_i*phi_j), pressure L2 mass +Qp=diag(positive cell volumes), and the spectrum of Qp^-1/2 B Gv^-1 B^T Qp^-1/2. +Keep every pressure row, including the constant mode. Freeze scaling, exact +rank algorithm, reference precision and spectral uncertainty first. CV2 A/Schur +equilibration spectra are different diagnostics and do not replace these norms. These are finite-instance diagnostics with no invented +beta cutoff, generic inf-sup theorem or automatic stabilization policy. + +Before any selected solve, derive matrix sizes, dense storage/factor/reference +costs and available resources for **all nine** cases. At n16, conservative +full-grid bounds are 544 velocity coefficients, 256 pressure rows and 800 KKT +rows; exact rank/high-precision cost can dominate binary64 matrix storage. Freeze hard RAM, scratch, +CPU-worker and wall-time caps, along with source/oracle hashes and actual commands. +If n16 or an independent reference cannot fit, stop and report the feasibility +blocker for a separately reviewed backend/protocol decision. Do not begin a +partial campaign and call whichever finest level completed the deciding result. +After independent protocol/source review, run one serialized source-bound campaign +into new external output, retain every failure and validate evaluator guards in +normal/-O/-OO modes with malformed and residual-consistent wrong-solution controls. + +## Handoff and remaining boundaries + +The existing numerical worker may resume discovery/protocol/oracle preparation +under this admission, then implement and evaluate only after the prospective +independent/resource gates above are satisfied. No further user confirmation is +needed for that bounded authorized scope. Root retains shared plan/ledger, +complete-source admission, dependency order, hosted checks and publication. +Fresh source qualification and exact-head hosted gates remain separate from +the numerical experiment and from any public merge. + +CV3-A has no result yet. Even a passing pilot would be a static prescribed-traction +polygon envelope only. The full Larionov disk 32/64/128, annulus/no-slip lifting, +water hydrostatics/oblique obstacles, generic cut stability, evolving geometry/ +transport/GCL, 3D and production acceptance remain unqualified. The grid-first, +then particle/output-surface, then later Lagrangian roadmap remains unchanged. diff --git a/docs/plans/fluid-accuracy-composition/reports/cv3a-review/audit.json b/docs/plans/fluid-accuracy-composition/reports/cv3a-review/audit.json new file mode 100644 index 00000000..402bc181 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/cv3a-review/audit.json @@ -0,0 +1,282 @@ +{ + "base_head": "c08df02456a6896b4f9237f62b84e63e1290f9a2", + "base_tree": "ef9c694069cd606d836e2174d583dd696174c713", + "frozen_metadata_sha256": { + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md": "212456439c1f52bd340d85b27d52f176efd126d2bd81f8c5fbd82a665d0d55d1", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json": "26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9" + }, + "link_errors": [], + "links": { + "local": [ + { + "from": "docs/plans/fluid-accuracy-composition/execution-ledger.md", + "target": "reports/cv3a-admission.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/g1-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/native-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/integration-20261020.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md#standards-and-composed-design-admission" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/g1-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md#standards-and-composed-design-admission" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/g1-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/native-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1a-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1-readiness.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#replacement-contract-gates" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1b2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#particle-wall-and-equilibrium-gates" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/integration-20261020.md#retained-numerical-evidence-and-selected-route" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/cv3a-admission.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1-readiness.md#frozen-first-slice-write-set" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#claim-register" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/mathematics.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/workflow-preview.html" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "issues.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "execution-ledger.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "source-review/readiness-review.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "source-review/g1-cancel-followup.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "final-admission-review.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "qualification.json" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "qualification-186dc0a-review.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../c1b2-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../g1-advection-cancel-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../g1-advection-cancel-next-readiness.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md", + "target": "../cv3a-admission.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "c1b2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "cv3a-admission.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "g1-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "c1a-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "c1b2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "g1-qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md", + "target": "verification.md#grid-stokes-transport-and-traction" + } + ], + "pinned": [ + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/3d2bc4ea76dc71dfbb063afec5059d437f8826ce/docs/audits/general-fluid-20261019/report.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "https://github.com/MrScripty/Rheon/blob/dfcc693bf8b66678a924e4a92d299127f6746526/docs/plans/fluid-accuracy-composition/q1/results.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a64d4d3c610d2ea30f2c734e61e86c4bf2bd25c4/docs/plans/fluid-accuracy-composition/p1/results.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/bc2573f2ba8d51f9f473fb11285b0c26840e4f18/docs/plans/fluid-accuracy-composition/p1-adjoint/results.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/9d84f66a5bace9be7fd2f44b40c014c692daf099/docs/plans/fluid-accuracy-composition/p1-material/results.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/9d84f66a5bace9be7fd2f44b40c014c692daf099/docs/plans/fluid-accuracy-composition/p1-material/route-decision.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/dfcc693bf8b66678a924e4a92d299127f6746526/docs/plans/fluid-accuracy-composition/q1/results.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/9ddf8d2fd860c73bbcc35a077e08099d894db07a/docs/plans/fluid-accuracy-composition/reports/c1b3-protocol.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/independent-review.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md" + }, + { + "from": "docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md", + "target": "https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/evidence-manifest.md" + } + ] + }, + "local_link_count": 48, + "paths": { + "docs/plans/fluid-accuracy-composition/execution-ledger.md": "5cad4d207409cb9acd2eb587e347d7fc9463f25de2f6762c3b3b743a6b50e43c", + "docs/plans/fluid-accuracy-composition/issues.md": "66e42f55550c9812f023ec3051364954cc61a90afba0045b50a42ac7437083de", + "docs/plans/fluid-accuracy-composition/plan.md": "01982529e3a8ec30038cce8a3c98aeeac748b04d33863371f620a30ef4de1d96", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md": "f6a8032808693936504bcb2818835754261a2f3293c6beca9d42e6fb1b988347", + "docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md": "8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md": "ca6b6747ef3316b325395c9de50bca31bbbb3c1b040beaef8c696d8bd2ededb6", + "docs/plans/fluid-accuracy-composition/reports/verification.md": "974d8bb704005d28561a17310125c18e4d18f7ff345228ce640c302a9f114967" + }, + "pinned_blob_link_count": 15, + "selected_source_count": 140, + "selected_source_match_frozen186": true +} diff --git a/docs/plans/fluid-accuracy-composition/reports/cv3a-review/recommendation.md b/docs/plans/fluid-accuracy-composition/reports/cv3a-review/recommendation.md new file mode 100644 index 00000000..c6ca11e5 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/cv3a-review/recommendation.md @@ -0,0 +1,92 @@ +# CV3-A admission recommendation — static polynomial polygon MMS + +**Recommend CV3-A as the next separately frozen numerical milestone, ahead of a literal paper-disk campaign.** It is a useful nonrepresentable, independently forced consistency/convergence test of the selected full-mass staggered-Q1/P0 formulation and CV2 solver. It is not a substitute for the canonical Larionov disk, a generic stability result, moving-surface method, production capability or current numerical pass. Admit protocol/source preparation subject to the explicit prerequisites below; execution and acceptance follow only after the independent oracle and resource freeze. + +Review subject: PR139 report head `902f6092de6044419d028f92dabd8e59ae7a87ba`, numerical source `b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. I read the CV1 decision/mathematics/protocol, CV2 method/protocol/qualification/source review, actual basis/trace/experiment implementation and canonical verification criteria. CV2's reported 24 cases, 15 debug/15 release contracts and45tool checks remain owner-attributed; no raw campaign, build or test was rerun here. + +## Why this comes before the literal disk + +CV1 makes one physical velocity reconstruction, support, full M/B/K and trace explicit; CV2 establishes a bounded accurate solve for its fixed corpus. An affine patch can remain exact even when approximation properties are inadequate. The proposed quadratic velocity and nonconstant pressure leave those finite spaces, exposing approximation, pressure response, physical stress trace and grid-phase sensitivity with exactly integrable data. Fixed polygons separate these issues from changing curved geometry and from the singular-looking radial expressions at the paper's disk centre. Passing this pilot would justify only its finite static cases and a subsequent method decision. + +The [primary supplement](https://cs.uwaterloo.ca/~c2batty/papers/Larionov2017/supplemental.pdf), section1 and equations5/10, describes a different disk test with zero total traction and nonzero interface pressure. Its continuum equations motivate the load signs here; they do not make prescribed polygon traction equivalent to that test. The canonical r=.75 disk,32/64/128 and rescaled-water/annulus gates remain unchanged and unmet. A polygon approximation, a nine-case pilot or a dense backend is not their replacement. + +## Freeze the actual continuum problem + +Use physical coordinates X=x/Lref and Y=y/Lref with a fixed global origin, Lref=Uref=Href=1, rho=1, mu=the represented binary64(.1), dt=1, and fixed nonzero stress scale + +`tau_ref=max(mu Uref/Lref, rho Uref Lref/dt)=1 Pa`. + +Set **u*=0** explicitly. With psi=Uref Lref(X²Y+XY²), + +- u=Uref(X²+2XY, -2XY-Y²), so div u=0 and u is not in the componentwise bilinear space; +- p=tau_ref(1+X+2Y+XY), an **absolute** pressure not in the primal P0 space; +- sigma=-p I+mu(grad u+grad uᵀ), g=sigma n on every original polygon edge; +- f=(rho/dt)u-div sigma in the body, not a matrix action on desired coefficients. + +In the stated unit scales, the stress components are `sigma_xx=-p+4mu(x+y)`, `sigma_yy=-p-4mu(x+y)`, `sigma_xy=2mu(x-y)`. The body force is + +`f=(x²+2xy-2mu+1+y, -2xy-y²+2mu+2+x)`. + +Keep these as symbolic expressions evaluated from the frozen primitive constants; do not silently replace exact represented mu with rational1/10 or independently rounded .2/.8 literals. R1 uses actual exported native rounded data; R2 reconstructs exact represented primitive data before arithmetic rounding, as in CV2. Export all primitives and actual loads. + +The saddle equations remain `A U-BᵀP=F`, `B U=0`, A=M/dt+K, now with `F_i=integral_Omega phi_i·f + integral_Gamma phi_i·g`. Never form F as A times an interpolated exact velocity minus Bᵀ times sampled pressure. This is one time-discretized planar Stokes problem per case, per1m depth. Only polygon side edges form Gamma; no physical 3D end caps or interface motion is implied. There is no pressure gauge or prescribed pressure boundary value in addition to g. + +The energy and momentum checks must include **both body and boundary** load/work/resultant/torque. Zero u* does not imply nonincreasing kinetic energy in this forced problem. Reuse the full residual/work identity, not CV2's unforced energy inequality or boundary-only momentum formula. + +## Nine fixed cases and two source prerequisites + +| Physical polygon | Grid origins | n | +| --- | --- | --- | +| CV1 rectangle (.17,.23)–(.83,.79) | (0,0) |4,8,16| +| Exact represented CV1 square, side.3, centre(.537,.479),17degrees | (0,0) |4,8,16| +| The **same** square bytes | (h/4,h/4), h=1/n |4,8,16| + +Use extent1 and record the shifted computational domain explicitly. Pin the represented polygon vertices once, including square vertex bits; do not regenerate or move the physical polygon/MMS with the grid, scale geometry with h, rotate the field, or reconstruct vertices from different trigonometric evaluations per level. Keep the source within both staggered lattice hulls. Phase changes the grid, not the physical problem. All positivity, support, coincidence and representability refusals remain exact, with no floor/deletion/merging/stabilization/gauge. + +1. **n16 is not currently supported by the unchanged CV1 constructor.** `basis.rs::Layout::new` explicitly accepts only n2..8. Admit an allocated, independently reviewed bounded ceiling extension for this new source subject, with unchanged mathematical basis/support/M/B/K formulas, retained old-corpus byte controls and an above-ceiling refusal. Do not describe the implementation as wholly unchanged source, or quietly coarsen the protocol to n8. CV2 solver/fixed refinement can remain byte-identical. +2. **The new load cannot use CV1's two-point constant-stress edge rule unchanged.** On an oblique edge the Q1 trace has degree2 and this pressure/traction degree2, so their product can have degree4; two-point Gauss is only degree3-exact. Use a separately frozen degree>=4-exact rule, e.g. three-point Gauss after all common half-cell knot and pressure-cell splits, with independent exact polynomial segment moments. Preserve the existing CV1 trace maps/evidence. The current positive3x3Duffy volume rule is sufficient in real arithmetic for Q1 times this degree2 body force; independently verify rather than assuming native floating integration is exact. + +These are prospective source obligations, not observed failures of the unrun pilot. Keep their allocation small and versioned; no production pressure/geometry/Session integration follows. + +## Measurements, oracle and numerical-error budget + +Freeze complete velocity reconstruction and its derivatives on every common integration piece, actual P0 pressure in every positive cut cell, and the liquid-side physical stress trace on each source-edge piece. Pressure and gradient traces must split at their actual discontinuity/knot locations; averaging, extrapolation, nodal-only error or fitting a new stress reconstruction would change the test. + +Use physical-domain norms, not an unweighted list of nodal coefficients: + +- velocity relative L1/L2 errors against the nonzero analytic field; +- absolute-pressure relative L1/L2 errors against the nonzero analytic p, with **no mean subtraction**; +- boundary traction L1/L2 errors for sigma_h n-g, normalized by tau_ref and the corresponding boundary measure; report normal and tangential parts and edgewise maxima separately; +- L-infinity diagnostics with a declared search/evaluation definition, without claiming cut-boundary second order. + +State whether L1 uses Euclidean vector magnitude or a componentwise norm, and use it consistently across levels/phases. L2 squared field and traction errors are piecewise polynomials and admit independent exact moment integration. **Absolute-value L1 integrands are not globally polynomials.** Use an independent bounded integration/root-partition procedure, retaining its numerical uncertainty and refusal when the budget cannot resolve it; do not call Gauss sampling an exact polynomial L1 oracle. + +Retain the pilot's fixed finest5% velocity/pressure/physical-traction targets and at least.9 L1/L2 finest-pair orders for each three-level family, with the precise metrics/denominators frozen before data. Report both4→8 and8→16 orders; specify explicitly which pairs are deciding. Apply thresholds and orders conservatively to norm-error intervals, not rounded central values. For example, a conservative finest-pair order uses log2((E8-delta8)/(E16+delta16)) when its numerator is positive. Do not claim canonical disk acceptance from passing these pilot metrics. + +Keep independent physical traction error separate from algebraic boundary-load assembly, momentum residual, continuity and work checks. Here g is prescribed and nonzero: there is **no zero-traction residual to celebrate**. Preserve full original-coordinate residual/work1e-10 and fixed CV2 R1/R2 solution-comparison gates, alongside the new physical metrics. Also report physical body/boundary power and momentum separately so cancellation cannot hide a missing load term. + +Independently assemble exact polynomial loads/norms and M/B/K from the represented physical source. Reuse neither native Gauss implementation nor native exported operators as the R2 oracle. Retain independent highprecision LU references to both R1 and R2, all selected native refinement states and the R1–R2 gap. Do not change or select the CV2 solver/refinement count after observing errors. + +**Freeze a quantitative original-coordinate numerical-error budget before launch.** Propagate native solve/assembly/reference/integration uncertainty into the physical velocity/pressure/traction norms and keep it well below the measured discretization error and refinement difference, e.g. a predeclared1% budget for each. Use worst-case intervals for5%/.9 decisions. Small transformed residuals and80/120digit agreement alone do not establish a guaranteed forward-error enclosure. If the protocol requires a literal certified bound, select a validated solve or residual plus verified inverse bound before execution; otherwise explicitly call the CV2-style highprecision comparisons numerical-reference estimates, and do not claim that the guaranteed-bound clause has passed. Resource inability to establish the selected error budget is a stopped/blocked result, not permission to accept residual-only accuracy. + +## Stability diagnostics and stop rules + +Require exact rational full row rank of B for each of the nine actual geometries/meshes. Retain all pressure rows, including the constant mode: prescribed total traction makes absolute pressure observable. No rank-tolerance deletion or added gauge. + +For a comparable finite diagnostic, declare the velocity Riesz matrix + +`Gv_ij=integral_Omega (grad phi_i:grad phi_j + Lref^-2 phi_i·phi_j)` + +and pressure L2 mass `Qp_cc=volume(Qc)`. Report the spectrum of `Qp^-1/2 B Gv^-1 Bᵀ Qp^-1/2` (or the equivalent generalized eigenproblem), its minimum singular-value square root, eigenvector/pressure-cell pattern and precision uncertainty. Use full consistent vector H1 norm: the mass term avoids rigid-mode kernels, and the gradient is not silently replaced by symmetric strain. CV2's A/Schur equilibration spectrum has a different norm/material/dt meaning and cannot substitute for this diagnostic. Report conditioning/near-checkerboard evolution and original/scaled matrices separately. Do not choose an arbitrary beta cutoff, suppress a small mode or claim a finite observed spectrum proves mesh/cut-uniform inf-sup stability. Exact rank failure is a method failure; a small positive mode still must meet the independent solution-error budget. + +Before the one campaign freeze numeric native/reference wall-time, RSS, output and total budgets plus supported precision/rank algorithms. At n16 the absolute full-grid upper bounds are544velocity coefficients,256pressure cells and800KKT rows; dense/BigRational/highprecision work is not automatically feasible just because binary64 matrices fit memory. Keep per-case source/attempt/refusal logs and completed outputs on a later failure. If n16 rank, independent highprecision/reference integration or dense solve exceeds the frozen resources, stop/replan with the failed case retained. No silent coarsening, extra precision/backend fallback, support pruning or posthoc tolerance increase under the same version. + +Before raw evaluation, freeze normal/-O/-OO always-on oracle guards and negative controls: incorrect/omitted/reversed pressure traction, wrong body force, wrong phase/source/pressure trace, insufficient oblique-edge quadrature, and a deliberately wrong final field with self-consistent rewritten residual metadata. The intended accuracy/load guard must reject each control; parser failure alone is insufficient. Source/binary/commands/raw outputs and all oracle reports remain hash-bound. Any selected failure is reported rather than tuning the corpus until it passes. + +## Decision boundary + +This is a coherent, dependency-ready **prospective CV3-A development admission**, conditional on the resource/oracle/source freezes above. It is preferable to making the first nonlinear-field test simultaneously depend on curved-boundary representation,32/64/128 dense feasibility and the literal paper solution. It leaves that harder target visible. No experiment has run, no result has passed, no generic PDE/stability/production gate is closed, and no user/model asset or training is needed for these synthetic fixtures. + +Source links (exact reviewed head): [CV1 decision](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-method/decision.md), [CV1 mathematics](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-method/mathematics.md), [CV1 protocol](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-method/protocol.md), [basis bounds](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/examples/grid_cut_variational_reference/basis.rs), [physical trace rule](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/examples/grid_cut_variational_reference/trace.rs), [CV2 method](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/method.md), [CV2 protocol](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/protocol.md), [CV2 qualification](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md). Canonical criteria were read at main `718469beedb9a949f4bb6f3299c7b880b4c47e47`, [verification lines61–72](https://github.com/MrScripty/Rheon/blob/718469beedb9a949f4bb6f3299c7b880b4c47e47/docs/plans/fluid-accuracy-composition/reports/verification.md#grid-stokes-transport-and-traction). + +Read-only review; only this external recommendation written. No source/experiment/build/campaign/ref/PR mutation or duplicate implementation. Neither mathematical reasoning nor digest custody is authentication, reproducibility or physical acceptance. diff --git a/docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.json b/docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.json new file mode 100644 index 00000000..007dea53 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.json @@ -0,0 +1,74 @@ +{ + "audit_sha256": "e73f75d1c47686d3a04bfe4ec99fade647dcc22b43159654553c231b0b8005a9", + "base_head": "c08df02456a6896b4f9237f62b84e63e1290f9a2", + "base_tree": "ef9c694069cd606d836e2174d583dd696174c713", + "cv3a_decision": "Prospective preparation permitted; source/write-set/prerequisite/oracle/resource review must precede campaign. No current result or production/source-inventory admission.", + "decision": "APPROVED_EXACT_SEVEN_DOCUMENT_PATHS", + "findings": [], + "frozen_metadata_sha256": { + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "caa78be78306aa095a42fd6a54c0c355a4f5dfbc74b7244a0a94bc9242f09941", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "a0878b551464f5a05ae29f90aa877a8147e157259f26a1bbedc96cb99a9098df", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md": "212456439c1f52bd340d85b27d52f176efd126d2bd81f8c5fbd82a665d0d55d1", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json": "26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9" + }, + "link_errors": [], + "local_link_count": 48, + "mathematical_assessment": [ + "The streamfunction yields u=(Uref*(X^2+2XY),Uref*(-2XY-Y^2)) and exact div(u)=0. Both velocity components contain a pure square and lie outside componentwise bilinear Q1; nonconstant pressure lies outside primal P0.", + "For the declared unit scales, div(sigma)=(2mu-1-y,-2mu-2-x), hence f=(x^2+2xy-2mu+1+y,-2xy-y^2+2mu+2+x). Represented mu must remain exact binary64 source primitive in R2. Correct continuum load signs and body plus traction work are required; no unforced energy claim.", + "Degree-four boundary load and n16 ceiling extension are genuine source prerequisites, verified against current Layout n2..8 and two-point edge integration; neither silently inherited from CV1/CV2.", + "Norm definitions, physical-side traces, L1 integration uncertainty, independent L2 moments, conservative thresholds/orders and numerical-error propagation are prospective requirements. Finite precision agreement/small residual is not a certified forward bound. An estimated budget cannot discharge any guaranteed-bound criterion.", + "H1/L2 spectral/rank diagnostics retain every pressure row and are finite-instance diagnostics, not uniform inf-sup proof. Hard all-nine-case resource freeze and stop/replan prohibit partial-finest acceptance or hidden coarsening. Canonical disk, stability, hydrostatics, transport/GCL,3D and production remain open." + ], + "owner_evidence": { + "PR139": { + "head": "902f6092de6044419d028f92dabd8e59ae7a87ba", + "numerical_source": "b0a9d52cc266cb651c5e67c07ec5f4f82419db55", + "reported_scope": "24 fixed static cases;15 debug+15 release contracts;45 evaluator checks;retained six unscaled square accuracy failures and original mass condition about6.53e11" + }, + "PR140": { + "consumer": "9ddf8d2fd860c73bbcc35a077e08099d894db07a", + "core": "4af3802babe332d8dfeb926c19159b4b656be775", + "head": "5dc1741feffa88b857194559b3e7e79be5369a64", + "limits": "Overlapping deciding executions, not distinct tests. One consumer UI-test API correction; final head reports only. Earlier failed runs retained. No lead raw archive/campaign audit; source admission/fresh lead/hosted integration still pending.", + "reported_counts": { + "existing_ignored": 5, + "failed": 0, + "passed_executions": 227 + } + } + }, + "paths": { + "docs/plans/fluid-accuracy-composition/execution-ledger.md": "5cad4d207409cb9acd2eb587e347d7fc9463f25de2f6762c3b3b743a6b50e43c", + "docs/plans/fluid-accuracy-composition/issues.md": "66e42f55550c9812f023ec3051364954cc61a90afba0045b50a42ac7437083de", + "docs/plans/fluid-accuracy-composition/plan.md": "01982529e3a8ec30038cce8a3c98aeeac748b04d33863371f620a30ef4de1d96", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md": "f6a8032808693936504bcb2818835754261a2f3293c6beca9d42e6fb1b988347", + "docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md": "8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md": "ca6b6747ef3316b325395c9de50bca31bbbb3c1b040beaef8c696d8bd2ededb6", + "docs/plans/fluid-accuracy-composition/reports/verification.md": "974d8bb704005d28561a17310125c18e4d18f7ff345228ce640c302a9f114967" + }, + "pinned_blob_link_count": 15, + "primary_evidence_sha256": { + "/tmp/rheon-cv3-admission-independent-review/recommendation.md": "d54d52efd222b9defc7a37ec2efb43daaef7f31c7ff97c607c6d267e9187f69a", + "/workspace/rheon-c1b2-admission-20261020-evidence/final-owner-deliveries/rheon-pr139-final.json": "9dbc2a541ef9ca7109c0dbfc3997eee7b5b13d52ddcc97ca1dd3f2d09a7a2fc7", + "/workspace/rheon-c1b2-admission-20261020-evidence/final-owner-deliveries/rheon-pr140-final.json": "d41707443c5af91a9f50708ec7cc77052477731b715fcaa43e258268b94db661", + "5dc1741feffa88b857194559b3e7e79be5369a64:docs/plans/fluid-accuracy-composition/reports/c1b3-qualification.md": "4c8ee0a4c2e1b4e36444cf8fa3872afbfe2ba17addde8ffc339d1b595000aba1", + "902f6092de6044419d028f92dabd8e59ae7a87ba:docs/plans/fluid-accuracy-composition/q2-cut-solve/evidence-manifest.md": "5efa441a26fd573ca125c4534c7626626663c5843e795ff529f99c5a7e944d68", + "902f6092de6044419d028f92dabd8e59ae7a87ba:docs/plans/fluid-accuracy-composition/q2-cut-solve/independent-review.md": "34a437a5018efe908cf49e3fdfe829fb118e290049b13bd9aaf81625d8b6c477", + "902f6092de6044419d028f92dabd8e59ae7a87ba:docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md": "31077d62b98a8ecc712cc986cd7ab9a917628b1879ce357c8b41bce82363323e" + }, + "primary_external_sources_read": [ + "https://cs.uwaterloo.ca/~c2batty/papers/Larionov2017/supplemental.pdf", + "https://arxiv.org/abs/1408.5165v2" + ], + "remaining_gates": [ + "CV3 exact helper/test write set, independently reviewed continuum loads/quadrature/norm/oracle protocol and feasible frozen resource caps before any campaign.", + "Separate complete-source admission/fresh qualification and exact-head hosted gates for C1-B3 or other implementation integration.", + "Canonical physical/disk/stability/production criteria remain unchanged and unqualified." + ], + "review_method": "Read-only exact Git objects, final captured owner snapshots, current documentation diff, manual mathematical/ownership assessment, direct SHA256 comparisons and link/fence/whitespace checks. No test/build/campaign/model execution or repo/ref/PR mutation.", + "schema": "rheon-independent-final-owner-cv3a-doc-review-v1", + "scope": "Six existing documentation deltas versus c08df02456a6896b4f9237f62b84e63e1290f9a2 plus new prospective cv3a-admission.md. Own review receipts excluded from scope.", + "selected_source_count": 140, + "selected_source_match_frozen186": true +} diff --git a/docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.md b/docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.md new file mode 100644 index 00000000..69974e3d --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.md @@ -0,0 +1,45 @@ +# Independent final owner-status / CV3-A documentation review + +**Approved: the exact seven documentation paths below. No material findings.** + +Reviewed the six existing path deltas against `c08df02456a6896b4f9237f62b84e63e1290f9a2` (tree `ef9c694069cd606d836e2174d583dd696174c713`) and the new CV3-A admission. This receipt grants documentation/prospective preparation approval only. Its own files and any later copied receipts are outside the seven-path hash scope. + +## Owner status and custody + +The captured final PR139 snapshot and exact source-pinned qualification bind head `902f6092de6044419d028f92dabd8e59ae7a87ba`, numerical source `b0a9d52cc266cb651c5e67c07ec5f4f82419db55`. They support the attributed 24 fixed static CV2 cases, 15 debug plus 15 release contracts and 45 evaluator checks. Six unscaled square velocity-accuracy failures and original mass conditioning about 6.53e11 remain retained. This is bounded reference qualification, without generic stability/PDE/production inference. + +The final PR140 snapshot and exact qualification bind head `5dc1741feffa88b857194559b3e7e79be5369a64`, core `4af3802babe332d8dfeb926c19159b4b656be775` and consumer `9ddf8d2fd860c73bbcc35a077e08099d894db07a`. They support 227 passing deciding executions, zero failures and five existing ignored tests. These executions overlap, rather than representing 227 distinct tests. The consumer correction is one UI-test public reader call; final head adds reports. The 200 selected native intervals are same-producer bitwise contract evidence, not cross-method or physical accuracy. Initial compile/refusal-category failures and repairs remain historical. Complete-source admission, fresh lead qualification and exact-head hosted gates stay separate. + +No owner raw campaign or ZIP was rerun/downloaded/rehashed by this review. Owner summaries and source-pinned primary reports are attributed accordingly. Earlier six/eleven-path review receipts remain immutable and source-bound. + +## Mathematical and admission boundaries + +The declared streamfunction gives `u=(Uref*(X²+2XY), Uref*(-2XY−Y²))` and divergence zero. Its pure-square velocity terms and nonconstant pressure are outside componentwise bilinear Q1 / P0. With the stated unit scales, `div(sigma)=(2mu−1−y,−2mu−2−x)`, so the proposed continuum body load has the correct sign. R2 must derive from represented binary64 `mu=.1`, not rational 1/10 or independently rounded derived coefficients. Both body and boundary loads/work/resultants are required; a forced solve does not inherit an unforced energy inequality. + +The admission identifies two genuine prerequisites: current CV1 `Layout::new` refuses above n8, and current edge integration uses two Gauss points. Oblique Q1 trace times quadratic traction can be degree four. The prospective n16 ceiling and degree-at-least-four integration must therefore receive their own bounded source/test review, preserving old-corpus behavior. No current source extension or quadrature qualification is implied. + +The nine-case geometry/phase envelope, absolute pressure, reconstructed physical trace, exact polynomial L2-squared reference, bounded L1 uncertainty and deciding norm/order definitions must be frozen before execution. Numerical uncertainty must be propagated into thresholds and refinement differences. The explicit estimated-versus-certified distinction preserves any guaranteed-bound criterion: agreement of high-precision references or a small residual cannot discharge it. Full H1/L2 rank/spectrum diagnostics retain constant pressure and establish no uniform inf-sup theorem or arbitrary beta cutoff. + +The all-nine-case RAM/scratch/worker/wall-time feasibility freeze precedes the campaign. An infeasible n16 or unresolved reference stops for a separately reviewed replan; no partial campaign, coarsened finest level, support removal or posthoc gate change is accepted. CV3-A has no result. The canonical disk 32/64/128, generic stability, hydrostatics, evolving geometry/transport/GCL, 3D and production gates remain unchanged and open. + +The primary supplement's section 1 distinguishes its zero-total-traction disk with nonzero interface pressure from this prescribed-traction polygon pilot. The cited stabilized CutFEM abstract supplies no theorem for the unstabilized reference. Those two primary pages were read directly; no external scientific campaign was executed. + +## Frozen subject and document checks + +All 140 selected current source files match both the active inventory hashes and exact qualified `186dc0a18f787748eb723d91321e44ffd0e374d5` blobs. Inventory, append-only bound review, protocol and compact qualification summary retain their prior approved SHA256 values (listed in review.json). This delta neither refreshes source admission nor transfers the old execution receipt. No source, Cargo, kernel, threshold, evaluator, selector or protocol is changed. + +All 48 local file links and 15 source-pinned GitHub blob links in the seven paths resolve. Code fences are balanced and `git diff --check` passes. Read-only inspection and hashing only; no build/test/model/campaign or repository/ref/PR mutation. Only external review artifacts were written. + +## Exact approved paths + +| Path | SHA256 | +| --- | --- | +| `docs/plans/fluid-accuracy-composition/execution-ledger.md` | `5cad4d207409cb9acd2eb587e347d7fc9463f25de2f6762c3b3b743a6b50e43c` | +| `docs/plans/fluid-accuracy-composition/issues.md` | `66e42f55550c9812f023ec3051364954cc61a90afba0045b50a42ac7437083de` | +| `docs/plans/fluid-accuracy-composition/plan.md` | `01982529e3a8ec30038cce8a3c98aeeac748b04d33863371f620a30ef4de1d96` | +| `docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md` | `f6a8032808693936504bcb2818835754261a2f3293c6beca9d42e6fb1b988347` | +| `docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md` | `8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208` | +| `docs/plans/fluid-accuracy-composition/reports/integration-20261020.md` | `ca6b6747ef3316b325395c9de50bca31bbbb3c1b040beaef8c696d8bd2ededb6` | +| `docs/plans/fluid-accuracy-composition/reports/verification.md` | `974d8bb704005d28561a17310125c18e4d18f7ff345228ce640c302a9f114967` | + +The companion [review.json](review.json) contains primary evidence hashes, frozen metadata pins and remaining gates; [audit.json](audit.json) contains resolved link records. These external receipts are excluded from their own path-hash scope. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-admission-iteration-protocol.md b/docs/plans/fluid-accuracy-composition/reports/g1-admission-iteration-protocol.md new file mode 100644 index 00000000..82f81706 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-admission-iteration-protocol.md @@ -0,0 +1,31 @@ +# G1 admission and iteration consistency repair protocol + +2026-10-20, operation replan/repair under the explicit parent direction prioritizing PR129 findings at5ccc77403a674d43925f09ff3eaf42f343f3c7fe. C1-B2 remains on hold with no production changes or tests. Isolated branch repair/g1-admission-iterations-20261020, base43a084a66bdfb3731b24bd480909c81e317b1e53 (retained PR128, dependent PR125/122/120). Lead owns serial integration and canonical plan/ledger reconciliation. No merge, rebase or cleanup. Original G1/C1 protocols, receipts, local results, source inventories and failed evidence remain immutable historical subjects. + +## Observed scope and fixed gates + +The unchanged educational preflight was executed on base43a084a and refused `reviewed native source inventory added or missing path`. Raw output and complete source comparison are retained in /workspace/rheon-g1-repair-evidence. The current conservative selected closure is135 paths:11 added,16 changed,108 unchanged,0 removed versus the latest admitted v3 inventory. This is a source-identity failure, not a numerical comparison failure. No previous receipt resolves it. + +The iteration finding first requires actual counterexamples. Existing RCP2/RCP3 native receipt validation already bounds accepted iterations and enforces zero candidate iterations. Freeze controls that prove an otherwise coherent forged RCP4 still fails its existing inner gate. Separately test WorkflowAttempt validation and RCT2 terminal/unrecorded-tail evidence, whose detached trace may currently lack those bounds. Report actual behavior rather than assume an RCP4 bypass. Fixed bad values: native accepted iterations=max_iterations+1; candidate diagnostic iterations1; accepted configured candidate iterations1 with matching candidate/accepted diagnostics. Fixed valid edges: native accepted iterations=max_iterations; candidate diagnostics/acceptance iterations0. Retain accepted native/candidate traces on failed later volume/cancellation and unrecorded accepted tails. No numerical settings or solver limits are changed. + +Repair only new workflow-evidence consistency: every observed candidate diagnostic has iterations0; any accepted native pressure has iterations≤descriptor max_iterations; accepted configured candidate has iterations0. Apply even when the overall interval later fails/cancels, not only published success. Preserve rejected nonfinite numerical candidate diagnostics and old RCP2/RCP3/RCT1 meanings. All malformed/unknown/cross-linked controls keep refusing. + +## Write set and owners + +Iteration implementation/test owner: delegated persistence worker, only src/workflow.rs and src/recording/workflow.rs (including adjacent existing inline tests). Independent contracts reviewer validates exact counterexample/disposition and final source. No solver/operator/formula, old-profile parser policy, native inspector flow or unrelated fixture changes. + +Educational admission implementation owner: root, only docs/education/aligned_strain_packet.py and docs/education/test_aligned_strain_packet.py; NEW docs/education/aligned-strain-native-sources-composition-20261020.json and NATIVE_ADMISSION_COMPOSITION_REVIEW.md. Independent architecture/admission reviewer must review the complete final135-path closure and explicitly approve exact native pins before a new inventory is created. The prior three inventory files and existing integration review retain exact bytes; no old receipt is transferred. New v4 epoch selection is additive, newest-present strict/no fallback, preserves predecessor identities and review binding, and keeps the conservative selector and historical schemas/behavior unchanged. Unknown/stale/malformed/symlink/current-closure mismatch must refuse. New epoch is permission to attempt qualification, not numerical evidence. Fixed base ancestry43a084a; fresh receipts bind new and preserved admission inputs and actual committed source blobs. No automatic hash-refresh path in build/CI or gate bypass. + +Report/protocol/review/manifest files with g1-admission or g1-iteration prefixes under this reports directory are included. Canonical plan/ledger/claim register remain with lead. Extra source/test/persistence/native-UI owners require concrete replan before edits. + +## Verification and evidence limits + +Commit protocol and fixed controls before evaluating regression candidates. Retain red baseline output; fix and run focused iteration core/RCP4/RCT2 tests, existing workflow/persistence contracts and configured Session/provider gates, strict core/desktop Clippy, formatting. Actual unchanged numerical/native GUI workloads are not silently relabelled as new-source evidence. Existing G1 normal-window/performance results retain their historical source; this repair claims source admission and evidence-validator consistency only. + +After independent full-closure approval, commit repaired source, routing, inventory and review. On a clean exact committed tree execute unchanged check_native_admission.py and tools/qualify_aligned_strain.py into a fresh external directory, producing fresh native/rational receipt/executable/source hashes. Then build a real packet with that receipt and execute packet/admission rejection tests normally and under optimized Python, including predecessor/review/digest/commit/no-fallback controls. Preserve all failed runs. No allow-dirty, old-receipt reuse, weakened selector/threshold, ignored admission gate or automatic regeneration. Hosted Pages/browser/publication checks remain separate; do not claim them from local native/rational checks. No new physical/GPU/learned/native-window/performance acceptance. + +Final source/closure/commands/results and blockers go to a focused dependent draft PR and parent/lead. If the lead selects a different integration tree, its closure requires its own freshness check and clean qualification; these pins/receipts cannot be transferred by assertion. + +## Authority amendment before implementation + +Parent subsequently assigned educational source-admission repair separately to the repository lead and explicitly excluded overlap. This supersedes the educational implementation portion above: this worker will edit **no docs/education file, inventory, review routing or qualification machinery**. Read-only source-admission baseline/135-path discovery is retained for lead handoff only. The active repair write set is src/workflow.rs, src/recording/workflow.rs and g1-iteration/g1-admission report files only. No C1-B2 expansion. Preserve original protocol text/history and every historical receipt. Tests must preserve zero-budget semantics: a cap0 descriptor can retain a correctly accepted configured candidate with iterations0; do not add a blanket positive-iteration-budget rule to pressure v1 or workflow evidence. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-manifest.json b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-manifest.json new file mode 100644 index 00000000..c9c805c4 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-manifest.json @@ -0,0 +1,549 @@ +{ + "schema": "rheon-g1-advection-cancellation-qualification-v1", + "status": "locally qualified; complete-source admission and hosted integration pending", + "pull_request": 137, + "base_commit": "e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4", + "current_main": "718469beedb9a949f4bb6f3299c7b880b4c47e47", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "source_tree": "114ab60ff25f2d637eac1a06a3b02bb99a55bd15", + "toolchain": "Rust 1.92.0; locked; native CPU", + "environment": { + "RUSTUP_HOME": "/tmp/rheon-rustup", + "CARGO_HOME": "/tmp/rheon-cargo", + "CARGO_PROFILE_TEST_DEBUG": "0", + "CARGO_PROFILE_DEV_DEBUG": "0" + }, + "green_summary": { + "passing_executions": 226, + "failed": 0, + "existing_ignored": 5, + "new_test_functions": 4 + }, + "deciding_commands": [ + { + "name": "green-workflow", + "command": "cargo test --locked --lib workflow::", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 26 passed; 0 failed; 0 ignored; 0 measured; 59 filtered out; finished in 0.07s" + ], + "executables": [ + { + "path": "/workspace/rheon-g1-cancel-evidence/green-workflow-rheon-d293312d0455f2e1", + "bytes": 47957968, + "sha256": "ef4d03c330fa09688c3af8c77f44be1b71a21e1d17c26f02e54093d567bc40af" + } + ] + }, + { + "name": "green-desktop", + "command": "cargo test --locked --features desktop --bin rheon-desktop workflow_inspector::tests::", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "exit_code": 0, + "target_dir": "/tmp/rheon-target", + "test_results": [ + "test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 152 filtered out; finished in 6.29s" + ], + "executables": [ + { + "path": "/workspace/rheon-g1-cancel-evidence/green-desktop-rheon_desktop-1f5fbd0763f87c5a", + "bytes": 82742528, + "sha256": "49f6184246c851066cec94f8494a27b6bf61e2be0e84c49d4ff45e4df42a2dfa" + } + ] + }, + { + "name": "green-core-lib", + "command": "cargo test --locked --no-default-features --lib", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 85 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 43.64s" + ], + "executables": [ + { + "path": "/workspace/rheon-g1-cancel-evidence/green-core-lib-rheon-2c0b8f9f964eff45", + "bytes": 47912512, + "sha256": "54c5a6b41386b2c19bb6d77f39043edfaa38e036112526172b7093a036ab1b47" + } + ] + }, + { + "name": "green-contracts", + "command": "cargo test --locked --no-default-features --test recording_contract --test recording_provider_contract --test recording_provider_runtime_contract --test configured_provider_session_contract --test provider_step_contract --test solver_provider_contract --test pressure_session_contract --test recording_comparison_contract", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.07s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.56s", + "test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s", + "test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.30s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.06s", + "test result: ok. 5 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s" + ], + "executables": [ + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-configured_provider_session_contract-7a47e2a64e933952", + "bytes": 13114504, + "sha256": "0d2d953666b14e7d2dea6bd89149d4c542de209c37693a2b750affb9eb43e0b5" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-pressure_session_contract-536f0b07b486b9ae", + "bytes": 2260680, + "sha256": "bf7fce625d2179aeedc61e78e158ab6c0998cb3962afc06fddb819ccf3784186" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-provider_step_contract-024046052e7e09fc", + "bytes": 9625400, + "sha256": "ea21cc683377a27b5990102a6f963de87ae4c1153d4c9c8275bae41e4da0cf05" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-recording_comparison_contract-b830fe95a847344e", + "bytes": 8274072, + "sha256": "a8ee2ff625363341d8bbfaea1fc6db94e60dc5acd2a086b54761e095ab7bc58a" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-recording_contract-01e8969397d0bfcc", + "bytes": 5607672, + "sha256": "2b3609929d9a8ffa6975e50a1d477021c07116b001dd69b8fdd16317776fd9c0" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-recording_provider_contract-4fd9d23bc6148b03", + "bytes": 11341408, + "sha256": "f005c9fe9d09112ecad2ca32d73c0d5365631ce56bdebd4df2fdd74db17e3c1e" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-recording_provider_runtime_contract-479509e11f8147d8", + "bytes": 6768728, + "sha256": "dd5705e456ef68b619f0d3b65c40355f521083c2ed94f6a3e0dac538b33660ba" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-solver_provider_contract-4f9ffb3b3a91bb87", + "bytes": 2087376, + "sha256": "ae7a267e8f9f137ae4254f00acc955605098dd00192b4e7f6f1d1714c2605b01" + } + ] + }, + { + "name": "green-doctests", + "command": "cargo test --locked --no-default-features --doc", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [ + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s" + ], + "executables": [] + }, + { + "name": "green-clippy-core", + "command": "cargo clippy --locked --no-default-features --all-targets -- -D warnings", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [], + "executables": [] + }, + { + "name": "green-clippy-desktop", + "command": "cargo clippy --locked --features desktop --all-targets -- -D warnings", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "exit_code": 0, + "target_dir": "/tmp/rheon-target", + "test_results": [], + "executables": [] + }, + { + "name": "green-fmt", + "command": "cargo fmt --all -- --check", + "source_commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "exit_code": 0, + "target_dir": "/workspace/rheon-core-target", + "test_results": [], + "executables": [] + } + ], + "source_admission": { + "command": "python3 docs/education/check_native_admission.py", + "exit_code": 1, + "reason": "reviewed native source inventory added or missing path", + "modified_admission_inputs": false + }, + "read_only_source_map": { + "source": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "selected": 140, + "added": [], + "removed": [], + "changed_from_pr136": { + "src/bin/desktop/workflow_inspector_tests.rs": { + "pr136": "36cca640ad182ae9cc16195a2e8a58b110fd731a052047f62794cd004abb0239", + "repair": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d" + }, + "src/recording/workflow.rs": { + "pr136": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "repair": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1" + }, + "src/session/configured.rs": { + "pr136": "4fd4f1783c6508e4a70d34bbb80e51cd5307242db31649188843fe59c7e4a054", + "repair": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4" + } + }, + "unchanged_from_pr136": 137, + "source_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "fdd4bda089f750d0a26a67782a0852347aefcf4ef418bd0b1a2ce308a7491719", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "src/bin/desktop/settings.rs": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "baaff49e09146eb415a1ba7fbe23f9299913fcba6defa971d5acfe3ce839b51d", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/forces.rs": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/projection_step.rs": "155d289224ae852227e222d19134a0fe9678642aca37606d88ac57a4797f00e3", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66", + "src/recording/carrier.rs": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/material.rs": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "src/recording/projection.rs": "22e1a6c10d619ea5e84773b39e6e6eeea9ed6e5b3986ded7fe940ba817b23c24", + "src/recording/projection_tests.rs": "f55313140b5d4cafe747ea25e1877353308cf1f7363613a61a7fbd2fae018338", + "src/recording/provider.rs": "b0791547d98fbebf803f700155f0e825893b6236cbbc7f40fa7dac9146059fc8", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "src/session/projection.rs": "d58dee5e48a2d534ce23729223eba816e16702abf420799594c525f8843ef0dc", + "src/session/projection_tests.rs": "e778e42dd47ca250b5a76064db549306a2fb20eee6254ec3fec4a0ecb1e717e6", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + } + }, + "checkpoint_lineage": [ + { + "commit": "ff51205b7a8c3f8ba7b61bceba34fef85f2b9cba", + "tree": "ab1dfb7e71a613b4d7291aff97bd733f4897dc27" + }, + { + "commit": "9bd2c874ea68114ff26378b986272f4e216cce45", + "tree": "6cf37ffa3ef3e6225ac10fb9dae025afa6d6fe48" + }, + { + "commit": "1c23c886afbaf3c91bf39be37eb45d0765b07bf4", + "tree": "c5605ac5d4b266b312511ce36db19044e5158688" + }, + { + "commit": "9c91acc695f84d2c76f9cb41a58aafad5c776ad6", + "tree": "114ab60ff25f2d637eac1a06a3b02bb99a55bd15" + }, + { + "commit": "70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52", + "tree": "114ab60ff25f2d637eac1a06a3b02bb99a55bd15" + } + ], + "negative_evidence": { + "initial_compile_error": "red-core.log at9bd2c87", + "tests_only_subject": "1c23c886afbaf3c91bf39be37eb45d0765b07bf4", + "core": "red-core-reproduced.log:2 misclassification failures;1 actual numerical failure control passed", + "desktop": "red-desktop.log:1 misclassification failure", + "red_scope": "generation-zero first assertions; no prior-accepted red or retained red executable claim" + }, + "independent_reviews": [ + "architecture_review:PASS", + "persistence_independent:PASS", + "native_ui_independent:PASS; typed-error-helper finding disposed" + ], + "artifacts": [ + { + "path": "/workspace/rheon-g1-cancel-evidence/admission-refusal.log", + "bytes": 406, + "sha256": "c1df4c8bb0c2eb605b803033e3b33a92ced50219d906cd00211b4fc4b408ee86" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/commands.json", + "bytes": 6511, + "sha256": "b8e9ce4f4bff1bae810be104a0ce2f373a50bdd18f90b1bd6e9d519076d22516" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/environment.log", + "bytes": 36, + "sha256": "ecda74ca828b18debf1624cb36209a5b844fb1e1c1905ffb3d51b56cc275f96f" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-clippy-core.log", + "bytes": 106, + "sha256": "afe9cf4bdcea89f64e1a2ae64dcc1735aef97616d2e77ac8f11304bd7bdd9a77" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-clippy-desktop.log", + "bytes": 106, + "sha256": "bfedc3aedee9a8bcdd8f08a857ffbd2038b86c2e9aa553360c8d48c5ecf750d3" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-configured_provider_session_contract-7a47e2a64e933952", + "bytes": 13114504, + "sha256": "0d2d953666b14e7d2dea6bd89149d4c542de209c37693a2b750affb9eb43e0b5" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-pressure_session_contract-536f0b07b486b9ae", + "bytes": 2260680, + "sha256": "bf7fce625d2179aeedc61e78e158ab6c0998cb3962afc06fddb819ccf3784186" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-provider_step_contract-024046052e7e09fc", + "bytes": 9625400, + "sha256": "ea21cc683377a27b5990102a6f963de87ae4c1153d4c9c8275bae41e4da0cf05" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-recording_comparison_contract-b830fe95a847344e", + "bytes": 8274072, + "sha256": "a8ee2ff625363341d8bbfaea1fc6db94e60dc5acd2a086b54761e095ab7bc58a" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-recording_contract-01e8969397d0bfcc", + "bytes": 5607672, + "sha256": "2b3609929d9a8ffa6975e50a1d477021c07116b001dd69b8fdd16317776fd9c0" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-recording_provider_contract-4fd9d23bc6148b03", + "bytes": 11341408, + "sha256": "f005c9fe9d09112ecad2ca32d73c0d5365631ce56bdebd4df2fdd74db17e3c1e" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-recording_provider_runtime_contract-479509e11f8147d8", + "bytes": 6768728, + "sha256": "dd5705e456ef68b619f0d3b65c40355f521083c2ed94f6a3e0dac538b33660ba" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts-solver_provider_contract-4f9ffb3b3a91bb87", + "bytes": 2087376, + "sha256": "ae7a267e8f9f137ae4254f00acc955605098dd00192b4e7f6f1d1714c2605b01" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-contracts.log", + "bytes": 11802, + "sha256": "e05814a506f7b48ee769ecd381e41aa602d69a596bc7db2eadc447020c89fe3d" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-core-lib-rheon-2c0b8f9f964eff45", + "bytes": 47912512, + "sha256": "54c5a6b41386b2c19bb6d77f39043edfaa38e036112526172b7093a036ab1b47" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-core-lib.log", + "bytes": 9636, + "sha256": "425b2bc26c67fff5e6aed5676bac76281cf1a151c12e4c72314ee8f9a24cb65d" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-desktop-rheon_desktop-1f5fbd0763f87c5a", + "bytes": 82742528, + "sha256": "49f6184246c851066cec94f8494a27b6bf61e2be0e84c49d4ff45e4df42a2dfa" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-desktop.log", + "bytes": 2174, + "sha256": "94a3393147e7b3ac363a20cf7dfb91b692929b7c598181ddeec3c6516a479981" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-doctests.log", + "bytes": 538, + "sha256": "8662b5ca2a880f1e27c7b3c2f2d258d5f8c17ba2a9faa393c2879513cd6c4603" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-fmt.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-workflow-rheon-d293312d0455f2e1", + "bytes": 47957968, + "sha256": "ef4d03c330fa09688c3af8c77f44be1b71a21e1d17c26f02e54093d567bc40af" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/green-workflow.log", + "bytes": 2966, + "sha256": "36a919565ee42527223ff38937648d5510a86b44274bf8ff3b2b041856bb21cd" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/lineage.json", + "bytes": 613, + "sha256": "db643976fbdf771a4eaf8901705422c34c2d97313cc4dec18d4da64753f7d180" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/red-core-reproduced.log", + "bytes": 1456, + "sha256": "8ff9322abed3861fcb11e9c2bd6ed1653197d66bcd1eac6c81e78be27082996e" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/red-core.log", + "bytes": 1105, + "sha256": "f1f5652848e39718b2798d7ac7af9ccda2e31107c2cd91e55ba22a28b94c41f6" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/red-desktop.log", + "bytes": 1102, + "sha256": "16f882c5da1d9d750b60275e3493dbd0eca121b26c15537c208b12f36e608fa1" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/run.py", + "bytes": 2487, + "sha256": "68c1541ba4b176c1e779d6c9255fe8df4cddb94c07a292a3c451b883fcb5ddd7" + }, + { + "path": "/workspace/rheon-g1-cancel-evidence/source-map.json", + "bytes": 15523, + "sha256": "aa92dc95c4fafacdff0b8ef8879fbc4a24f44643f943fe84b5427353d9ff6a69" + } + ], + "archive": { + "path": "/workspace/rheon-g1-cancel-evidence.zip", + "bytes": 42886489, + "sha256": "c3f8052c6e98774e36c2faff6660b936ace7f2f1c80b42ec459a5fcb90f6390b", + "members": 28 + }, + "remaining": [ + "lead-owned complete-source admission/native-rational qualification", + "required hosted checks and serial integration/merge disposition", + "parent/lead admission before any recommended C1-B3 implementation" + ], + "not_claimed": [ + "new numerical/physical accuracy", + "full C1-B/C/R", + "stateful/external/learned candidate", + "GPU", + "new native-window run", + "performance" + ], + "independent_artifact_audit": { + "reviewer": "/root/persistence_independent", + "status": "PASS; no blockers", + "audited_pre_audit_manifest_sha256": "9557db8fbbe6a9d268f8fde17ddb25ec356cb6b5065759865da705bfed5ed2e4", + "artifacts_rehashed": 28, + "green_executables_rehashed": 11, + "commands_checked": 8, + "selected_source_pins_checked": 140, + "checkpoint_trees_checked": 5, + "archive_members_checked": 28, + "mismatches": 0, + "admission_files_modified": false + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-next-readiness.md b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-next-readiness.md new file mode 100644 index 00000000..2fe19e48 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-next-readiness.md @@ -0,0 +1,19 @@ +# Next composition milestone — bounded readiness disposition + +Assessment after the G1 advection-cancellation repair at `70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52`, dependent on PR136 `e56bc7b`. This is a scoped recommendation under the existing plan, not another implementation admission or a canonical status change. Repository lead owns that admission, canonical plan/ledger and integration. + +**Next useful composition slice: C1-B3, finite stateless classical producer selection within the existing sealed-MAC pressure/projection subgraph.** B1 already qualifies supplied pressure/faces; B2 supplies actual native invocation, complete Session adoption and additive cold custody. B2's sole `BuiltinNativeV1` choice always uses the same configured native method for producer and fallback. It does not yet establish independently identified alternative subgraph selection. A closed choice using the existing native pressure implementations is the smallest dependency-ready continuation. Reuse these owners and the already selected C1 contracts; no registry, tensor engine, new numerical family or Q2 dependency is required. + +Before implementation, freeze only the new bounded slice: finite stateless producer and distinct fallback identities, exact actual provisional input/shortened interval/generation/witness binding, additive immutable intent/profile and precise write set. Do not reinterpret `BuiltinNativeV1` or pressure v1. Reuse the existing replacement gates, including correct and plausible wrong-dynamics candidates, explicit rejection/failure/cancellation, same-input native fallback, sole Session publication, unchanged accepted state/history and cold provenance. The existing 100-integrated-interval comparison obligation applies per admitted choice; bitwise equivalence applies when comparing the identical algorithm/order. Existing witness thresholds stay fixed. This recommendation adds no learned, arbitrary callback, external or stateful candidate promise; those still require their own prepare/abort/uncertain-commit/replay gates. + +| Gate | Disposition and next owner action | +| --- | --- | +| Local dependency evidence | B1 and closed B2 are locally qualified within their exact scopes; this repair fixes G1 receipt classification. They support a separately frozen B3 development slice. | +| Development authorization | Existing protocols permit stacked development before dependency merges. The parent requested readiness assessment here; this document does not silently start B3 implementation. Parent/lead chooses and admits that next slice. | +| Complete source admission | Pending lead review/qualification of the new closure. This repair retains all 140 selected paths and changes three pins relative to PR136: configured Session, workflow recording tests and native inspector tests. The unchanged checker refuses against the prior 135-path inventory. Relay the repair manifest before any lead pinning; do not refresh admission automatically. | +| Hosted integration/merge | PR133 and PR136 were freshly confirmed open, draft and unmerged during assessment. Required hosted checks and serial merge disposition remain with lead. Local success is not hosted acceptance. | +| Whole family / C1-R | Not accepted or automatically dependency-ready. C1-C still needs a separately frozen whole-state/history/actual-interval/mass/source/momentum/operator candidate boundary and transaction evidence. State type presence and invariant checks do not confer accuracy. | +| New-profile graph consumer | A separate bounded follow-up may add native graph support for B2/B3. B2 currently explicitly refuses that namespace in the desktop graph; typed library cold inspection does not imply GUI support. | +| Particle/transfer/numerics | Typed family separation and explicit transfer operators remain. Particle candidates and transfers are unavailable; numerical repairs proceed independently under their P/Q gates. | + +Independent architecture assessment agrees with this B3 direction. No new design is substituted for the existing [C1 readiness](c1-readiness.md), [B2 protocol](c1b2-protocol.md), [architecture](architecture.md) or [replacement gates](verification.md#replacement-contract-gates). diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-protocol.md b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-protocol.md new file mode 100644 index 00000000..c25176e0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-protocol.md @@ -0,0 +1,16 @@ +# G1 advection cancellation receipt repair — frozen protocol + +Admitted 2026-10-20 by the delegated implementation owner following the parent's explicit repair direction. Base PR136 e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4; fetched main remains 718469beedb9a949f4bb6f3299c7b880b4c47e47. Preserve existing checkpoints, negative evidence and independently owned numerical work. Lead owns integration, canonical status and source admission. + +## Boundary + +Fix only the configured Session's classification of `Step(Carrier(Advection(Cancelled)))` as `AttemptOutcome::Cancelled`. Retain the typed error and existing no-publication behavior. Do not alter numerical formulas, ordering, domains, pressure v1, serialized versions or the meaning of historical receipts. Write set: `src/session/configured.rs` (one classification arm), adjacent actual-receipt tests in `src/recording/workflow.rs`, focused native consumer tests in `src/bin/desktop/workflow_inspector_tests.rs`, and repair-prefixed protocol/qualification/review/manifest/readiness reports here. No product UI changes. Any other production owner requires a new bounded decision. + +## Fixed deciding evidence + +1. Retain tests-only red evidence for both velocity- and tracer-advection cancellation at the actual configured Session checkpoints. Exercise generation zero and a prior accepted generation. Assert the exact nested cancellation error, unchanged accepted state/generation, no publication, correct partial trace, and Cancelled live receipt. +2. Persist real receipts in RCT2 through the existing recorder, drop owners and cold reopen: no invented accepted row; accepted tail and attempt linkage unchanged. Historical explicitly Failed receipts retain Failed; old RCP2/RCP3/RCT1 compatibility remains passing. Include an actual non-cancellation numerical failure control that remains Failed and unpublished. +3. Exercise the native egui receipt consumer for actual live and cold-archive cancellation, retaining existing pointer/keyboard/focus/close-reopen coverage. These headless native tests do not claim a new native-window run. +4. Run focused core workflow/recording and native inspector suites, affected integration/compatibility checks, format and strict all-target Clippy at exact source. Record failures without retuning criteria. Independent architecture/persistence and native consumer review must dispose findings before qualification. + +Publish a focused draft dependent PR. Local results do not satisfy hosted or complete new source-admission gates; relay changed hashes to lead. After qualification, assess the next dependency-ready composition slice using existing C1 contracts without repeating their design or implementing another scope implicitly. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-qualification.md b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-qualification.md new file mode 100644 index 00000000..dd25a2a0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-qualification.md @@ -0,0 +1,37 @@ +# G1 advection cancellation receipt repair qualification + +**Locally qualified** at published source `70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52`, tree `114ab60ff25f2d637eac1a06a3b02bb99a55bd15`, in draft [PR137](https://github.com/MrScripty/Rheon/pull/137), dependent on PR136 `e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4`. Local source checkpoint `9c91acc695f84d2c76f9cb41a58aafad5c776ad6` has the identical tree. Report-only changes after qualification do not change the tested source blobs. Frozen [protocol](g1-advection-cancel-protocol.md), [independent review](g1-advection-cancel-review.md), [manifest](g1-advection-cancel-manifest.json), [next readiness](g1-advection-cancel-next-readiness.md). + +## Result and scope + +The configured Session already returned `Step(Carrier(Advection(Cancelled)))` without committing; the observer incorrectly fell through to `Failed`. The production repair adds three match-arm lines recognizing that exact cancellation. Actual numerical failures remain `Failed`. No numerical formula/order/domain, publication point, pressure-v1 behavior, codec/version or product UI implementation changed. Explicit historical receipt outcomes are not reclassified on decode. + +Actual velocity- and tracer-advection cancellation each run at generation zero and after an accepted interval. Tests check the exact typed error, unchanged dense native state/time/stamps/frame, accepted report/provider/interval metadata and accepted receipt Arc, precise partial trace, no publication, original accepted archive row, real RCT2 close/drop/cold reopen and successful retry on the same owner. Tracer cancellation retains completed pressure/projection evidence; incomplete later stages are absent. Authored historical Failed receipts retain Failed in the cold reader. A real nonzero-forcing native pressure `IterationLimit { iterations: 0 }` control stays Failed and unpublished live and cold. + +Native egui tests consume actual velocity/tracer cancellations and the actual pressure failure, both live and through the explicit cold terminal action. Existing pointer, keyboard, focus, evidence, cancellation and close/reopen interaction regressions remain passing. This is headless native consumer evidence, not a new native-window or performance run. + +## Exact-source checks + +Rust 1.92.0, locked dependencies, binary debug info disabled; environment and exact commands/executable hashes are retained in the manifest/raw bundle. All green checks below ran with the exact compiled source at `70da36d`; report-only artifacts do not alter those source blobs. + +| Check | Result | +| --- | --- | +| Default library `workflow::` | 26 passed, 0 failed | +| No-default complete library | 85 passed, 0 failed | +| Eight affected configured Session/provider/recording/runtime/comparison contract targets | 99 passed, 0 failed, 3 existing opt-in ignored | +| No-default borrow doctests | 3 passed, 0 failed | +| Native desktop workflow inspector | 13 passed, 0 failed, 2 existing opt-in ignored | +| Strict no-default and desktop all-target Clippy | Both passed | +| Formatting | Passed | + +Total: **226 passing test executions, zero failures, five existing ignored**; counts include deliberate default/no-default overlap and are not distinct-test counts. Four new test functions are included. These checks cover old RCP2/RCP3/RCT1 and existing RCP4/RCT2 behavior, plus the existing additive projection profile compatibility/refusal tests. Broader unrelated scientific campaigns were not rerun or newly qualified. + +Retained negative evidence: initial tests-only `9bd2c87` had an Arc type compile error (corrected without production edits); completed tests-only `1c23c88` is identified by its full local commit in the manifest. Its core run reproduced two Failed-versus-Cancelled assertions, one for each actual advection stage, while the actual numerical failure control passed. The native consumer likewise reproduced the Failed-versus-Cancelled assertion. Those red runs stop at the first generation-zero assertion; prior-accepted and full cold matrices are green evidence, not claimed red execution. Red executable copies were not retained; red source checkpoints and logs are retained. All green executable copies are retained where Cargo exposes the executable path. + +## Review and integration disposition + +Independent architecture, persistence/contracts and native-consumer reviews pass at the exact source. The native reviewer requested retaining the UI helper's typed error and original result assertion; both were fixed before final-source qualification. All findings are disposed. + +The unchanged source-admission checker still exits 1: `reviewed native source inventory added or missing path`. This is the existing pending new complete-source admission, not a numerical comparison failure. Working, committed and manifest-selected closures independently agree on 140 paths. Relative to PR136 this repair changes only three existing pins (configured Session, workflow recording tests, native inspector tests), with 137 unchanged and no added/removed selected paths. The full read-only map and exact delta are in the manifest. No admission input was modified. Lead must review/pin/qualify the final closure and complete required hosted checks before integration or merge. PR133/136 remained draft and unmerged at assessment. No merge, force update, rebase or branch cleanup was performed. + +Raw evidence: `/workspace/rheon-g1-cancel-evidence`; immutable ZIP and hashes are recorded in the manifest. Historical PR136 evidence and all protected branches/checkpoints remain retained. No physical accuracy, GPU, learned/stateful/external candidate, full C1-B/C/R, native-window or performance acceptance is inferred. The next recommendation is a separately admitted finite stateless classical projection selection slice, as recorded in the readiness disposition. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-review.md b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-review.md new file mode 100644 index 00000000..e46e5fa4 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-review.md @@ -0,0 +1,13 @@ +# Independent G1 cancellation repair review + +Reviewed subject: `70da36d0f4a58c464a6ad32ed2557e3dfb3d8b52`, tree `114ab60ff25f2d637eac1a06a3b02bb99a55bd15`. All reviewers were read-only and ran no duplicate Cargo builds. Root authored source/tests and owned deciding executions. Frozen protocol `ff51205` was approved before the production edit. + +| Independent role | Disposition | +| --- | --- | +| `/root/architecture_review` — architecture/contracts | PASS. Exact three-line cancellation matcher; no numerical/order/publication/codec change. Real two-stage/generation matrix preserves accepted state, receipt and partial trace; no publication, cold custody, retry and numerical failure distinction covered. Red evidence is scoped to actually executed generation-zero assertions. Recommends bounded classical C1-B3 selection, with distinct admission/hosted gates. | +| `/root/persistence_independent` — persistence/contracts | PASS. No persisted version or validator reinterpretation. Actual RCT2 cold inspection retains exact attempt/generation and prior row; authored historical Failed stays Failed; real numerical failure remains Failed. Reviewed 26 workflow and 13 inspector passes. | +| `/root/native_ui_independent` — native consumer | PASS. Actual live receipts and cold RCT2 explicit terminal action use existing consumer correctly; no UI implementation change. Finding: initial helper discarded typed result, weakening actual-failure provenance. Disposed before final source: return actual typed error, restore original wrapper assertion and assert exact cancellation/IterationLimit in the new cases. Reviewed completed 13-pass/2-existing-ignore native suite and 26-pass workflow suite. | + +The root's later complete compatibility/strict results remain bound to the same exact source; the manifest records them. Reviews do not confer hosted, complete-source admission, physical, GPU, performance or new native-window acceptance. No unresolved source finding remains. + +Final independent execution/artifact audit by `/root/persistence_independent`: PASS, no blockers. Rehashed all 28 artifacts and 11 retained green executables; eight deciding command logs total 226/0/5. All 140 pins match the committed source, worktree and fresh read-only selector; exactly three changes relative to PR136, 137 unchanged, no added/removed paths. All five checkpoint trees match; admission inputs are unchanged. All 28 ZIP members byte-match retained originals; 42,886,489 bytes, SHA256 `c3f8052c6e98774e36c2faff6660b936ace7f2f1c80b42ec459a5fcb90f6390b`. The manifest records the audited pre-audit manifest hash; adding this disposition changes report metadata only. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-contract.md b/docs/plans/fluid-accuracy-composition/reports/g1-contract.md new file mode 100644 index 00000000..581b2665 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-contract.md @@ -0,0 +1,13 @@ +# G1 workflow custody and native inspection contract + +The numerical composition owner emits a finite sealed, constant-density MAC descriptor. It describes the existing stage order, operator, SI units, layouts, geometry, pressure settings, viscosity disabled versus applied zero, data dependencies, pressure iteration loop, fallback and accepted time loop. It is not an executable graph. Family/state conversion and graph editing remain unavailable. + +Each actual attempt binds run/attempt/accepted-input/attempted-generation identity, exact native input state and actual request-control digests, requested/actual interval, descriptor digest, observed provider support/prediction/qualification/fallback facts, actual combined residual threshold, pressure-call timing scope, corrected divergence, legal completed-node prefix and optional publication. Failed/cancelled attempts cannot claim publication. Candidate/accepted metrics require their actual numerical boundary. Parameters and declared recipe provenance remain distinct from observed execution and physical accuracy. + +`src/recording/workflow.rs` owns additive `RCP4:` accepted controls and `RCT2:` terminal details inside the existing SQLite v1 envelope. They wrap the original bounded RCP2/RCP3 or RCT1 binary payload, without double-hex expansion, plus source binding and validated workflow facts. Existing RSC1/configured profile, old encoders/readers, field custody, resource limits and uncertain-write rules retain their meanings. A recording failure after physics commit is an explicit accepted tail, never rollback. Descriptor/summary limits and the existing 16 KiB metadata cap apply before publication. + +Readers validate exact source/descriptor/interval/provider/publication association, legal node/status prefixes, increasing retained attempt IDs, immediate prior native-state digest where available and runtime-outcome consistency. Configured archive inspection also compares actual control digests against reconstructed frozen intent. Missing old workflow evidence is unavailable; corrupt/cross-linked/unknown versions are typed errors. Terminal inspection works at generation zero without an accepted row or model process. + +The existing Inspector owns exact selected disk records and caches the validated attempt during selection (at most current and immediately previous rows). The workflow view consumes the immutable cached projection. Explicit terminal loading/auditing performs archive I/O; canvas paint does not open files or start models. Pointer, keyboard, focus, text equivalent, readable zoom, pan/reset, evidence, cancel/close/reopen and stale-source behavior are qualified separately by the native procedure in [g1-protocol.md](g1-protocol.md). Old material/carrier/generic-field inspection remains available. + +Contract classes: coordinated in-process Rust types; versioned persisted profiles. No external pressure-v1 protocol, numerical formula, stage order or supported physical domain changes. Architecture remains Session/numerical owners → recording owner → cached native view; no second recorder, process supervisor, registry or solver state is introduced. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-iteration-manifest.json b/docs/plans/fluid-accuracy-composition/reports/g1-iteration-manifest.json new file mode 100644 index 00000000..a3aadec2 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-iteration-manifest.json @@ -0,0 +1,219 @@ +{ + "schema": "rheon-g1-iteration-qualification-v1", + "scope": "iteration evidence validator only; educational source admission assigned separately to lead", + "base_commit": "43a084a66bdfb3731b24bd480909c81e317b1e53", + "red_source_commit": "fe1110cc23050ced5d1a6098d843fc339487165e", + "qualified_source_commit": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "qualified_tree": "5c494bdcb8f1921461aed0daaa5ad8b07f914d7c", + "source_files": [ + { + "path": "/workspace/Rheon/src/workflow.rs", + "bytes": 30244, + "sha256": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9" + }, + { + "path": "/workspace/Rheon/src/recording/workflow.rs", + "bytes": 69999, + "sha256": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34" + } + ], + "toolchain": { + "rustc": "1.92.0 (ded5c06cf 2025-12-08)", + "cargo": "1.92.0 (344c4567c 2025-10-21)", + "host": "x86_64-unknown-linux-gnu" + }, + "environment": { + "RUSTUP_HOME": "/tmp/rheon-rustup", + "CARGO_HOME": "/tmp/rheon-cargo", + "PATH_prefix": "/tmp/rheon-cargo/bin", + "CARGO_PROFILE_TEST_DEBUG": "0", + "CARGO_PROFILE_DEV_DEBUG": "0", + "core_CARGO_TARGET_DIR": "/workspace/rheon-core-target", + "desktop_CARGO_TARGET_DIR": "/tmp/rheon-target" + }, + "logs": [ + { + "path": "/workspace/rheon-g1-repair-evidence/admission-baseline.log", + "bytes": 406, + "sha256": "c1df4c8bb0c2eb605b803033e3b33a92ced50219d906cd00211b4fc4b408ee86", + "source_commit": "43a084a66bdfb3731b24bd480909c81e317b1e53", + "command": "python3 docs/education/check_native_admission.py", + "exit_code": 1, + "test_results": [] + }, + { + "path": "/workspace/rheon-g1-repair-evidence/iteration-baseline-red.log", + "bytes": 2916, + "sha256": "b783811af660352e790f6a93c1843e3a0d167b9938a49f5ae59aaa272667386a", + "source_commit": "fe1110cc23050ced5d1a6098d843fc339487165e", + "command": "cargo test --locked --no-default-features --lib iteration_limits_ -- --nocapture", + "exit_code": 101, + "test_results": [ + "test result: FAILED. 2 passed; 6 failed; 0 ignored; 0 measured; 60 filtered out; finished in 0.01s" + ] + }, + { + "path": "/workspace/rheon-g1-repair-evidence/workflow-core-green.log", + "bytes": 2693, + "sha256": "341483fa96930ebe765a568c004194f6243cb91a9af237bc0e827db09d11f17c", + "source_commit": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "command": "cargo test --locked --no-default-features --lib workflow:: -- --nocapture", + "exit_code": 0, + "test_results": [ + "test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 45 filtered out; finished in 0.05s" + ] + }, + { + "path": "/workspace/rheon-g1-repair-evidence/workflow-default-green.log", + "bytes": 2694, + "sha256": "6c48005449e72c51e16a9045e984bf853f3fa828a25a6d7c1de1c474c321a2ac", + "source_commit": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "command": "cargo test --locked --lib workflow:: -- --nocapture", + "exit_code": 0, + "test_results": [ + "test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 45 filtered out; finished in 0.05s" + ] + }, + { + "path": "/workspace/rheon-g1-repair-evidence/contracts-core-green.log", + "bytes": 8599, + "sha256": "159d8834c0ca8029236ad22267a05243cc465942360bf45dd4cec404d26ceb36", + "source_commit": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "command": "cargo test --locked --no-default-features --test recording_contract --test recording_provider_contract --test recording_provider_runtime_contract --test configured_provider_session_contract --test provider_step_contract --test solver_provider_contract --test pressure_session_contract", + "exit_code": 0, + "test_results": [ + "test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.19s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.07s", + "test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s", + "test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.29s", + "test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.07s", + "test result: ok. 5 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s" + ] + }, + { + "path": "/workspace/rheon-g1-repair-evidence/inspector-desktop-green.log", + "bytes": 8435, + "sha256": "d552c5b5d30b8db4c8ff4e0b62aff2857ad8038a922993548bcde030f88e3657", + "source_commit": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "command": "cargo test --locked --features desktop --bin rheon-desktop workflow_inspector::tests::", + "exit_code": 0, + "test_results": [ + "test result: ok. 11 passed; 0 failed; 2 ignored; 0 measured; 152 filtered out; finished in 6.26s" + ] + }, + { + "path": "/workspace/rheon-g1-repair-evidence/clippy-core-green.log", + "bytes": 105, + "sha256": "0b88459e59fcdc4a0ba600ff617c522be59fb7226501c2897ecbe95f460c93c3", + "source_commit": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "command": "cargo clippy --locked --no-default-features --all-targets -- -D warnings", + "exit_code": 0, + "test_results": [] + }, + { + "path": "/workspace/rheon-g1-repair-evidence/clippy-desktop-green.log", + "bytes": 106, + "sha256": "664f67070650f59e70f45a4649055087b956eac218b2fe203ebf6d7ae490ebd1", + "source_commit": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "command": "cargo clippy --locked --features desktop --all-targets -- -D warnings", + "exit_code": 0, + "test_results": [] + }, + { + "path": "/workspace/rheon-g1-repair-evidence/fmt-green.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "source_commit": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "command": "cargo fmt --all -- --check", + "exit_code": 0, + "test_results": [] + } + ], + "green_test_executables": { + "/workspace/rheon-core-target/debug/deps/rheon-2c0b8f9f964eff45": { + "sha256": "c8d994f167e21f4bb76d2bffbb627ccd5c06e2a5535329b114290093c20dac98", + "bytes": 26124832, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/c8d994f167e21f4bb76d2bffbb627ccd5c06e2a5535329b114290093c20dac98-rheon-2c0b8f9f964eff45" + }, + "/workspace/rheon-core-target/debug/deps/rheon-d293312d0455f2e1": { + "sha256": "e240da7371899470cc6ec994d8bdecd5030f325f1a04f63ecdab50b13df7b390", + "bytes": 26170168, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/e240da7371899470cc6ec994d8bdecd5030f325f1a04f63ecdab50b13df7b390-rheon-d293312d0455f2e1" + }, + "/workspace/rheon-core-target/debug/deps/configured_provider_session_contract-7a47e2a64e933952": { + "sha256": "4ac9cd90b0b8272de69e2f217eb664e30f3380cafabf75c537d6fb5a12eb7fd7", + "bytes": 9858960, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/4ac9cd90b0b8272de69e2f217eb664e30f3380cafabf75c537d6fb5a12eb7fd7-configured_provider_session_contract-7a47e2a64e933952" + }, + "/workspace/rheon-core-target/debug/deps/pressure_session_contract-536f0b07b486b9ae": { + "sha256": "cc22ed704bdb7a80909a0ac908d8a18d8660ac057d71b30756b27c3d427a2888", + "bytes": 2256840, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/cc22ed704bdb7a80909a0ac908d8a18d8660ac057d71b30756b27c3d427a2888-pressure_session_contract-536f0b07b486b9ae" + }, + "/workspace/rheon-core-target/debug/deps/provider_step_contract-024046052e7e09fc": { + "sha256": "b23b1869aa0b8af615f7ca8fecec3f77cd2887f7d3df783409068715206fa64b", + "bytes": 7304136, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/b23b1869aa0b8af615f7ca8fecec3f77cd2887f7d3df783409068715206fa64b-provider_step_contract-024046052e7e09fc" + }, + "/workspace/rheon-core-target/debug/deps/recording_contract-01e8969397d0bfcc": { + "sha256": "17f12b8a34118b2d90f06a3db6832b1891c196713b484881780f02fac5a55547", + "bytes": 5603920, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/17f12b8a34118b2d90f06a3db6832b1891c196713b484881780f02fac5a55547-recording_contract-01e8969397d0bfcc" + }, + "/workspace/rheon-core-target/debug/deps/recording_provider_contract-4fd9d23bc6148b03": { + "sha256": "a63d72830c4aea5bf977c2392bfd2b34452d983d3876b1dce626c952b4343689", + "bytes": 9488456, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/a63d72830c4aea5bf977c2392bfd2b34452d983d3876b1dce626c952b4343689-recording_provider_contract-4fd9d23bc6148b03" + }, + "/workspace/rheon-core-target/debug/deps/recording_provider_runtime_contract-479509e11f8147d8": { + "sha256": "6bba91ca2fb7f3f62d6093ad6f6f87d68d848f611bf760aa3bc6fd31e2eefe21", + "bytes": 6317280, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/6bba91ca2fb7f3f62d6093ad6f6f87d68d848f611bf760aa3bc6fd31e2eefe21-recording_provider_runtime_contract-479509e11f8147d8" + }, + "/workspace/rheon-core-target/debug/deps/solver_provider_contract-4f9ffb3b3a91bb87": { + "sha256": "033cb194e6a5d0756288edbba9a45b5cdfbac4050c845c237a88e00bf57fcef9", + "bytes": 2083560, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/033cb194e6a5d0756288edbba9a45b5cdfbac4050c845c237a88e00bf57fcef9-solver_provider_contract-4f9ffb3b3a91bb87" + }, + "/tmp/rheon-target/debug/deps/rheon_desktop-1f5fbd0763f87c5a": { + "sha256": "b785c9098d02407df5393dcf681ec4d419b165af6d84302cfb31eef8f7b7946a", + "bytes": 63895080, + "retained_path": "/workspace/rheon-g1-repair-evidence/green-test-executables/b785c9098d02407df5393dcf681ec4d419b165af6d84302cfb31eef8f7b7946a-rheon_desktop-1f5fbd0763f87c5a" + } + }, + "red_executable_retained": false, + "read_only_source_closure_discovery": { + "path": "/workspace/rheon-g1-repair-evidence/source-closure-before.json", + "bytes": 15413, + "sha256": "62fd6c523956f182a181ee7129357a9f769f90a30b147b734d65fa76171994b3" + }, + "green_summary": { + "passed_test_executions": 135, + "failed": 0, + "ignored_existing_opt_in": 5, + "workflow_feature_configurations": 2, + "new_iteration_tests_per_configuration": 8 + }, + "independent_reviews": { + "architecture": "PASS /root/architecture_review at qualified_source_commit", + "persistence": "PASS /root/persistence_independent at qualified_source_commit", + "native_consumer": "APPROVE /root/native_ui_independent at qualified_source_commit" + }, + "not_claimed": [ + "new educational source admission", + "new native window execution", + "new performance qualification", + "physical validation", + "GPU execution", + "learned provider qualification", + "hosted CI", + "merge approval" + ], + "remaining_owners": { + "educational_complete_source_admission": "repository lead", + "canonical_plan_and_ledger": "repository lead", + "integration_and_merges": "repository lead", + "C1-B2": "on hold; no production changes" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-iteration-qualification.md b/docs/plans/fluid-accuracy-composition/reports/g1-iteration-qualification.md new file mode 100644 index 00000000..cc2aa8dc --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-iteration-qualification.md @@ -0,0 +1,47 @@ +# G1 iteration evidence consistency qualification + +The bounded iteration repair passes at published source **34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2**, tree **5c494bdcb8f1921461aed0daaa5ad8b07f914d7c**. This is an evidence-validator repair, not a new numerical, graphical-window, performance or educational-source admission qualification. The lead owns educational admission and integration. C1-B2 remains on hold with no production implementation in this branch. + +## Authority and frozen subjects + +Parent direction prioritized the source-derived PR129 findings at5ccc77403a674d43925f09ff3eaf42f343f3c7fe. The [protocol and subsequent authority amendment](g1-admission-iteration-protocol.md) were committed before regression evaluation and implementation. Its amendment assigns all educational inventory/routing/qualification changes separately to the lead. This repair edits only src/workflow.rs, inline tests in src/recording/workflow.rs, and these bounded reports. No canonical plan/ledger, formula, operator, stage order, domain, provider implementation, old-profile codec or UI implementation changes. + +Retained base is PR128 head43a084a66bdfb3731b24bd480909c81e317b1e53, dependent on PR125/122/120. Audit119, pressurewarmstart59, historical protocols and evidence remain intact. No merge, rebase, force update or branch cleanup was performed. + +Protocol publication:3476a5bca0719d5c7536b25ee39d32a769f9ddee; authority amendment:89aaefe26e343bd3c0ac8d2d99114f434bdd2e2f. Tests-only red subject:fe1110cc23050ced5d1a6098d843fc339487165e. Guard/green subject:34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2. Git HTTPS credential loss prevented normal push; the authorized GitHub API published byte-identical local trees through sequential commits and non-forced expected-head updates. Public fetch then provided the exact published source for evaluation. Local predecessor/checkpoint branches remain retained. This was a credential failure, not an approval denial. + +## Reproduction and repair + +On the committed tests-only subject, `cargo test --locked --no-default-features --lib iteration_limits_ -- --nocapture` exited101: **6 expected failures, 2 passes, 0 ignored**. Three malformed counts passed standalone WorkflowAttempt validation; the corresponding three cold SQLite RCT2 cases also passed. Each failing test stopped on its first non-cancelled case; the red run does not establish execution of its later cancellation/failed-later cases. + +Both controls already passed before repair. A real configured Session with cap0 accepted a zero-iteration candidate. Coherent forged RCP4 inner and outer counts were already rejected by the unchanged RCP2 inner receipt gate: native excess count by `configured accepted pressure gates`, candidate nonzero count by `configured candidate diagnostics`. There was no demonstrated fully decoded RCP4 bypass. The reproduced gap was standalone workflow and detached cold terminal/accepted-tail evidence. + +The 11-line guard in WorkflowAttempt::validate_nodes applies to every observed completed pressure report after legal stage-prefix validation. Candidate diagnostics always require iterations0; accepted native pressure requires iterations<=the frozen descriptor cap; accepted configured candidates require iterations0. Native selection comes from the validated actual NativeFallback selection event. Missing reports in genuine partial prefixes remain admissible. No blanket positive-cap rule was added. + +Fixtures begin with otherwise-valid actual observed configured Session traces for native, rejected-candidate/native-fallback and accepted-candidate execution. Negative values are fixed: native cap+1, rejected candidate1, or matching accepted-candidate/candidate1. Cold fixtures encode a valid trace and patch only the stored iteration u64 fields before closing/reopening SQLite, independently reaching decoder validation. Accepted-tail storage-failure metadata is authored test evidence, not an injected storage I/O failure. Cancellation executes the actual BeforeCommit checkpoint. The standalone Failed variant is an authored failed-later validation trace, not a reproduced numerical failure. + +Green execution reaches all variants: accepted and cancelled traces, authored failed-later validation, cold accepted unrecorded tails and cancelled terminals. Boundary controls retain native count==cap, a real cap0/candidate0 Session and rejected NaN/+Inf/-Inf diagnostics with count0, including bit-preserving encode/decode. Existing RCP2/RCP3 roundtrips and RCT1 unavailable behavior remain covered. + +## Verification + +All green commands ran on a clean exact published34e2e73 source before report additions, Rust1.92.0/Cargo1.92.0, x86_64-unknown-linux-gnu. Environment: PATH=/tmp/rheon-cargo/bin:$PATH, RUSTUP_HOME=/tmp/rheon-rustup, CARGO_HOME=/tmp/rheon-cargo, CARGO_PROFILE_TEST_DEBUG=0 and CARGO_PROFILE_DEV_DEBUG=0. Core CARGO_TARGET_DIR=/workspace/rheon-core-target; desktop CARGO_TARGET_DIR=/tmp/rheon-target. + +| Command | Observed result | +| --- | --- | +| cargo test --locked --no-default-features --lib workflow:: -- --nocapture | 23 passed,0 failed,0 ignored | +| cargo test --locked --lib workflow:: -- --nocapture | 23 passed,0 failed,0 ignored | +| cargo test --locked --no-default-features --test recording_contract --test recording_provider_contract --test recording_provider_runtime_contract --test configured_provider_session_contract --test provider_step_contract --test solver_provider_contract --test pressure_session_contract | 78 passed,0 failed,3 existing opt-in ignored across7 binaries | +| cargo test --locked --features desktop --bin rheon-desktop workflow_inspector::tests:: | 11 passed,0 failed,2 existing opt-in ignored | +| cargo clippy --locked --no-default-features --all-targets -- -D warnings | exit0 | +| cargo clippy --locked --features desktop --all-targets -- -D warnings | exit0 | +| cargo fmt --all -- --check | exit0 | + +Total green test executions:135 passed,0 failed,5 ignored; the two feature configurations execute the same23 workflow tests. Ignored contracts require explicitly supplied real learned-artifact exports; ignored inspector fixtures are explicit native-smoke preparation and release capture/performance. They were not executed or counted as passed. Existing normal-window G1 and overhead evidence remain bound to their historical source, not this repair. + +The [manifest](g1-iteration-manifest.json) records source, logs and10 green test-executable hashes. Raw evidence remains at /workspace/rheon-g1-repair-evidence. All10 green executables are also retained under its green-test-executables directory, outside mutable Cargo targets, with verified hashes and manifest paths. The red executable was subsequently overwritten in the target directory and was not separately retained; its exact source commit and complete failed output are retained. No red executable hash is inferred from a green executable at the same path. + +## Independent disposition and limits + +Independent architecture, persistence/contracts and native-consumer reviewers all approved exact34e2e73; see [review record](g1-iteration-review.md). Reviewers made no edits or duplicate builds. Native consumer review verified typed errors reach publication, terminal and comparison loaders; the inspector clears stale evidence/gesture state and presents unavailable/error states. + +The unchanged educational admission preflight on base43a084a refused `reviewed native source inventory added or missing path`. Complete read-only discovery selected135 paths,11 added/16 changed/108 unchanged/0 removed against the old v3 inventory. That failure and discovery are retained, without modifying admission files. The lead must qualify its actual complete integration closure. This branch cannot transfer historical educational, native-window, performance, physical, GPU or learned-provider acceptance to new source. Hosted CI and merge disposition remain with the lead. No unilateral merge or cleanup. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-iteration-review.md b/docs/plans/fluid-accuracy-composition/reports/g1-iteration-review.md new file mode 100644 index 00000000..89f224f1 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-iteration-review.md @@ -0,0 +1,23 @@ +# Independent review: G1 iteration evidence consistency + +Reviewed subject:34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2; tree5c494bdcb8f1921461aed0daaa5ad8b07f914d7c. Reviews concern this bounded validator repair. Educational source admission is separately assigned to the repository lead. + +## Architecture reviewer /root/architecture_review: PASS + +The guard follows legal prefix/order validation and derives native acceptance from the actual validated NativeFallback Selected event. Candidate reports require iterations0; native accepted reports permit iterations<=frozen cap inclusively; non-native accepted candidate reports require iterations0 regardless of overall Accepted/Cancelled/Failed. Genuine partial prefixes may still omit reports. Existing guards reject fabricated placement/selection. Cap0/candidate0 and rejected IEEE diagnostic values remain admissible. Production diff is exactly11 validator lines, with tests in the other authorized Rust file. No codec, formula, order, domain or source-admission edits. Reviewer read the complete23-test green log including all8 new tests; no reviewer builds/edits. + +## Persistence/contracts reviewer /root/persistence_independent: PASS + +Verified exact source SHA256s and published tree. The ordered execution-prefix rules prevent a configured accepted trace from forging the native branch. Cold negative fixtures bypass outbound validation only to corrupt stored iteration fields, then independently reach decoder refusal. Legacy provider/runtime codecs and numerical owners are unchanged. The retained red run accurately distinguishes the standalone/RCT2 gap from already-refused coherent RCP4 evidence. The completed23-test green log covers all8 iteration controls, the real cap0 candidate, RCP2/RCP3 compatibility, RCT1 unavailable behavior and RCT2 cold negatives/accepted tails. No reviewer builds/edits. + +## Native-consumer reviewer /root/native_ui_independent: APPROVE + +Reviewed publication get_attempt->selection, terminal get_attempt->typed Invalid->explicit terminal unavailable, and comparison exact-side load->typed source error->page failure/workflow unavailable. set_attempt validates independently and clears cached graph/evidence/pan gesture on refusal. The guard introduces no clamping/defaulting/reinterpretation. Native count==cap, candidate0 and legacy unavailable routes remain intact. UI source is unchanged. No issues, edits, builds or fresh GUI qualification claims. + +## Author and coordinator + +/root/persistence_review authored the inline regression fixtures and guard; /root coordinated publication and all builds/tests. Neither is counted as an independent reviewer for this repair. Source review approvals preceded final supporting contract/desktop checks; the coordinator subsequently observed all checks in the qualification table exit0. The [manifest](g1-iteration-manifest.json) binds the final supporting results. + +Both independent architecture and persistence reviewers subsequently approved the final reports and manifest. Each independently rehashed9logs,10green test executables,2source files and the read-only closure artifact with0mismatches, verified the source against34e2e73/tree5c494bdc and recomputed135green passes,0failures,5ignored. Both confirmed the red6failures/2controls, already-refused coherent RCP4 control, authored-failure distinctions and explicit historical/source-admission claim limits. The coordinator then retained copies of all10green executables outside Cargo targets with identical hashes; retained paths are included in the manifest. + +Historical failed results and protocols remain retained. This review does not resolve complete educational source admission or authorize a merge, cleanup or C1-B2 expansion. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-manifest.json b/docs/plans/fluid-accuracy-composition/reports/g1-manifest.json new file mode 100644 index 00000000..62a09901 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-manifest.json @@ -0,0 +1,193 @@ +{ + "version": 1, + "scope": "G1 existing configured sealed-MAC workflow inspection and custody", + "claims": { + "G1-C": "accepted for recorded CPU/archive contracts", + "G1-U": "accepted for recorded native software-display workflow", + "performance": "accepted for fixed capture plus validated cached projection workload", + "C1-R": "not implemented; C1-A prepared/dependency-ready", + "physical_or_GPU_or_learned_accuracy": "not claimed", + "release_or_hermetic_artifact": "not claimed" + }, + "implementation": { + "commit": "f6b7c8cd4628f6939c41567cecdf4a5231f60386", + "tree": "50a4abfae98b26c0b28474dcd19609252bb046ae", + "source_inventory": { + "path": "/workspace/rheon-g1-evidence/source-material-f6b7c8c.json", + "bytes": 21979, + "sha256": "6347d65cb3508eba8a0184e6ac2546141d148d80bee35badaa9fc9e663646e85" + }, + "source_revision_environment": "f6b7c8cd4628f6939c41567cecdf4a5231f60386", + "build_material_environment": null, + "subsequent_acceptance_changes": "documentation only" + }, + "binaries": { + "native": { + "path": "/workspace/rheon-g1-evidence/bin/rheon-desktop-f6b7c8c", + "bytes": 272686560, + "sha256": "0e0d284145ced8cbaeb141be58ee2a1aa30034c8db0f54a37a672968608f90e2" + }, + "release_test": { + "path": "/workspace/rheon-g1-evidence/bin/rheon-desktop-release-tests-f6b7c8c", + "bytes": 24153104, + "sha256": "542b872ebbbe9ebfd73897920ce5b52c0ff1fe35a891cd43fdfdad02542cdee6" + }, + "native_fixture_generator_sha256": "4b540640d93dd0f41dfdff5de9f473b95b3fe0dce07a1d1a356f6cd6d5c8090d" + }, + "native": { + "environment": "isolated dummy Xorg :91;1600x1000x24;software GLX/llvmpipe;evdev/us;XTEST", + "observations": { + "path": "/workspace/rheon-g1-evidence/native/final-f6b7c8c-evdev/final-acceptance-run.json", + "bytes": 12854, + "sha256": "6f19eabd8b1177e571a7de9a3f78eccc0bb8a07e7c4169350790905fc5ba3d99" + }, + "retained_artifact_index": { + "path": "/workspace/rheon-g1-evidence/native/final-f6b7c8c-evdev-index.json", + "bytes": 10562, + "sha256": "8d712f79a175def1b45d81f46b826d055b5cf85e0def01b6b76608d3e9795d7e" + }, + "actual_archives_index": { + "path": "/workspace/rheon-g1-evidence/native/rheon-native-final-g-recordings-index.json", + "bytes": 2885, + "sha256": "a3da6fac32d1c837c0ca5a92f4a97df35ff9f571f384dd1890c99348534caefe" + }, + "fixture_index": { + "path": "/workspace/rheon-g1-evidence/native/rheon-native-workflow-20261020g-index.json", + "bytes": 2206, + "sha256": "e8d669146453683cfbaa7daab866bf06295d6734c91ded289fdfedfdd5786cb9" + }, + "selected_run_ordinal": [ + 4, + 2 + ], + "archive_sha256": "99835798215557b8cbe85399b075fb9789124a6d887015ecfd1d55e12a970a70", + "selected_controls_sha256": "9716f406a0170248c61c0185f2ec3a5c05ca67cf3b087c4c79cc6b382c469a70", + "live_cold_identical": true, + "cancelled_run_attempt_last_accepted": [ + 6, + 12, + 11 + ], + "cancelled_publication": null, + "driver_App_display_exit_codes": 0, + "cleanup": "independently checked; no remaining Python/native App/owned display; no individual provider PID was sampled", + "archive_path_mapping": { + "/tmp/rheon-native-final-g-session/.generated/recordings": "/workspace/rheon-g1-evidence/native/rheon-native-final-g-recordings" + } + }, + "performance": { + "protocol": "docs/plans/fluid-accuracy-composition/reports/g1-protocol.md", + "n_warmup": 5, + "n_pairs": 30, + "limit_median_fraction": 0.05, + "measured_median_fraction": 0.018808600471844183, + "raw_log": { + "path": "/workspace/rheon-g1-evidence/performance-f6b7c8c.log", + "bytes": 1080, + "sha256": "ddef3f204e78bb43b104e71e059d0b55c04b52e8c5f8edbab579be3689ff8a16" + }, + "summary": { + "path": "/workspace/rheon-g1-evidence/performance-f6b7c8c-summary.json", + "bytes": 800, + "sha256": "34e16ad1f0fd2e45662659bf265825ba8abdac8407beed24927d7e2a6af67104" + }, + "build_log": { + "path": "/workspace/rheon-g1-evidence/release-build-f6b7c8c.log", + "bytes": 234, + "sha256": "3d34e93e39e5a91a52420ea5905f7dc19da80360b7bb5874e60ff37d83fc137c" + }, + "environment": { + "path": "/workspace/rheon-g1-evidence/environment.json", + "bytes": 1120, + "sha256": "09b3b48d55862d14b255a6899df7ec3bb1c5e6bb698d59bd34062942060ce3cc" + }, + "scope": "actual numerical capture plus validated set_attempt cache adoption; excludes disk, layout, paint, rasterization, models and other configurations", + "independent_disposition": "pass; variability/order do not obscure margin" + }, + "verification": { + "broad_CPU": { + "passed": 597, + "failed": 0, + "ignored": 4, + "suites": 74, + "log": { + "path": "/workspace/rheon-g1-evidence/core-tests.log", + "bytes": 69395, + "sha256": "d9be2849912216ea1dcdb9ad525ba5fa3cbabe809db347625a7ff5384208353f" + } + }, + "workflow_core_persistence": { + "passed": 15, + "failed": 0, + "ignored": 0, + "log": { + "path": "/workspace/rheon-g1-evidence/workflow-contracts-final.log", + "bytes": 3631, + "sha256": "6eb37ef087590a3d70ad84a048f1bd40f6cf64f38646e919e43cfbdbe65cedda" + } + }, + "focused_UI": { + "passed": 11, + "failed": 0, + "ignored_opt_in": 2, + "log": { + "path": "/workspace/rheon-g1-evidence/native/final-3a86991-evdev/pointer-pan-fixed-disposal.log", + "bytes": 1959, + "sha256": "5f6f20c4cc132a434c7cf69ff7c4061e9ae9ef6d7eacb51fa4efe8836a19b8ed" + }, + "tested_UI_sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "tested_tests_sha256": "577bc23f06a8cd794b16d42cd347a024d627443f3d1cf5d4a6230b21c76a24e2", + "binding": "tested source bytes match f6b7c8c; log retained before checkpoint" + }, + "legacy_comparison": { + "path": "/workspace/rheon-g1-evidence/legacy-comparison-workflow.log", + "bytes": 451, + "sha256": "f25246ba15cc4de835d174a3b113d673183dbfef3b1c7570865e39d5f009a1d7" + }, + "strict_desktop_Clippy": { + "path": "/workspace/rheon-g1-evidence/desktop-all-targets-clippy-gesture-final.log", + "bytes": 117, + "sha256": "c70b4f8aca042a0d153d1a3a63b1ca9bf67e9d0babf178e13ad5b5b2e322f6b7" + }, + "strict_core_Clippy": { + "path": "/workspace/rheon-g1-evidence/core-all-targets-clippy.log", + "bytes": 118, + "sha256": "ef6ea4a167290ff7512146617e999d535b22dddd3f14dd75d625c7eee5db33c7" + }, + "format": { + "path": "/workspace/rheon-g1-evidence/format-gesture-final.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + "retained_prior_evaluations": [ + { + "path": "/workspace/rheon-g1-evidence/native/failure-bc494c1-index.json", + "bytes": 2703, + "sha256": "e2003623690b7513c495efbe86caea254c319feced49106feae020e4cd112235" + }, + { + "path": "/workspace/rheon-g1-evidence/native/final-bc494-evdev-index.json", + "bytes": 8742, + "sha256": "d6b86598dc5d602fdf5652b1f18046726e74e2c44384183be5788ea27b7a95b5" + }, + { + "path": "/workspace/rheon-g1-evidence/native/final-3a86991-evdev-index.json", + "bytes": 24290, + "sha256": "50ccd5fe6cde88a404393791cb9e04f595fe0170c6d1ed5b983f23b07d9f7c88" + }, + { + "path": "/workspace/rheon-g1-evidence/performance-bc494-first.log", + "bytes": 1080, + "sha256": "31ea8d6f959e1334dca744335adcdeb910b1a49a512b03c49a756dfd2d8e6633" + } + ], + "independent_reviews": { + "architecture_core": "pass; no numerical formula/order/domain widening", + "persistence": "pass; additive profiles and historical meaning", + "native_source_and_workflow": "pass at final implementation", + "performance": "pass at final implementation", + "C1_readiness": "pass; canonical status synchronized" + }, + "integration": "PR122 stacked on PR120; repository lead owns retarget/merge; no merge or branch cleanup" +} diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-protocol.md b/docs/plans/fluid-accuracy-composition/reports/g1-protocol.md new file mode 100644 index 00000000..6070e1b9 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-protocol.md @@ -0,0 +1,42 @@ +# G1 implementation qualification protocol + +Authority: `plan.md` G1 admission and the fixed acceptance in `verification.md`. This protocol was frozen before native workflow and overhead evaluation. No numerical formula, stage order, supported domain, pressure-v1 meaning, audit criterion or old archive meaning may change. Retain failed evaluations. + +Source base: plan120 `8422f77` on main `bc2f472`. Use Rust 1.92.0, existing binary64 pressure/fractions and f32 carrier. The material preset does not confer physical validation. Native fixtures use the existing Session, Worker, process supervisor, immutable configured intent and deterministic classical candidates. + +## Contract checks + +Run focused workflow and additive SQLite tests, then affected existing pressure, Session, recording/runtime and desktop worker/producer/archive/selection tests. Cover viscosity off, applied zero and nonzero; shortened actual interval; accepted, rejected, support-refused and failed providers; native fallback; cancellation before provider, after return, after qualification, during native fallback and before commit. Include accepted generation zero and attempted generation one. + +Assert immutable accepted state and no accepted row for failed intervals. Preserve explicit accepted but unrecorded tails. Mutate source, interval, native input, request controls, descriptor digest, ordered nodes, runtime outcome and publication association. Unknown versions/kinds, oversized inputs and corrupt controls must reject. Known missing or legacy workflow evidence remains unavailable. + +## Native workflow + +Use the normal native App with isolated temporary project, settings and output roots. Prepare saved intent and actual fixture-provider archives through the existing Worker in the test-only fixture preparation function. Use an isolated Xorg dummy display with software graphics and XTEST input, without an ambient user session. + +Through normal controls: + +1. Open a saved configured run set and rerun from zero. +2. Open the live workflow. Select nodes by pointer and keyboard with visible focus. +3. Inspect actual interval, provider/fallback, candidate/accepted residuals, limits and units; change the selected accepted interval and open retained evidence. +4. Cancel and close. Remove the provider executable, then cold reopen the saved run and inspect the same retained descriptor/receipts. +5. Exit and reap owned application/provider processes. + +Focused real-egui tests also cover generation-zero terminal inspection, invalid/missing/legacy states, source changes, pan/zoom/reset, text navigation, focus and close/reopen. Startup and screenshots alone cannot pass the workflow gate. Keep screenshots, interaction/assertion logs and archives outside Git; commit only compact source/binary hash manifests. + +## Fixed capture plus cached projection budget + +Workload: sealed 16³ grid over 1 m³, density 998.2 kg/m³, represented fraction 0.5, force acceleration [0.001, 0, 0] m/s², requested dt 0.001 s, Jacobi PCG v1, no viscosity/provider. Pressure limits: relative 1e-10, absolute 1e-12 m³/s², predicted divergence 1e-8 s⁻¹, actual divergence 1e-5 s⁻¹, maximum 2,000 iterations. + +Baseline: existing `Session::step_with_pressure_provider(None)`. Candidate: `step_with_configured_pressure_observed(None)` plus the actual validated cached `WorkflowInspector::set_attempt` projection. Disk I/O and rasterization are outside this metric; bounded selection and cached-paint tests cover them separately. + +Use optimized release, the same CPU/process, five warmup intervals, then exactly thirty paired intervals with alternating first path. Record each pair in nanoseconds. Compute the median of the paired `(candidate / baseline) - 1` values. Outside the timers, assert identical accepted state, pressure, fractions and time after every pair. The fixed target is at most 5% median added capture-plus-projection time. Report environment, variability and raw pairs. If variability dominates, classify the result unresolved. Do not change physics, workload or threshold to obtain a pass. + +Reproduction: + +``` +cargo test --release --locked --features desktop --bin rheon-desktop \ + paired_capture_and_cached_projection_overhead_protocol -- --ignored --nocapture +``` + +The descriptor must remain at most 1 MiB and node summaries at most 256 per interval; the existing 16 KiB persisted metadata limit also applies. Formatting and strict Clippy cover library/desktop features. Independent architecture, persistence and native UI reviews must dispose material findings. C1 remains dependency-gated until G1 qualification. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-qualification.md b/docs/plans/fluid-accuracy-composition/reports/g1-qualification.md new file mode 100644 index 00000000..efc3d708 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-qualification.md @@ -0,0 +1,48 @@ +# G1 qualified native workflow inspection + +**G1-C and G1-U pass for implementation checkpoint `f6b7c8cd4628f6939c41567cecdf4a5231f60386`**, tree `50a4abfae98b26c0b28474dcd19609252bb046ae`. Independent architecture, persistence, native UI and final performance reviews disposed material findings. The fixed [protocol](g1-protocol.md) and [contract](g1-contract.md) remain unchanged. This accepts inspection/custody for existing configured sealed-MAC execution, not new numerical accuracy, physical validation, learned-model qualification, hardware GPU support, browser parity, universal accessibility or packaged-release qualification. + +## Contract and regression evidence + +| Evidence | Result and scope | +| --- | --- | +| Native CPU library/integration | 74 suites: 597 passed, zero failed, four explicitly ignored. Numerical/persistence production source is unchanged by subsequent UI repairs. | +| Current core/workflow persistence | 15 passed, zero failed or ignored: exact control/native-state/RHS binding, legal prefixes, actual interval/provider/fallback, cancellation, corrupt evidence and additive custody. | +| Existing persistence integration | 60 passed independently, including historical profile meaning; real producer-exit/model-absent reader passed. Existing integration tests are also in the broad CPU run. | +| Final native view contracts | 11 passed, zero failed, two opt-in helpers ignored in the ordinary suite. Live/archive/comparison selection, missing/invalid/legacy states, generation-zero terminal, cached source-free paint, pointer/keyboard/focus/loops, overflow, close/reopen and gesture ownership. | +| Compatibility consumer | Legacy exact-side saved-comparison workflow-unavailable regression passed; material/carrier archive selection/export remained available. | +| Static checks | Formatting and strict all-target library/desktop Clippy passed. Final reviewed UI/test hashes match the implementation checkpoint. | + +Raw evidence and recorded binaries remain outside Git under `/workspace/rheon-g1-evidence`. The [compact manifest](g1-manifest.json) binds source inventories, executable hashes and retained indexes. Builds set `RHEON_SOURCE_REVISION` to the tested checkpoint and leave `RHEON_BUILD_MATERIAL_SHA256` unset; no hermetic-build claim is made. Subsequent acceptance/handoff edits are documentation only. + +The original P0 manifest remains the historical PR120 snapshot; its mutable plan/ledger hashes are not a claim about this implementation branch. G1 uses its separate manifest and does not refresh or broaden the original proof/audit qualification. + +## Actual native workflow + +The normal desktop App ran on isolated dummy Xorg `:91`, 1600×1000×24, software GLX/llvmpipe, explicit evdev/us XKB and XTEST input. Project/settings/data/cache roots were isolated. The existing Worker prepared immutable configured intent; deterministic classical provider execution produced real accepted and quality-gate/native-fallback intervals. No learned assets were used. + +The final procedure passed saved-set rerun from zero, live accepted interval selection, pointer and End/arrow selection with visible focus, exact fallback selection, reachable retained evidence/footer Close, candidate/accepted residuals and actual limits/units, actual divergence, real cancellation, close, provider-executable removal, cold reopening of the same retained graph, keyboard/pointer inspection and close/reopen. Cold stable fallback focus is established by capture 22, rather than transient focus paint in capture 17. Initial saved-set capture was a pending rendered frame: the bounded condition wait succeeded next frame. That initial frame remains a nonaccepting observation. + +Exact publication: run 4, ordinal/attempt/publication 2, accepted input generation 1, interval start 0.0625 s and requested/actual dt 0.0625 s. Live/cold archive SHA-256 `99835798215557b8cbe85399b075fb9789124a6d887015ecfd1d55e12a970a70` and controls SHA-256 `9716f406a0170248c61c0185f2ec3a5c05ca67cf3b087c4c79cc6b382c469a70` are identical. Descriptor, native input, actual request, RHS and provider identities were displayed and independently checked. Provider removal did not change the archive. + +Actual cancellation: run 6, attempted generation 12 after accepted generation 11, `Cancelled`, publication `None`; finalized archive retains 12 rows including construction and accepted generation 11. Live App PID 56713, cold App PID 56956 and display PID 1574 exited with supervisor code zero. Independent checks found them absent and no Python/provider/native App/display processes remaining. No individual provider PID was sampled; no such PID/reap claim is invented. + +Independent native review checked the 73-entry original artifact index, 22 accepted capture hashes, source/executable identity, exact live/cold SQLite bytes and cleanup. Final observation manifest SHA-256: `6f19eabd8b1177e571a7de9a3f78eccc0bb8a07e7c4169350790905fc5ba3d99`. Durable copies include actual live/cancel archives and immutable intents, not only seed fixtures. + +## Fixed release capture-plus-projection budget + +Final source passed the unchanged **≤5% median** criterion: **1.880860%** added time across exactly 30 pairs after five warmups. Every pair asserted bitwise identical accepted native fields, stamps, pressure, fractions and times outside timers; first-path order alternated. Candidate includes actual validated `WorkflowInspector::set_attempt` cache adoption. Disk I/O, graph paint/layout/rasterization, models and other configurations are outside this metric. + +Median baseline was 17,794,716.5 ns and candidate 18,163,490 ns. The criterion uses paired ratios, not a ratio of these medians. Paired quartiles: −2.3406%, 1.8809%, 4.4662%; extrema −9.0839%, 8.1553%. Sorted tenth–twenty-first ratio bracket: −0.1806% to 3.3220%; alternating-order medians: 1.7925%, 2.3075%. Independent review confirmed variability/order do not obscure the margin. CPU: Xeon Platinum 8573C, four-CPU cgroup, 16 GiB limit, Linux x86_64, Rust 1.92.0 optimized release. Owned builds/Apps/providers were stopped during timing; only the idle display remained. + +Release test binary SHA-256: `542b872ebbbe9ebfd73897920ce5b52c0ff1fe35a891cd43fdfdad02542cdee6`; final timing log SHA-256: `ddef3f204e78bb43b104e71e059d0b55c04b52e8c5f8edbab579be3689ff8a16`. Earlier bc494c1 evaluation passed at 0.4037% and is retained, not substituted for final-source evidence. No threshold, workload or numerical formula changed. + +## Retained failures and repairs + +Actual display review found two source defects missed by initial event tests. Long provider bindings overflowed evidence: the repair bounds its scrolling body, displays compact hashes and keeps Close reachable. The first height-only cap failed a 1000×600 footer check; the corrected cap uses remaining viewport space. + +Cold node clicks consumed pre-press relocation as parent-canvas drag, shifting the node before hit testing. Independent pixel analysis and a failing regression reproduced pan `(190.1, −635.5)` from one relocation-plus-press. The repair owns background-origin gestures and measures held displacement; node-origin gestures cannot pan, and invalidation/release/open/reset/close dispose ownership. Coalesced click/release/End with idle frames and actual background drag pass. Keyboard-map changes alone did not repair it. + +Failed source evaluations, late Cancel clicks on completed runs and driver frame/wheel diagnostics remain indexed outside Git. No cancellation was claimed from completion, no startup/screenshots replaced interaction, and no process launch implied acceptance. Transient executor callbacks were checked against actual source/process state; evidence persisted without duplicate workers or recovery-triggered runs. + +G1 is Accepted for this scope. [C1 readiness](c1-readiness.md) prepares the next bounded work; P1/Q1 numerical selection/reference work remains independent. Repository integration, CI disposition and retargeting/merge of stacked PR122 remain with the repository lead. diff --git a/docs/plans/fluid-accuracy-composition/reports/g1-review.md b/docs/plans/fluid-accuracy-composition/reports/g1-review.md new file mode 100644 index 00000000..38564224 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/g1-review.md @@ -0,0 +1,14 @@ +# G1 independent review disposition + +Separate Codex instances reviewed architecture, persistence and native UI without editing the source under review. **All final bounded dispositions pass** at implementation `f6b7c8c`. Independent review of the subsequent C1 preparation also passes; canonical status was synchronized as requested. + +| Review | Material findings disposed | Final evidence | +| --- | --- | --- | +| Architecture/core | Exact actual controls/native state/RHS; accurate typed dependencies; legal executed prefixes; no premature/over-limit diagnostics or invented publication; true pressure/viscosity cancellation and partial fallback facts. | Seven core and eight persistence contracts pass; independent adversarial harness reproduced/corrected defects. Numerical formulas/order/domains unchanged. | +| Persistence | Additive RCP4/RCT2, old profile meanings; source/provider/interval/runtime binding; prior state and increasing attempt IDs; generation-zero terminal; accepted-but-unrecorded tails; historical Inspector regression. | Eight new contracts, 60 existing integration cases and actual producer-exit/model-absent reader pass. Numerical/persistence source unchanged by final UI repairs. | +| Native UI source | Stable node IDs, replacement focus/view, visible loops, units/candidate-vs-accepted diagnostics, exact comparison selection/stale invalidation, comparison terminal isolation; actual evidence overflow and pre-press click-pan defects. | Eleven focused cases pass. UI/test SHA-256 `4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f` / `577bc23f06a8cd794b16d42cd347a024d627443f3d1cf5d4a6230b21c76a24e2`. | +| Actual native workflow | Live/cold pointer and keyboard focus, reachable evidence/footer, values/limits/units, actual cancellation, exact source/receipt identity, provider absent, close/reopen and process cleanup. | Final manifest, all 73 original indexed artifacts and 22 accepted capture hashes independently verified. Same live/cold run 4/ordinal 2 bytes. Final stable cold fallback focus verified in capture 22. No remaining blocker. | +| Fixed final-source budget | Frozen workload/timer scope, 30 alternating pairs, identical state outside timers, raw/binary/source hashes, variability and order. | Independently recomputed median 1.880860% ≤5%; no rerun needed. Excludes disk/paint/layout/rasterization and other workloads. | +| C1 readiness | Two bounded modules/declarations, typed native families and old pressure v1, Session/process/custody ownership, gated subgraph/whole support, refused implicit transfer, P1/Q1 independence. | Prepared direction passes; requested G1-Accepted/C1-A-Planned canonical status correction is disposed. No C1 implementation/acceptance implied. | + +The Session remains publication owner; recording remains custody owner; numerical owners emit facts directly; UI consumes an exact cached selection. Failed source/harness evaluations are retained separately. The [qualification report](g1-qualification.md) and [manifest](g1-manifest.json) limit accepted claims to actual evidence; scientific, GPU, browser, universal accessibility and shipped-release claims remain outside scope. diff --git a/docs/plans/fluid-accuracy-composition/reports/integration-20261020.md b/docs/plans/fluid-accuracy-composition/reports/integration-20261020.md new file mode 100644 index 00000000..276fe98d --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/integration-20261020.md @@ -0,0 +1,147 @@ +# Repository integration disposition — 2026-10-20 + +Current PR138 work on 2026-10-21 is a **preliminary** isolated composition of its +retained source with frozen PR142 `dbd49d3`, authorized by the sole integration +lead. Its complete 152-path closure changes only two Cargo inputs; source review +and fresh validation are recorded [separately](pr138-integration-20261021/protocol.md). +PR142 has not yet landed. Final readiness requires the verified merged dependency, +exact-source revalidation and lead merge. The dated dispositions below retain +their historical tested sources and do not qualify this preliminary composition. + +This report reconciles historical implementation and numerical-route facts. It does not replace frozen protocols, raw fields, failed evaluations or prior qualification. Source and acceptance scopes are separate from hosted integration readiness. Initial main was `bc2f472787060d9a69cb619ed2c2fea10fd754b6`. After direct merge confirmation, PR120 and PR119 merged; verified main is `718469beedb9a949f4bb6f3299c7b880b4c47e47`. The [fixed staged qualification](native-admission-20261020/qualification.md) is separately bound to exact clean `9c04278`; it does not qualify later Q2 inputs. A separate [dependent qualification](https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md) passes on clean `9a9904f`; fixed PR133/8bf542e and its earlier execution remain unchanged. + +## Exact reviewed subjects and dependencies + +| PR | Exact source head | Dependency and observed disposition | +|---|---|---| +| [119](https://github.com/MrScripty/Rheon/pull/119) | `3d2bc4ea76dc71dfbb063afec5059d437f8826ce` | Audit/probe artifact on main. Independent artifact-scope review passed; all eight observed checks/statuses passed. Merged after direct confirmation as `718469beedb9a949f4bb6f3299c7b880b4c47e47`; original refusal retained. No experimental validation or production repair acceptance. | +| [120](https://github.com/MrScripty/Rheon/pull/120) | `8422f77bb45e60b95c5694ed0b39e01377b62976` | Plan/isolated-proof artifact on main. Independent review and all three observed checks/statuses passed. Merged after direct confirmation as `193d86ce1a06f4585208226069b41c619e530a00`. Original P0 qualification remains scoped to its exact source. | +| [121](https://github.com/MrScripty/Rheon/pull/121) | `a64d4d3c610d2ea30f2c734e61e86c4bf2bd25c4` | Independent P1 wall-selection fixtures/evidence on main. Numerical source/hash scope coherent; hosted disposition remains a separate exact-head gate. No production candidate admitted. All nine observed checks and independent artifact readiness passed, but automatic approval rejected the merge and single requested retry; PR remains unmerged. | +| [122](https://github.com/MrScripty/Rheon/pull/122) | `67ef1e9f1b7e741c3fb06b7c037b874aa8d5be75` | G1 retargeted to main after 120 merged. Historical qualification binds `f6b7c8cd4628f6939c41567cecdf4a5231f60386`; PR131 repairs iteration consistency. Fixed stage `9c04278` has fresh 135-path local admission/qualification; original Pages refusal is retained and hosted integration remains pending. | +| [123](https://github.com/MrScripty/Rheon/pull/123) | `bc2573f2ba8d51f9f473fb11285b0c26840e4f18` | Static adjoint/partition evidence stacked on 121. Frozen normal-mode campaign retained; separately repaired active tooling is in PR130. | +| [124](https://github.com/MrScripty/Rheon/pull/124) | `9d84f66a5bace9be7fd2f44b40c014c692daf099` | Static material reference/route comparison stacked on 123. Frozen normal-mode campaign retained; separately repaired active tooling is in PR130. Reference-only, not a third production family. | +| [127](https://github.com/MrScripty/Rheon/pull/127) | `7d7306ad4421e8424f836fd4cfc3c38b52860e2b` | Q2 private planar common-geometry reference, stacked on 126; independently reviewed 24-case version-2 finite-error integration, with five positive native apertures on exact-zero-measure source faces blocking topology/DOF/B/M/S/W promotion. Later PR132 repairs those artifacts in its fixed corpus; that repair remains excluded from fixed stage `9c04278`. Version-1 refusal retained. No full Stokes/3D/water claim. | +| [128](https://github.com/MrScripty/Rheon/pull/128) | `43a084a66bdfb3731b24bd480909c81e317b1e53` | C1-B1 supplied-array projection foundation, stacked on 125; tested source f161d1a unchanged by final evidence docs; supporting checks and final independent architecture/contracts reviews PASS within the local supplied-array scope; hosted integration pending. No provider invocation or Session adoption. | +| [126](https://github.com/MrScripty/Rheon/pull/126) | `dfcc693bf8b66678a924e4a92d299127f6746526` | Q1 periodic-volume support and retained incomplete accuracy campaign, stacked on 124. Scientific source `b9a9d4ca3ff02c9eae38eb20dced49e87a923380`; hosted checks/review/integration remain separate. | +| [125](https://github.com/MrScripty/Rheon/pull/125) | `91b20381d4c717299303ac228ffb927af0892256` | C1-A stacked on 122; final Rust `ac6ed17003279e7078751a4390f2ee28200d4d5f`. Local bounded adapter/facade qualification passed; hosted jobs pending. All seven committed source/lock hashes independently match the manifest. C1-R remains incomplete. | +| [130](https://github.com/MrScripty/Rheon/pull/130) | `c2fbbea9f19f818b28b6c6863a40220a2bd0bbe5` | Always-on guards for 15 original predicates across four evaluators; owner 129 checks and independent AST review. Original campaigns/hashes unchanged; no scientific rerun. | +| [131](https://github.com/MrScripty/Rheon/pull/131) | `97cdce614c3c4438fa65ac806b48c4de6490583e` | Tested iteration repair `34e2e73`, owner 135 passing executions/5 existing ignores and three reviews. Only 11 production validator lines; fresh stage `9c04278` independently verifies exact source and 23 workflow tests. Hosted integration pending. | +| [132](https://github.com/MrScripty/Rheon/pull/132) | `e6525a116a07af486e4a682cc2b157241d6b9150` | Private exact represented-source face/region predicates; tested source `0f4e7e0`, independently reviewed fixed corpus 0 mismatches / 76,384 faces / 152,780 regions. New exact-reference dev dependencies are separately admitted, not folded into fixed PR133. | +| [134](https://github.com/MrScripty/Rheon/pull/134) | `f84f65104d6a0f6f8f1a9b903412b1e5155f72a2` | Eight private aligned coupled M/B/S/W/KKT algebra/direct-solve cases at tested source `06b3190`, stacked on 132. Separate complete Cargo-closure qualification passes at `9a9904f`; general cut/free-surface/PDE/production acceptance remains pending. | +| [135](https://github.com/MrScripty/Rheon/pull/135) | `4f8bd22669efed62e84c0062ee1baec27393e830` | CV1 cut-cell operator/physical-trace reference stacked on 134, frozen numerical source `6d99e7794a6aa69f5886bb15cc662e40ea43cd40`. Four native fixtures and independent exact reconstruction pass bounded gates; all 68 active zero-old-dual coefficients retained. Ten contracts pass in each debug/release mode and 45 evaluator checks pass. Square mass condition 6.53e11 leaves coupled conditioning, mixed-pair stability and PDE accuracy open; no solve/timestep/production admission. Excluded from this stage; source/admission and hosted integration remain separate. | +| [138](https://github.com/MrScripty/Rheon/pull/138) | `a6bfcc94481b1bafbe61be804a1abc3426927bbd` | Separate PR132/134 Cargo closure: actual qualification `9a9904f`, 135 inputs, 18 native commands, 26+26 real packet and 83 focused tests. Independently reviewed public draft on fixed PR133; no physical/PDE promotion. Q2 dependencies and admission bytes are excluded from the current 140-input stage. | +| [136](https://github.com/MrScripty/Rheon/pull/136) | `e56bc7bd31ea8e8121f09cba15eb8a2bc5e514e4` | Bounded C1-B2 native Session/custody stacked on fixed PR133. Owner results retain exact core634404e/consumera6e76a9; combined with final PR137, fresh separate 140-input qualification passes at `186dc0a`. Closed native Session/custody only; full replacement/hosted acceptance remains pending. | +| [137](https://github.com/MrScripty/Rheon/pull/137) | `d3e62377acde6641c8133cf9a9356cc046cfd02a` | Three-line typed legacy cancellation label repair at tested `70da36d`, plus live/cold/pressure-failure tests. Owner 226 passing executions/5 existing ignores remain separately attributed. Fresh 140-input stage `186dc0a` includes this exact source; historical Failed receipts and no-publication behavior remain. | +| [139](https://github.com/MrScripty/Rheon/pull/139) | `902f6092de6044419d028f92dabd8e59ae7a87ba` | Separate CV2 static conditioned cut-cell reference on PR135; owner qualification reports 24 fixed cases, independent R1/R2 reconstruction and 45 evaluator checks passing at numerical source b0a9d52. Generic stability/PDE/production gates remain open; excluded from fixed lead stages. | +| [140](https://github.com/MrScripty/Rheon/pull/140) | `5dc1741feffa88b857194559b3e7e79be5369a64` | Separate C1-B3 producer selection on PR137; owner 227 passing / 5 existing ignored at core4af3802/consumer9ddf8d2. Initial compile/refusal-category failures and bounded repairs retained. Eight selected pins change from PR137; separate clean `3b3b667` passes complete 140-input admission and fresh native/rational/packet plus 228 focused contracts. Exact-head hosted gates pending; excluded from 186dc0a. | + +An object-only merge preview of C1-A `91b2038` with Q1 `dfcc693` completed without conflicts and produced tree `dbccbf5c0002c33a059e9a355bd25793a9411134`. It changes no branch or worktree and proves only merge-text compatibility, not source admission, runtime correctness or qualification. + +These are observed checkpoints, not promises that queued jobs will succeed. Exact-head checks must be read again immediately before any authorized merge. Serial integration must preserve complete reviewed proposals, recheck semantic/write-set compatibility after main changes, and retarget open dependents before deleting only exact tips retained in main. No force-push, generic prune or unrelated branch/worktree cleanup is admitted. + +## Retained numerical evidence and selected route + +The [first campaign](https://github.com/MrScripty/Rheon/blob/a64d4d3c610d2ea30f2c734e61e86c4bf2bd25c4/docs/plans/fluid-accuracy-composition/p1/results.md) rejects the tested AHA/SA adaptations against the predeclared wall/rest gates. The [adjoint campaign](https://github.com/MrScripty/Rheon/blob/bc2573f2ba8d51f9f473fb11285b0c26840e4f18/docs/plans/fluid-accuracy-composition/p1-adjoint/results.md) separates work identity from E0, hydrostatic and alternating-pressure defects. The [material reference](https://github.com/MrScripty/Rheon/blob/9d84f66a5bace9be7fd2f44b40c014c692daf099/docs/plans/fluid-accuracy-composition/p1-material/results.md) closes a bounded static 1D volume/first-moment/gravity/boundary question. Its smallest-step finite-difference failures remain retained under the unchanged two-consecutive-step rule. + +The [route decision](https://github.com/MrScripty/Rheon/blob/9d84f66a5bace9be7fd2f44b40c014c692daf099/docs/plans/fluid-accuracy-composition/p1-material/route-decision.md) compares ownership and qualification obligations. Promoting that material reference would require new connectivity, reference moments/inertia, distortion/remap, 3D stress, stability and state custody. The current direction instead advances existing grid owners: **Q1 native channel/transport resolution and Courant verification, then Q2 common embedded geometry and unified pressure–viscosity Stokes**. This is not a measured effort estimate or a claim that grid geometry/transport is already solved. + +Q1 source/protocol/results are now delivered by the existing numerical worker in [PR126](https://github.com/MrScripty/Rheon/pull/126). The [retained result](https://github.com/MrScripty/Rheon/blob/dfcc693bf8b66678a924e4a92d299127f6746526/docs/plans/fluid-accuracy-composition/q1/results.md) reproduces the eight-level channel failure and resolved channel convergence, but includes only 12/18 transport trajectories before n64 sphere quadrature exhausts depth 22. Three Full controls refuse fraction 1.0000000000000002; no clipping, retry or finest-pair accuracy claim. The periodic support and its regression tests are distinct from an accuracy admission. Q1 is Implemented with evaluated, incomplete qualification. Q2 implementation/verification is limited to the separately frozen common volumes/open faces/boundary moments and polynomial flux/stress/refinement prerequisite justified by that result; full coupled Stokes/transport gates remain pending. Particle production selection is stopped; a future particle proposal needs new bounded admission and the unchanged gates. P2 is not silently converted into a moving-material seeder. G1/C1 implementation and declarations stay with the composition owner. The lead writes only shared integration documentation here. A final live read also found draft PR127 implementing/verifying the bounded Q2 geometry reference and draft PR128 locally qualifying C1-B1 supplied arrays, with tested source f161d1a unchanged by final evidence head43a084a. Q2 version-2 post-run review found five native aperture topology artifacts. PR132 subsequently repairs them within the fixed corpus, and PR134 supplies aligned coupled-algebra evidence. PR135 subsequently qualifies a bounded CV1 cut-cell operator/physical-trace reference only, with coupled conditioning/stability/PDE gates open. Hosted integrations remain pending; C1-B1 supporting checks/final reviews passed only within the supplied-array boundary, not full replacement acceptance. Do not duplicate either implementation or infer production Stokes/Session replacement from their foundations. + +## Source admission and owner corrections + +The old [Pages job118402469851](https://github.com/MrScripty/Rheon/actions/runs/39353360544/job/118402469851) refused a stale complete native inventory before numerical comparison. Intermediate read-only counts were129 for G1 and133 for C1-A. Complete staged composition has135 paths: 11 added, 16 changed, 108 unchanged, 0 removed versus admitted main `bc2f472`. The explicit v3 refresh preserves historical review text, both frozen predecessor inventories, primary tree, complete selector and refusal checks. Independent per-path, mechanism, iteration-delta and final-metadata reviews approve this fixed source. + +Fresh qualification on clean `9c04278` passed18 unchanged qualifier commands,35 Rust tests, five actual native specimens with rational/adversarial comparisons, a new real packet and 26 normal + 26 optimized packet tests with no skips. Separate focused no-default composed contracts pass 72 tests. Exact source/tree, inventory/review/ELF/receipt/artifact hashes, environment, archive and limits are in the [staged report](native-admission-20261020/qualification.md). That fixed stage excludes subsequent Q2 boundary work. The separate PR132/134 admission now passes on clean `9a9904f` with 135 inputs (0 added / 2 Cargo changes / 133 unchanged / 0 removed), all 18 native commands, new real packet tests 26 normal + 26 optimized without skips, and 83 focused tests. Exact source, dependency licenses/checksums, executable/receipt/archive identities and independent execution audit are in the [dependent report](https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md). This is not a rerun or relabelling of component scientific campaigns. Hosted Pages/browser/publication, full desktop and physical acceptance remain separate; this local pass does not turn the old failing hosted job green. + +PR131 reproduces six standalone/cold-terminal workflow iteration failures and fixes native cap/zero candidate-count validation, including later cancellation/failure. Matching forged RCP4 inner/outer counts already failed the legacy gate; no RCP4 bypass is claimed. Source `34e2e73` has owner 135 passing executions and three reviews; stage `9c04278` independently verifies the exact two changed selected files and passes 23 workflow tests. Cap-zero candidates, rejected IEEE diagnostics and old profiles retain their meanings. + +PR130/c2fbbea promotes all 15 original assertions in four reusable evaluators to always-on guards and retains original bytes and scientific campaigns. The owner reports 129 subprocess checks/35 malformed fixtures, reaching every guard in normal/-O/-OO with byte-identical retained valid reports. Root independently verifies all eight evaluator hashes and full AST equality after reversing only the guard transformation. This is an input-contract repair, not exhaustive CSV schema or scientific promotion. The historical optimized bypasses and normal-mode scientific failures remain retained. + +Historical G1/C1-A raw GUI/performance directories remain with their recorded owners and were not rehashed here. The new native/rational/packet/focused evidence and executable were actually generated here and are source-bound; no old screenshot, performance or physical claim is relabelled. + +The later C1-B2 review reproduced a legacy configured-Session advection cancellation label defect: the numerical result is cancellation and no state is published, but the attempt is labelled Failed. That unchanged legacy path also exists in fixed `9c04278` and `9a9904f`; their passing workflow suites do not resolve it. Full G1-C outcome-label acceptance for this path remained open in those fixed subjects. PR137/70da36d subsequently repairs only that classification. The new `186dc0a` stage includes exact final PR137/d3e6237 and passes 26 workflow checks within its full 85-test library run. Earlier fixed 9c/9a remain unchanged; historical Failed archives are not reinterpreted. + +## Authority and protected work + +Earlier automatic approval denials remain retained. After direct user confirmation, a single newly requested retry merged PR120 as `193d86ce1a06f4585208226069b41c619e530a00`; independently ready PR119 merged as `718469beedb9a949f4bb6f3299c7b880b4c47e47`. GitHub and remote main confirm both SHAs. PR122 targets main. No source branch was deleted; implementation merges still require their actual hosted and review gates. These artifact merges do not grant new numerical acceptance. A later PR121 merge attempt and its single requested retry were rejected by automatic review because the original trusted no-merge delegation prevailed over tool-relayed confirmation. PR121 remains unmerged; no alternate path or further retry was used. Further public merges are paused at this approval blocker. + +The three original owner worktrees and all original local branches are protected by a before snapshot. PR59 remains at `7f1733f0dc956ef8f25d5b110d990117fb765903`, draft and unresolved; this effort changes neither its implementation nor its evidence. No production code, numerical fixture, old manifest, proof, dependency, workflow gate, user data, model or source branch is rewritten by this reconciliation. + +V1 physical validation still needs independent numeric observations, sensor geometry/timing/filtering and uncertainty, plus a qualified pressure/load measurement operator when comparing loads. Those missing inputs block V1 only. They do not block Q1/Q2 reference verification or classical composition fixtures. No A1 substitute, physical validation, GPU, new native interaction or performance result is manufactured here. + + +## Separate closed projection and cancellation source qualification + +Clean `186dc0a18f787748eb723d91321e44ffd0e374d5`, tree +`3c19a1c1f4a549c782d619145a841a0b43abedac`, retains exact PR136/137 and +fixed PR133. Independent complete review covers 140 inputs: five added, eleven +changed, 124 unchanged, none removed versus PR133. Exactly three existing pins +change after PR136. Fresh unchanged native/rational qualification and a real +packet pass; separately recorded no-default library, integrated projection, +legacy recording/volume and borrow checks are in the +[new result](c1b2-admission-20261020/qualification.md). + +This stage excludes Q2's changed Cargo inputs and all later reference code. +PR138's independently qualified source and results remain explicit external +history, linked at its exact documentation head. Future joint composition must +reconcile these separate active v3 inventories/review appends and independently +review the complete combined closure before fresh applicable qualification. +Neither stage's receipt transfers across that source change. + +The final live read confirms the separately owned C1-B3 implementation in PR140 +at `5dc1741feffa88b857194559b3e7e79be5369a64`, tested core +`4af3802babe332d8dfeb926c19159b4b656be775` and consumer +`9ddf8d2fd860c73bbcc35a077e08099d894db07a` (one UI test API correction). It adds closed stateless classical +producer selection, distinct full-cap native fallback and additive RPS2/RPP2/RPT2 +custody. Initial source d7928c8 passed its integrated selection fixtures but a +wider run retained 94 passes and one old-profile foreign-version refusal-category +failure. A bounded ingress repair and 14 focused persistence checks pass. Final owner +qualification reports 227 passing, zero failing and five existing ignored +executions, including 200 actually selected native intervals bitwise against the +same-producer baseline. These are owner-attributed results, not a lead rerun. +The separately reviewed clean stage `3b3b667` now passes complete 140-input +admission and fresh native/rational/packet plus 228 focused contracts; exact-head +hosted gates remain pending. No new composition implementation milestone is admitted. Its 140-input +closure changes eight pins from PR137 and is excluded from the qualified 186dc0a +stage. Its [separate prospective protocol](https://github.com/MrScripty/Rheon/blob/9ddf8d2fd860c73bbcc35a077e08099d894db07a/docs/plans/fluid-accuracy-composition/reports/c1b3-protocol.md) records its own implementation admission; this fixed-stage report supplies no new source-admission approval. +Full C1-B/C/R, stateful/external transactions and whole-family/transfer remain +unaccepted. No production implementation is authored by this lead. + +The same read found PR139 at `902f6092de6044419d028f92dabd8e59ae7a87ba`, stacked +on PR135. Its [source-pinned qualification](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/qualification.md) and [independent review](https://github.com/MrScripty/Rheon/blob/902f6092de6044419d028f92dabd8e59ae7a87ba/docs/plans/fluid-accuracy-composition/q2-cut-solve/independent-review.md) report the CV2 static 24-case +conditioning/coupled-solve reference locally accepted at numerical source +`b0a9d52cc266cb651c5e67c07ec5f4f82419db55`: native checks, independent 80/120-digit +R1 exported-target and R2 exact-integral comparisons, 15 contracts in each debug/ +release mode and 45 evaluator checks pass. This is owner-reported bounded +reference evidence, not a lead rerun or new raw-artifact audit. The unscaled +comparator's six square-case velocity-accuracy failures remain retained despite +passing residuals. Original mass condition 6.53e11 remains; no basis/support/ +pressure removal, floor or fallback is introduced. Generic stability, finer-mesh/ +PDE convergence, boundary lifting, evolving geometry/transport and production +acceptance remain open. This source is excluded from both fixed lead stages. + +## Next numerical admission + +[CV3-A](cv3a-admission.md) admits the existing numerical owner to prepare the +nine-case static polynomial polygon MMS, source/write set, independent oracle +and resource freeze before one separately reviewed private campaign. It changes +no production owner or capability. No numerical result exists. Canonical disk, +generic stability/PDE, moving geometry and production remain unqualified. + +## Separate C1-B3 stage qualification + +Fixed [PR141](https://github.com/MrScripty/Rheon/pull/141) is +`38c40ca7b4b2401e0ac802f12c647f7229072f52`, actual executed source 186dc0a. Its +frozen evidence and reviewed CV3-A preparation admission remain unchanged. +The new [C1-B3 result](c1b3-admission-20261020/qualification.md) is independently +bound to clean `3b3b667a8b81942a3ca95c7531b29525ac4494b2`, retaining both that +lineage and exact owner 5dc. Same 140 inputs,8 changed / 132 unchanged, explicit reviewed +v3 append/map and prospective protocol precede fresh 18-command native/rational, +26+26 no-skip real packet and 228 focused passing executions/3 existing ignores. +All 17 actual ELFs and 76-member raw archive are retained and Library-saved. + +Dependency order remains reviewed owner/component histories → fixed PR141 → this +separate admission/results stage. PR133/138 remain fixed, and no joint Q2/C1 +qualification is implied. Every public integration requires exact-head hosted +gates; queued jobs are pending. No public merge or new composition implementation +is admitted. CV3-A preparation may proceed under its separately reviewed gates. diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/final-metadata-review.json b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/final-metadata-review.json new file mode 100644 index 00000000..d3184ac7 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/final-metadata-review.json @@ -0,0 +1,410 @@ +{ + "admission_review_prefix_unchanged": true, + "changed_inventory_fields": [ + "review_sha256", + "scope", + "source_sha256" + ], + "counts": { + "added": 11, + "changed": 16, + "removed": 0, + "total": 135, + "unchanged": 108 + }, + "decision": "APPROVED_EXACT_PREPARED_ADMISSION_BYTES_FOR_CLEAN_COMMIT_AND_FRESH_QUALIFICATION", + "delta_from_prior124": { + "added": [ + "src/bin/desktop/workflow_inspector.rs", + "src/bin/desktop/workflow_inspector_tests.rs", + "src/native_family.rs", + "src/native_family/tests.rs", + "src/recording/workflow.rs", + "src/solver_provider/composition.rs", + "src/solver_provider/composition/projection.rs", + "src/solver_provider/composition/projection_tests.rs", + "src/solver_provider/composition_tests.rs", + "src/workflow.rs", + "src/workflow/tests.rs" + ], + "changed": [ + "src/bin/desktop/ai_comparison/configured_track.rs", + "src/bin/desktop/comparison.rs", + "src/bin/desktop/inspector.rs", + "src/bin/desktop/run_sets/configured/archive.rs", + "src/bin/rheon-desktop.rs", + "src/lib.rs", + "src/liquid_step.rs", + "src/liquid_volume.rs", + "src/provider_step.rs", + "src/recording.rs", + "src/recording/provider.rs", + "src/recording/provider/runtime.rs", + "src/session/configured.rs", + "src/simulation.rs", + "src/solver_provider.rs", + "src/solver_provider/configured.rs" + ], + "removed": [], + "unchanged": [ + "Cargo.lock", + "Cargo.toml", + "examples/aligned_strain.rs", + "rust-toolchain.toml", + "src/advection.rs", + "src/aligned_strain.rs", + "src/bin/desktop/README.md", + "src/bin/desktop/accepted_session.rs", + "src/bin/desktop/ai_comparison/accepted_provider.rs", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs", + "src/bin/desktop/ai_comparison/adapter.rs", + "src/bin/desktop/ai_comparison/configured_track_tests.rs", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs", + "src/bin/desktop/ai_comparison/diagnostic_view.rs", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs", + "src/bin/desktop/ai_comparison/engine.rs", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs", + "src/bin/desktop/ai_comparison/mod.rs", + "src/bin/desktop/ai_comparison/model_process.rs", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs", + "src/bin/desktop/ai_comparison/record.rs", + "src/bin/desktop/ai_comparison/scene.rs", + "src/bin/desktop/ai_comparison/view.rs", + "src/bin/desktop/ai_comparison/worker.rs", + "src/bin/desktop/archive_view.rs", + "src/bin/desktop/build_identity.rs", + "src/bin/desktop/camera.rs", + "src/bin/desktop/carrier_execution.rs", + "src/bin/desktop/collision_ui.rs", + "src/bin/desktop/comparison_archive.rs", + "src/bin/desktop/comparison_field_view.rs", + "src/bin/desktop/configured_comparison_tests.rs", + "src/bin/desktop/configured_controls.rs", + "src/bin/desktop/configured_producer_exit_tests.rs", + "src/bin/desktop/configured_worker_tests.rs", + "src/bin/desktop/emitter_controls.rs", + "src/bin/desktop/engineering.rs", + "src/bin/desktop/export_ui.rs", + "src/bin/desktop/history.rs", + "src/bin/desktop/identity.rs", + "src/bin/desktop/particle_view.rs", + "src/bin/desktop/run_set_view.rs", + "src/bin/desktop/run_sets.rs", + "src/bin/desktop/run_sets/configured.rs", + "src/bin/desktop/run_sets/source.rs", + "src/bin/desktop/settings.rs", + "src/bin/desktop/transport_view.rs", + "src/bin/desktop/viewport.rs", + "src/bin/rheon-ai-compare.rs", + "src/bin/rheon.rs", + "src/box_flux.rs", + "src/box_flux_step.rs", + "src/collision.rs", + "src/column_mac.rs", + "src/column_momentum.rs", + "src/column_shear.rs", + "src/column_surface.rs", + "src/compressible.rs", + "src/coupled_discrete.rs", + "src/dense3d_sequence.rs", + "src/emitter.rs", + "src/emitter_controls.rs", + "src/export.rs", + "src/fitted_height.rs", + "src/fixed_bottom_ale.rs", + "src/forces.rs", + "src/free_surface.rs", + "src/geometry.rs", + "src/material.rs", + "src/material_session.rs", + "src/mesh_collision.rs", + "src/mesh_import.rs", + "src/motion.rs", + "src/observation.rs", + "src/obstacle_pressure.rs", + "src/obstacle_shear.rs", + "src/operator.rs", + "src/parallel.rs", + "src/particle_fluid.rs", + "src/pressure.rs", + "src/pressure_session.rs", + "src/recording/carrier.rs", + "src/recording/comparison.rs", + "src/recording/diagnostic.rs", + "src/recording/material.rs", + "src/recording/provider/comparison.rs", + "src/sampling.rs", + "src/scheduling.rs", + "src/session.rs", + "src/sgs.rs", + "src/solver_provider/context.rs", + "src/solver_provider/modal.rs", + "src/static_obstacle.rs", + "src/tracer_barrier.rs", + "src/translated_viscous.rs", + "src/viscosity.rs", + "src/vtk_export.rs", + "tests/aligned_strain_contract.rs", + "tests/obstacle_flow_contract.rs", + "tests/static_obstacle_contract.rs", + "tools/aligned_strain_oracle.py", + "tools/qualify_aligned_strain.py", + "tools/test_aligned_strain_oracle.py", + "tools/test_qualify_aligned_strain.py" + ] + }, + "delta_from_provisional": { + "src/recording/workflow.rs": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9" + }, + "execution_performed": false, + "findings": [], + "local_link_checks": [ + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/recording-compressible-integration/reports/dependency-licenses.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/approved-pins.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/preflight-followup.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/preflight-approved-pins.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md", + "target": "iteration-repair-34e2e73-review.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md", + "target": "provisional-readiness.json" + } + ], + "original_review_copies_byte_exact": { + "iteration-repair-34e2e73-review.json": true, + "iteration-repair-34e2e73-review.md": true, + "provisional-readiness.json": true, + "provisional-readiness.md": true, + "review.json": true, + "review.md": true + }, + "prepared_delta_sha256": { + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "3cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.json": "6d077af79ed944b6530bc8ebad0ca9aae938c2ef1881e29f09ecd8ded2e42dd5", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md": "525fbb4d62e7e9f5c9026d96b59f8b563deabb65ca7b3a2af1b6f058b3d54da0", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json": "9575a47fc5de49e23b56c7dd0a012716a775c15c07a27cbc785d6c2da2676b1a", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md": "d39582d2b8fd3720b0b8133c55703270312e1f13d45e05db3704afc0a0c5f91a", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.json": "5d8b7dfc68badb47fd81831b20ec3df6398bd9d8b37448f76f832dc58f8bdd9d", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md": "8b5deedb9f54700bda6efd0f75f6a08784e300d1d96892cc048391fea0548961" + }, + "preserved_mechanism_sha256": { + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "remaining_requirements": [ + "Commit exact approved prepared bytes into clean final subject.", + "Fresh unchanged18-command qualifier and actual packet26normal/26optimized with receipts bound to committed source/admission files.", + "Separate composed focused tests and applicable build/hosted gates; no transfer of old source evidence." + ], + "required_ancestry": { + "21d4122c3d0edb2ca5c3ce089175c70035d737a3": true, + "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2": true, + "97cdce614c3c4438fa65ac806b48c4de6490583e": true, + "c2fbbea9f19f818b28b6c6863a40220a2bd0bbe5": true, + "f75cd66c6dc4167ad1ec3febb72e6fb2aa6b4d0b": true + }, + "schema": "rheon-independent-final-staged-admission-review-v1", + "scope": "Fixed staged checkpoint only; future Q2 boundary repair excluded. Source admission permits qualification attempt, not numerical/physical/learned/performance/GUI/hosted acceptance. Prior evidence retains original subjects.", + "source_map_sha256": "9af9e8fceeb49febc428301ca51f0c428bfc25e38203d6eccd23fdece031e8e8", + "source_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "4753401d42674f6fc3a4990dc9acf534ef3b9d1c425c605375f74072fe334068", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "src/bin/desktop/settings.rs": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "577bc23f06a8cd794b16d42cd347a024d627443f3d1cf5d4a6230b21c76a24e2", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/forces.rs": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "c208229fd3f1d15a1597a2f85ec95c51a305b92232a1bfdd18a30d57e45f5510", + "src/liquid_step.rs": "b707f32f0a5c1102ebbde0776316fc5e7daddb23247c2a07e2d2f69355325baa", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "08a85d909ef6c566335675fddadbfdc245c42b4c894edf72aa41198036b0cd5f", + "src/recording/carrier.rs": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/material.rs": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "src/recording/provider.rs": "ca4abfb98c364cda5d3d830930ebe6773020e0d35aae756a33c718662e239b3d", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", + "src/session/configured.rs": "b5c8978e20cf6d1ed2b183a2cb506dc7a15041049b1dfb91935cac954f8070a2", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "00740d13df6f3ab88e362504bf63b833d693e51c05c95b189c677d2460520a18", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "e9a717ffc318c2345a4863369ff426c1f6d86f6ae4c3a5d312f2bfc459d33e4d", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "subject": { + "admission_metadata_uncommitted": true, + "git_status": " M docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md\n M docs/education/aligned-strain-native-sources-integration-20261014.json\n?? docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/\n", + "source_checkpoint": "f995923b84f0e963806654af292bd18073a7dcc9", + "source_tree": "42e565eb670c1a4d4294fb8043dec287da5ba26e" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/final-metadata-review.md b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/final-metadata-review.md new file mode 100644 index 00000000..87b00f1e --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/final-metadata-review.md @@ -0,0 +1,31 @@ +# Final staged source-admission review — 2026-10-20 + +Approved: the exact prepared admission metadata and six copied original reports may be committed with checkpoint `f995923b84f0e963806654af292bd18073a7dcc9` and used to attempt fresh qualification. No material finding remains in this bounded source-admission review. This is not an execution, merge, publication or physical-accuracy approval. + +The source checkpoint tree is `42e565eb670c1a4d4294fb8043dec287da5ba26e`. Two admission files are modified and the six-report directory is untracked; therefore this review intentionally covers prepared documentation bytes before their clean commit. The full eight-path SHA256 roster and all135 selected source pins are retained in review.json. Subsequent qualification must name the actual resulting clean commit, not this dirty preparation or an older receipt subject. + +## Independent verification + +- Reconstructed the unchanged conservative selector and verified all135 regular, nonsymlink files against both the checkpoint's committed blobs and working files. The closure is exactly11 added,16 changed,108 unchanged,0 removed versus the prior124. Canonical sorted compact source-map SHA256 is `9af9e8fceeb49febc428301ca51f0c428bfc25e38203d6eccd23fdece031e8e8`. +- Compared against the previously reviewed provisional135 map: exactly two selected changes, `src/workflow.rs` SHA256 `5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9` and `src/recording/workflow.rs` SHA256 `caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34`; the other133 identities are exact. Inspected this delta and its independent source review: completed native pressure counts are bounded by the actual descriptor cap and candidate counts are zero, including later-failed/cancelled attempts. The additional tests discriminate malformed standalone/cold RCT2 metadata while preserving native-at-cap, cap-zero candidate acceptance, rejected IEEE diagnostics and historical profiles. No new independent test execution is claimed. +- Verified the PR130 `c2fbbea9f19f818b28b6c6863a40220a2bd0bbe5`, PR131 `97cdce614c3c4438fa65ac806b48c4de6490583e` and repair `34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2` commits are checkpoint ancestors. The separate evaluator source/review retains always-on guard repair and its129 reported checks as tooling evidence, without converting synthetic/cardinality fixtures or original incomplete campaigns into scientific qualification. +- Verified the prior admission review is an exact byte prefix of the appended review. All six copied review files equal their original outside-Git receipts byte-for-byte. Reviewed their differing historical subjects/pending statuses as preserved history, not current acceptance declarations. All local links checked in the admission appendix and copied Markdown resolve, and fences are balanced. +- Verified unchanged v3 schema/base/predecessor identities, immutable primary/base ancestry and source-selection semantics. The v1/v2 bytes, selector/packet/checker, qualifier/oracle and their negative-test source files remain byte-identical to checkpoint and prior main `bc2f472787060d9a69cb619ed2c2fea10fd754b6`. The inventory changes only scope, source map and review digest; its review SHA matches the exact appended file. + +## Approved prepared bindings + +Inventory `docs/education/aligned-strain-native-sources-integration-20261014.json` SHA256: +`3cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330`. + +Appended `docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md` SHA256: +`9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c`. + +The scope prose was checked in its final readable form. The fixed staged checkpoint explicitly excludes the ongoing Q2 boundary repair. This resolves the prior coordination hold for this fixed source subject without waiving Q2's unresolved aperture/topology/assembly constraints. Any later repair requires separate exact-source review and applicable fresh qualification. P1 remains stopped, Q1 transport qualification incomplete, and physical/whole-family/learned accuracy unaccepted. The source identity review is not a topology or continuum proof. + +## Required next evidence + +Commit these exact approved prepared bytes, verify clean committed inputs, and run the unchanged18-command native/rational qualifier in a fresh external output with an isolated accurately disclosed target. Generate a new real packet from that executable and receipt; run all26 packet contracts normally and all26 under `-O`, without packet-dependent skips or `--allow-dirty`. Retain failures and bind head/tree/source/admission/artifact hashes before and after execution. No Lean claim follows without actual separate Lean execution. + +Run the focused composed workflow/native-family/composition contracts separately: the aligned-strain qualifier does not execute all added unit suites. Applicable hosted/build/window/performance gates retain their own subjects and limitations. Existing native-checker success establishes source bindings only. Do not append execution results to the now-bound admission record or mutate its inventory after qualification; retain results in a separate integration report. + +Reviewer wrote only outside-Git audit receipts. No builds, models, simulations, tests, implementation/admission edits, refs, PRs, or merge retries were performed. diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.json b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.json new file mode 100644 index 00000000..24ef74e2 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.json @@ -0,0 +1,42 @@ +{ + "schema": "rheon-g1-iteration-source-review-v1", + "status": "APPROVED_BOUNDED_EXACT_SOURCE_DELTA_EXECUTION_PENDING", + "reviewed_at_utc": "2026-10-20T02:36:22.315491+00:00", + "base": "43a084a66bdfb3731b24bd480909c81e317b1e53", + "head": "34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2", + "tree": "5c494bdcb8f1921461aed0daaa5ad8b07f914d7c", + "paths": { + "docs/plans/fluid-accuracy-composition/reports/g1-admission-iteration-protocol.md": "dc7c0377c546d1138fd12f59e640137fefb28afce00f2223395a35fa9b97f648", + "src/recording/workflow.rs": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9" + }, + "findings": [], + "source_disposition": "The11-line WorkflowAttempt validation addition closes the reviewed iteration consistency gap for new workflow evidence: every candidate diagnostic has iterations0; accepted native pressure is bounded by descriptor max_iterations; accepted configured pressure has iterations0. These checks apply to completed pressure prefixes even if a later interval stage cancels or fails.", + "legacy_compatibility": [ + "No old RCP2/RCP3/RCT1 parser or solver source changes.", + "Native iteration count equal to cap remains valid; no blanket positive-cap restriction. Correct configured candidate with cap0/iterations0 remains allowed.", + "Rejected candidate IEEE residual payloads remain preservable; only their iteration count is newly constrained.", + "RCP4 continues wrapping unchanged old receipt gates; matching forged inner/outer iteration metadata is not misrepresented as a newly discovered RCP4 bypass." + ], + "test_source_review": [ + "Three standalone malformed-count tests cover native, rejected and accepted configured diagnostics in accepted and later-cancelled/failed traces.", + "Valid-edge test covers native-at-cap, configured zero-cap and rejected nonfinite diagnostic bits through encode/decode.", + "RCP4 negative changes matching inner/outer iteration counts and checks existing legacy inner refusal.", + "Three real SQLite close/reopen terminal tests cover malformed native/rejected/accepted candidate counts with zero accepted rows, both cancellation and accepted-but-unrecorded tail.", + "Negative encoder fixture starts with an admissible real trace and tampers serialized count u64s after outbound validation, ensuring cold-decoder refusal is exercised." + ], + "execution": "No builds/tests/campaigns run in this independent source review; final owner execution/evidence handoff pending and not presumed.", + "admission": "This approves only the exact repair source delta. Final composed135-path hashes/delta, coordinated numerical/evaluator fixes, admission-owner action and fresh committed qualification remain separate; no active inventory approval or old receipt transfer.", + "protocol_note": "The historical educational v4 proposal remains text in the frozen protocol, followed by explicit authority amendment excluding all educational implementation from this worker. Lead mechanism decision remains separate.", + "mutations": "Only outside-Git review receipts written; no source/ref/PR/inventory changes.", + "private_composition_checked": { + "head": "d333d54f4eb941e8c9468aeaff36b4758c5efb05", + "tree": "f1bb09857f877207142045ea2b026ac209e54da6", + "selected_paths": 135, + "selected_two_file_delta": { + "src/recording/workflow.rs": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9" + }, + "remaining133_selected_hashes_unchanged": true + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md new file mode 100644 index 00000000..0d540fa7 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md @@ -0,0 +1,9 @@ +# Exact iteration repair source review + +Approved bounded source delta `43a084a` → `34e2e73bd8f25f2c7134ad1f9764fc48733e5ea2`; no findings. Execution handoff is pending. + +The new WorkflowAttempt validator enforces zero candidate diagnostic/configured acceptance iterations and native acceptance at or below the actual descriptor cap, including completed pressure prefixes of later failed/cancelled attempts. Native-at-cap, cap0/candidate0 and rejected nonfinite payload semantics remain intact. + +Only the two allocated Rust files and frozen protocol changed. Old profiles/solver arithmetic are untouched. Inline test source includes standalone, matching RCP4 old-inner controls, valid boundaries and actual close/reopen RCT2 malformed-count negatives. I did not execute those tests or reclassify prior qualification. + +Both reported Rust hashes match exact Git blobs. Full pins, test rationale and remaining coordination/admission limits are in [the receipt](iteration-repair-34e2e73-review.json). No repository, ref, PR or active inventory mutation. diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json new file mode 100644 index 00000000..10ec1991 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json @@ -0,0 +1,1275 @@ +{ + "schema": "rheon-provisional-complete-source-independent-review-v1", + "status": "PROVISIONAL_SOURCE_REVIEW_COMPLETE_NOT_ACTIVE_ADMISSION", + "reviewed_at_utc": "2026-10-20T02:30:33.854300+00:00", + "candidate_head": "6137e46ccfcc576b239dbe34f6700b84f109de38", + "candidate_tree": "8fa48084cd9e8af2dde077812fbc5d967efbd8f5", + "candidate_clean": true, + "review_input": "/workspace/rheon-native-admission-20261020-evidence/provisional-complete-closure.json", + "review_input_sha256": "ea0ea4b43b222b20b760d4ac7fc1af6c93e7a5b4467f08b9e0be8c663d873a2a", + "source_map_sha256": "de1f61379e0f5ad7dd3ff04180edee4591993fcbb958b805b51ce2df1f6c6e70", + "source_map_encoding": "SHA256(JSON source_sha256 sorted keys, compact separators, no trailing newline)", + "counts": { + "added": 11, + "changed": 16, + "unchanged": 108, + "removed": 0 + }, + "all_candidate_hashes_verified": true, + "all124_prior_admitted_identities_verified_at": "bc2f472787060d9a69cb619ed2c2fea10fd754b6", + "complete_selected_path_set_verified": "All current regular src/ and .cargo/ inputs, rust-toolchain*, and unchanged QUALIFICATION_INPUTS policy; exactly135, no omissions/removals/symlinks.", + "prior_inventory_sha256": "75415a192381d0457785526120c120f7ced9217169afbc64f2511e834c0ff20f", + "prior_review_sha256": "5836c3fa71bf20b72dbde79a2f5d27dd281ffc3930e0af7ad81f9039fd3edd42", + "new_material_findings": [], + "known_open_dependency": [ + { + "id": "iteration-count-consistency", + "scope": "WorkflowAttempt/RCP4/RCT2 accepted native max-iteration consistency and configured candidate fixed-zero iteration facts", + "owner": "separate assigned implementation/reviewer", + "disposition": "blocks final admission; review final coordinated patch and exact composed closure. Preserve RCP2/RCP3 legacy semantics." + }, + { + "id": "optimized-evaluator-guards", + "scope": "Separately owned frozen P1 adjoint/material and Q1 evaluator guard repair outside selected native closure", + "disposition": "do not claim final integration repair until delivered and independently reviewed; original frozen numerical failures remain." + } + ], + "qualification_reachability": { + "compiled_production": "Native lib registration reaches new workflow and native_family modules; composition registered by solver_provider; desktop registration reaches workflow_inspector and existing Worker recording path. Full native closure includes every src file independently of reachability.", + "new_unit_modules": [ + "workflow::tests", + "recording::workflow::tests", + "solver_provider::composition::tests", + "solver_provider::composition::projection::tests", + "native_family::tests", + "workflow_inspector::tests (desktop)" + ], + "unchanged_qualifier": "tools/qualify_aligned_strain.py tests named aligned_strain_contract, obstacle_flow_contract, static_obstacle_contract and example; builds actual library/example and checks independent finite aligned-strain rational/oracle/packet behavior. It does not run all new unit modules.", + "required_attribution": "Fresh composed focused unit execution must be separate from18-stage aligned-strain qualification. Prior f6/ac6/f161 component reports remain subject-pinned owner-reported evidence, not candidate execution/UI/physics acceptance.", + "explicit_ignored": "Native fixture preparation and release overhead are opt-in ignored desktop procedures; pinned learned-checkpoint ignores remain honest." + }, + "limits": [ + "Read-only review; no builds, numerical campaigns, active inventory changes, source edits, refs or PR mutations.", + "Only outside-Git review receipts/diff snapshots written.", + "No authentication, bit reproducibility, physical/model/GPU/UI/performance acceptance inferred.", + "Frozen negative P1/Q1 campaign outcomes and original protocols/oracles remain unchanged.", + "Final coordinated source heads, exact delta recheck, admission-owner approval, fresh clean committed native/rational/packet and scoped contract runs remain required." + ], + "paths": [ + { + "path": "Cargo.lock", + "disposition": "unchanged", + "admitted_sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "candidate_sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "Cargo.toml", + "disposition": "unchanged", + "admitted_sha256": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "candidate_sha256": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "examples/aligned_strain.rs", + "disposition": "unchanged", + "admitted_sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "candidate_sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "rust-toolchain.toml", + "disposition": "unchanged", + "admitted_sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "candidate_sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/advection.rs", + "disposition": "unchanged", + "admitted_sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "candidate_sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/aligned_strain.rs", + "disposition": "unchanged", + "admitted_sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "candidate_sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/README.md", + "disposition": "unchanged", + "admitted_sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "candidate_sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/accepted_session.rs", + "disposition": "unchanged", + "admitted_sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "candidate_sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider.rs", + "disposition": "unchanged", + "admitted_sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "candidate_sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "candidate_sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_provider_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "candidate_sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "candidate_sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/adapter.rs", + "disposition": "unchanged", + "admitted_sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "candidate_sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/configured_track.rs", + "disposition": "changed", + "admitted_sha256": "3959018b52697ef072884864c01de4682d1b4cd351c273426d914d02f0641fa1", + "candidate_sha256": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "classification": "production integration", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Adds monotone checked per-track attempt identity and clears previous observation before refusal; calls the existing observed Session path and retains only one bounded attempt. Existing process, cancellation and retirement owners remain." + }, + { + "path": "src/bin/desktop/ai_comparison/configured_track_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "candidate_sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/cpu_contract_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "candidate_sha256": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_runs.rs", + "disposition": "unchanged", + "admitted_sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "candidate_sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_view.rs", + "disposition": "unchanged", + "admitted_sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "candidate_sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_worker.rs", + "disposition": "unchanged", + "admitted_sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "candidate_sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "candidate_sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/engine.rs", + "disposition": "unchanged", + "admitted_sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "candidate_sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/engine_typed_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "candidate_sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/mod.rs", + "disposition": "unchanged", + "admitted_sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "candidate_sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/model_process.rs", + "disposition": "unchanged", + "admitted_sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "candidate_sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/prediction_contract_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "candidate_sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/record.rs", + "disposition": "unchanged", + "admitted_sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "candidate_sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/scene.rs", + "disposition": "unchanged", + "admitted_sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "candidate_sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/view.rs", + "disposition": "unchanged", + "admitted_sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "candidate_sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/ai_comparison/worker.rs", + "disposition": "unchanged", + "admitted_sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "candidate_sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/archive_view.rs", + "disposition": "unchanged", + "admitted_sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "candidate_sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/build_identity.rs", + "disposition": "unchanged", + "admitted_sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "candidate_sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/camera.rs", + "disposition": "unchanged", + "admitted_sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "candidate_sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/carrier_execution.rs", + "disposition": "unchanged", + "admitted_sha256": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "candidate_sha256": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/collision_ui.rs", + "disposition": "unchanged", + "admitted_sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "candidate_sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/comparison.rs", + "disposition": "changed", + "admitted_sha256": "ef52e29f4d9c59007c11ff973ed6a43c33ac9e1d583819ede11ebd7aea9ec0a5", + "candidate_sha256": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "classification": "production read-only consumer", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Loads only exact verified side/publication through existing member/Selection owners; key binds root, recipe, source set, pair and side. Errors invalidate page; no runtime or model loading. Added test rectangle is cfg(test)." + }, + { + "path": "src/bin/desktop/comparison_archive.rs", + "disposition": "unchanged", + "admitted_sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "candidate_sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/comparison_field_view.rs", + "disposition": "unchanged", + "admitted_sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "candidate_sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/configured_comparison_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "candidate_sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/configured_controls.rs", + "disposition": "unchanged", + "admitted_sha256": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "candidate_sha256": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/configured_producer_exit_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "candidate_sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/configured_worker_tests.rs", + "disposition": "unchanged", + "admitted_sha256": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "candidate_sha256": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/emitter_controls.rs", + "disposition": "unchanged", + "admitted_sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "candidate_sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/engineering.rs", + "disposition": "unchanged", + "admitted_sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "candidate_sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/export_ui.rs", + "disposition": "unchanged", + "admitted_sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "candidate_sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/history.rs", + "disposition": "unchanged", + "admitted_sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "candidate_sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/identity.rs", + "disposition": "unchanged", + "admitted_sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "candidate_sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/inspector.rs", + "disposition": "changed", + "admitted_sha256": "bb6bb83529896323fbf5414d6e7f41f8462b21e80a6d1f620edb6eecd2fc6649", + "candidate_sha256": "4753401d42674f6fc3a4990dc9acf534ef3b9d1c425c605375f74072fe334068", + "classification": "production read-only consumer / recording hook", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Existing recorder emits additive workflow profile; selected immutable cache holds exact attempt. Explicit selection/terminal actions validate evidence, failures clear graph; legacy RCT1 and new RCT2 remain distinct, unknown RCT versions refuse." + }, + { + "path": "src/bin/desktop/particle_view.rs", + "disposition": "unchanged", + "admitted_sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "candidate_sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/run_set_view.rs", + "disposition": "unchanged", + "admitted_sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "candidate_sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/run_sets.rs", + "disposition": "unchanged", + "admitted_sha256": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "candidate_sha256": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/run_sets/configured.rs", + "disposition": "unchanged", + "admitted_sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "candidate_sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/run_sets/configured/archive.rs", + "disposition": "changed", + "admitted_sha256": "eb1d8e77019eb57afd9e5fd5f57af55f8ff320527ec8efc935945bd7ff477806", + "candidate_sha256": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "classification": "production cold intent binding", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Adds RCT2 audit and binds actual workflow call digest, viscosity stage/value, horizon, dt and optional exact provider identity to frozen intent. Uses existing member/archive owner; no new archive or reconstruction of absent RHS." + }, + { + "path": "src/bin/desktop/run_sets/source.rs", + "disposition": "unchanged", + "admitted_sha256": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "candidate_sha256": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/settings.rs", + "disposition": "unchanged", + "admitted_sha256": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "candidate_sha256": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/transport_view.rs", + "disposition": "unchanged", + "admitted_sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "candidate_sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/viewport.rs", + "disposition": "unchanged", + "admitted_sha256": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "candidate_sha256": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/desktop/workflow_inspector.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "classification": "production presentation", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Consumes validated cached attempts; explicit terminal load is separate from paint. Exact source/comparison changes invalidate prior graph. Finite typed nodes/units, unavailable facts, keyboard/pointer focus, bounded zoom/pan and evidence scroll preserve read-only scope." + }, + { + "path": "src/bin/desktop/workflow_inspector_tests.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "577bc23f06a8cd794b16d42cd347a024d627443f3d1cf5d4a6230b21c76a24e2", + "classification": "desktop unit contracts / opt-in procedures", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Real observed Session and existing Worker fixtures cover archive/model removal, legacy unavailability, exact comparison sides, generation-zero terminal and egui events/invalidation. Native-fixture preparation and release overhead procedures are explicitly ignored, not ordinary-suite passes; no learned or physical accuracy claim." + }, + { + "path": "src/bin/rheon-ai-compare.rs", + "disposition": "unchanged", + "admitted_sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "candidate_sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/bin/rheon-desktop.rs", + "disposition": "changed", + "admitted_sha256": "76a92d5c928919f832904395319644f14eb36bc2e1c33aeab1146d4b1480ce48", + "candidate_sha256": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "classification": "production caller wiring", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Registers workflow inspector; existing Worker finalizes additive WorkflowTermination with retained runtime/attempt facts. Existing App live/archive/comparison navigation invokes cached view and explicit selection. No second worker, stepping loop, store or process supervisor." + }, + { + "path": "src/bin/rheon.rs", + "disposition": "unchanged", + "admitted_sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "candidate_sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/box_flux.rs", + "disposition": "unchanged", + "admitted_sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "candidate_sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/box_flux_step.rs", + "disposition": "unchanged", + "admitted_sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "candidate_sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/collision.rs", + "disposition": "unchanged", + "admitted_sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "candidate_sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/column_mac.rs", + "disposition": "unchanged", + "admitted_sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "candidate_sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/column_momentum.rs", + "disposition": "unchanged", + "admitted_sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "candidate_sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/column_shear.rs", + "disposition": "unchanged", + "admitted_sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "candidate_sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/column_surface.rs", + "disposition": "unchanged", + "admitted_sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "candidate_sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/compressible.rs", + "disposition": "unchanged", + "admitted_sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "candidate_sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/coupled_discrete.rs", + "disposition": "unchanged", + "admitted_sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "candidate_sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/dense3d_sequence.rs", + "disposition": "unchanged", + "admitted_sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "candidate_sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/emitter.rs", + "disposition": "unchanged", + "admitted_sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "candidate_sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/emitter_controls.rs", + "disposition": "unchanged", + "admitted_sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "candidate_sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/export.rs", + "disposition": "unchanged", + "admitted_sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "candidate_sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/fitted_height.rs", + "disposition": "unchanged", + "admitted_sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "candidate_sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/fixed_bottom_ale.rs", + "disposition": "unchanged", + "admitted_sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "candidate_sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/forces.rs", + "disposition": "unchanged", + "admitted_sha256": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "candidate_sha256": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/free_surface.rs", + "disposition": "unchanged", + "admitted_sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "candidate_sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/geometry.rs", + "disposition": "unchanged", + "admitted_sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "candidate_sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/lib.rs", + "disposition": "changed", + "admitted_sha256": "c6dfcf187c1cb2bb64835bd7c72a7094b6127730c55bb6ee47d2e676354317ff", + "candidate_sha256": "c208229fd3f1d15a1597a2f85ec95c51a305b92232a1bfdd18a30d57e45f5510", + "classification": "public module registration", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Only adds native_family and workflow exports; prior exports and numerical implementations remain. Registration makes their non-test dependencies part of the complete compiled crate closure." + }, + { + "path": "src/liquid_step.rs", + "disposition": "changed", + "admitted_sha256": "f99dce6a99f6af8a9aef2436af7f33de58dac3be5998a48e9187fbdf2acc3f93", + "candidate_sha256": "b707f32f0a5c1102ebbde0776316fc5e7daddb23247c2a07e2d2f69355325baa", + "classification": "production atomic publication observation", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Passes bounded capture through existing carrier preparation, marks completed represented-volume stage and creates accepted workflow before infallible original pressure/owner publication. Disabled versus applied-zero viscosity stays explicit; failures do not swap accepted owners." + }, + { + "path": "src/liquid_volume.rs", + "disposition": "changed", + "admitted_sha256": "24623038f62261ce6a17b034e9b6d82c5f0aba02dd0df7aad174c885ed2a8c96", + "candidate_sha256": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "classification": "public numerical API / Q1 transport", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Adds explicit periodic represented-volume boundary policy while preserving original box prepare/commit. Requires AllCells/no columns, paired normal seam velocities, computes lower seam transfer once, mirrors exact high seam and excludes periodic seam from external flux. Source and cancellation gates remain; no periodic pressure or coupled-Stokes admission." + }, + { + "path": "src/material.rs", + "disposition": "unchanged", + "admitted_sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "candidate_sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/material_session.rs", + "disposition": "unchanged", + "admitted_sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "candidate_sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/mesh_collision.rs", + "disposition": "unchanged", + "admitted_sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "candidate_sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/mesh_import.rs", + "disposition": "unchanged", + "admitted_sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "candidate_sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/motion.rs", + "disposition": "unchanged", + "admitted_sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "candidate_sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/native_family.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "classification": "public borrowed facade / C1-A", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Closed MAC versus particle-preview dispatch checks declared Session identity/generation before owner callbacks, then delegates native validation/time/quota/cancel/publication. Borrowed snapshot prevents concurrent stepping. Transfers and whole-family substitution explicitly unavailable; declaration equality is not authenticity." + }, + { + "path": "src/native_family/tests.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "classification": "core unit contracts / C1-A", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Direct original-owner comparisons cover 100 MAC intervals, particle controls/short dt, exact field borrows, wrong family/source/generation, cancellation/deadline/final-commit rollback, quota/stop and refused transfers. Classical native equivalence only, not inter-family physical equivalence." + }, + { + "path": "src/observation.rs", + "disposition": "unchanged", + "admitted_sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "candidate_sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/obstacle_pressure.rs", + "disposition": "unchanged", + "admitted_sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "candidate_sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/obstacle_shear.rs", + "disposition": "unchanged", + "admitted_sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "candidate_sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/operator.rs", + "disposition": "unchanged", + "admitted_sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "candidate_sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/parallel.rs", + "disposition": "unchanged", + "admitted_sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "candidate_sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/particle_fluid.rs", + "disposition": "unchanged", + "admitted_sha256": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "candidate_sha256": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/pressure.rs", + "disposition": "unchanged", + "admitted_sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "candidate_sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/pressure_session.rs", + "disposition": "unchanged", + "admitted_sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "candidate_sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/provider_step.rs", + "disposition": "changed", + "admitted_sha256": "79167b70a8d164a2367f43816feab443eefb41f23bc4bd940716dd5fd32d495b", + "candidate_sha256": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "classification": "production pressure observation hook", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Existing operator builds actual RHS once; records its digest and delegates to solve_observed with original request/settings/provider/cancel. No new pressure arithmetic or alternative numerical owner." + }, + { + "path": "src/recording.rs", + "disposition": "changed", + "admitted_sha256": "d022f8f46c288538298896ae444c9780265a6bf77fa9a4e1ba4b9732cf026eb2", + "candidate_sha256": "08a85d909ef6c566335675fddadbfdc245c42b4c894edf72aa41198036b0cd5f", + "classification": "recording module registration", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Only adds public workflow module under existing recording owner. SQLite envelope/application identity, transactions, budgets, field checks and terminal rules otherwise unchanged." + }, + { + "path": "src/recording/carrier.rs", + "disposition": "unchanged", + "admitted_sha256": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "candidate_sha256": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/recording/comparison.rs", + "disposition": "unchanged", + "admitted_sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "candidate_sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/recording/diagnostic.rs", + "disposition": "unchanged", + "admitted_sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "candidate_sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/recording/material.rs", + "disposition": "unchanged", + "admitted_sha256": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "candidate_sha256": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/recording/provider.rs", + "disposition": "changed", + "admitted_sha256": "980ea5af7094016b13e7d0f39110aa2ff673b0173416e0fe583e6266b7c27f57", + "candidate_sha256": "ca4abfb98c364cda5d3d830930ebe6773020e0d35aae756a33c718662e239b3d", + "classification": "production additive codec validation", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Unwraps RCP4 into original RCP2/3 controls; binds workflow source and receipt, checks consecutive native-state digests and increasing attempt identities during full verification. Existing encoder/decoder helpers are shared within recording; original profile encoding preserved." + }, + { + "path": "src/recording/provider/comparison.rs", + "disposition": "unchanged", + "admitted_sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "candidate_sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/recording/provider/runtime.rs", + "disposition": "changed", + "admitted_sha256": "d7b2a1f7cfa866b33887f7c8f804999058d6e70a1c9d71421372d151152ebccb", + "candidate_sha256": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "classification": "production additive terminal decode", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Unwraps RCT2 into original RCT1, validates source/attempt/runtime association, and shares only existing bounded binding/encoding helpers. Original runtime observation ownership remains; no model execution on decode." + }, + { + "path": "src/recording/workflow.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "b8b19b21b9ddf57917c3471181c9446777e2c0962643fedb4f1869331c2557d6", + "classification": "production additive recording codec plus inline contracts", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "RCP4/RCT2 wrap exact prior payload bytes inside existing SQLite v1; strict bounded node/enumeration/text decoding and source, publication, request, runtime, previous-native-state and terminal associations. Tests cover close/reopen, generation-zero cancellation, forged cross-links/IDs, unknown versions, legacy absence and unrecorded accepted tails. Iteration-count consistency is the known separately owned pending repair." + }, + { + "path": "src/sampling.rs", + "disposition": "unchanged", + "admitted_sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "candidate_sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/scheduling.rs", + "disposition": "unchanged", + "admitted_sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "candidate_sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/session.rs", + "disposition": "unchanged", + "admitted_sha256": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", + "candidate_sha256": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/session/configured.rs", + "disposition": "changed", + "admitted_sha256": "d99ae990e9c7ddc956f95f414a25832411a4dc84ab434df95ff9f8f68cf52a83", + "candidate_sha256": "b5c8978e20cf6d1ed2b183a2cb506dc7a15041049b1dfb91935cac954f8070a2", + "classification": "public observed Session attempt API", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Wraps actual synchronous Session attempt in bounded metadata capture; separates attempt ID from accepted generation, observes actual interval start/dt, retains failed/cancelled/refused prefixes and publishes accepted receipt only with original atomic interval. Caller owns monotonically increasing explicit IDs; existing default method remains available." + }, + { + "path": "src/sgs.rs", + "disposition": "unchanged", + "admitted_sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "candidate_sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/simulation.rs", + "disposition": "changed", + "admitted_sha256": "8dea790daf2a2d0801db3003094f9fffe034c9b87946d520a1eacc266c95f078", + "candidate_sha256": "00740d13df6f3ab88e362504bf63b833d693e51c05c95b189c677d2460520a18", + "classification": "production numerical-owner observations", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Adds optional capture on existing configured path and emits actual dt/completed numerical stages plus actual projected divergence. Existing advection, forces, viscosity, pressure, tracer arithmetic and acceptance conditions remain; no alternate solver or control loop." + }, + { + "path": "src/solver_provider.rs", + "disposition": "changed", + "admitted_sha256": "0ab7db08a9016e73d664c730e4ff513d42599a84c680ea061e6604859432a5a5", + "candidate_sha256": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "classification": "production dispatcher observations / registration", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Registers composition API and adds internal solve_observed while legacy solve delegates with None. Records actual threshold, candidate qualification, fallback start/selection around unchanged pressure dispatcher. Known workflow iteration-count consistency must be repaired without strengthening historical pressure-v1 behavior." + }, + { + "path": "src/solver_provider/composition.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "classification": "public borrowed selection / C1-A", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Only PressureV1 selects existing ProviderWorkspace; unsupported subgraph/whole-family labels refuse without workspace changes. QualifiedPressureV1 borrows exact host-qualified pressure; not corrected velocity or Session state. Compile-fail borrow example prevents overwrite." + }, + { + "path": "src/solver_provider/composition/projection.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "e9a717ffc318c2345a4863369ff426c1f6d86f6ae4c3a5d312f2bfc459d33e4d", + "classification": "public stateless supplied-array qualifier / C1-B1", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Immutable inputs bind exact grid/IEEE fields/settings/source declaration/representation to digest. Strict closed geometry/header refusals precede callbacks. Capped scratch validates supplied pressure and bit-exact in-place momentum witness, original dispatcher gates and actual f32 divergence; native fallback restarts from same immutable input, retaining discarded candidate report. Returns disposable borrowed arrays; no provider execution or Session adoption." + }, + { + "path": "src/solver_provider/composition/projection_tests.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "classification": "core unit contracts / C1-B1", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Both native methods cover nonzero RHS, 100 independent fixed-input requests, divergence-free wrong momentum, signed-zero/wall bits, exact input/representation binding, bad fields/gauge/residual, all cooperative cancel phases, clean retry, native iteration failure, actual-divergence fallback and aggregate managed-array cap. Explicitly not 100 integrated trajectories." + }, + { + "path": "src/solver_provider/composition_tests.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "classification": "core unit contracts / C1-A", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Matches original pressure dispatcher outcomes/fields/requests for exact and adversarial classical candidates, invalid inputs/cancellation and unavailable scopes. Preserves legacy max_iterations=0 candidate acceptance instead of silently redefining pressure-v1." + }, + { + "path": "src/solver_provider/configured.rs", + "disposition": "changed", + "admitted_sha256": "124ca65dd1dec3a8a89043198fb085453a42ca8aff0dc87c67b04b6a986109be", + "candidate_sha256": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "classification": "production configured-provider observation adapter", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Adds bounded workflow field and support/predict observations around actual existing calls; retains validated package identity and authoritative context stamp. prediction_called remains a trait invocation fact, not IPC dispatch. No runtime or history owner added." + }, + { + "path": "src/solver_provider/context.rs", + "disposition": "unchanged", + "admitted_sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "candidate_sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/solver_provider/modal.rs", + "disposition": "unchanged", + "admitted_sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "candidate_sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/static_obstacle.rs", + "disposition": "unchanged", + "admitted_sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "candidate_sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/tracer_barrier.rs", + "disposition": "unchanged", + "admitted_sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "candidate_sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/translated_viscous.rs", + "disposition": "unchanged", + "admitted_sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "candidate_sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/viscosity.rs", + "disposition": "unchanged", + "admitted_sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "candidate_sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/vtk_export.rs", + "disposition": "unchanged", + "admitted_sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "candidate_sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "src/workflow.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "a04319def8bcb604c81aab6088cb19f4f09043e77542dda583e4782e2e4edd67", + "classification": "public bounded observation contract / internal capture", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Finite typed sealed-MAC descriptor/edges and ordered actual-attempt prefixes; exact parameter/native-field/request digests, explicit optional diagnostics and bounded metadata. Source consistency is not physics proof/authentication. No executable graph; existing numerical owners emit facts. Known report-iteration consistency is provisional pending assigned fix." + }, + { + "path": "src/workflow/tests.rs", + "disposition": "added", + "admitted_sha256": null, + "candidate_sha256": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "classification": "core unit contracts / G1", + "review_disposition": "provisionally source reviewed; coordinated final delta required", + "rationale": "Real Session fixtures cover support/invalid-output fallback and applied-zero stage, multiple cancellation positions, exact shortened interval/native fields, descriptor/request/control corruption, stage prefixes and generation-zero refusal. Does not establish real-window rendering or continuum accuracy." + }, + { + "path": "tests/aligned_strain_contract.rs", + "disposition": "unchanged", + "admitted_sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "candidate_sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "tests/obstacle_flow_contract.rs", + "disposition": "unchanged", + "admitted_sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "candidate_sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "tests/static_obstacle_contract.rs", + "disposition": "unchanged", + "admitted_sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "candidate_sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "tools/aligned_strain_oracle.py", + "disposition": "unchanged", + "admitted_sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "candidate_sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "tools/qualify_aligned_strain.py", + "disposition": "unchanged", + "admitted_sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "candidate_sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "tools/test_aligned_strain_oracle.py", + "disposition": "unchanged", + "admitted_sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "candidate_sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + }, + { + "path": "tools/test_qualify_aligned_strain.py", + "disposition": "unchanged", + "admitted_sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "candidate_sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "classification": "exact prior admitted identity reused", + "review_disposition": "unchanged identity verified", + "rationale": "Candidate regular-file SHA256 equals the existing admitted digest and the exact prior admitted bytes at bc2f472787060d9a69cb619ed2c2fea10fd754b6; reuse prior admission/review for this file, without transferring prior execution receipts to the candidate." + } + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md new file mode 100644 index 00000000..3414c533 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md @@ -0,0 +1,49 @@ +# Provisional complete selected-source review + +Candidate `6137e46ccfcc576b239dbe34f6700b84f109de38`, tree `8fa48084cd9e8af2dde077812fbc5d967efbd8f5`. + +**Provisional source review complete; not active admission or qualification.** No additional material finding beyond the separately owned iteration-count consistency repair. Final coordinated fixes require exact-delta review before admission. + +Verified all135 regular-file hashes and the complete selected path set:11 added,16 changed,108 exact admitted identities reused,0 removed. Canonical source-map SHA256 `de1f61379e0f5ad7dd3ff04180edee4591993fcbb958b805b51ce2df1f6c6e70`. All124 predecessor identities match exact bc2f472 bytes; the inventory’s historical reviewed_base remains distinct. + +The27 new/changed paths were read for implementation, ownership, contracts and tests. Their per-file dispositions and all108 unchanged identities are in [provisional-readiness.json](provisional-readiness.json). + +## Qualification boundary + +The unchanged aligned-strain qualifier compiles the production crate and runs its selected existing contracts/native/rational checks. It does not execute the added workflow/native-family/composition unit suites. Fresh composed focused execution must be reported separately; prior component receipts remain bound to their original subjects. Opt-in desktop fixture/performance helpers and unavailable checkpoint tests remain ignored unless actually executed. + +No second numerical owner, process supervisor, worker loop or archive was introduced in these inspected paths. C1-A borrows existing owners; C1-B1 qualifies immutable supplied arrays in disposable capped scratch without provider invocation or Session adoption. G1 observes existing execution and wraps historical payloads additively in the existing SQLite owner. Q1 periodic represented-volume transport remains separate from periodic pressure/whole-Stokes or accuracy admission. + +Known iteration-count fixes and separately owned optimized-evaluator guards remain pending coordinated delivery. No source/active inventory/ref/PR mutation or duplicate builds were performed. This review establishes no physical, model, native-window, performance, authentication or reproducibility claim. + +## Added/changed path dispositions + +| Path | Classification and rationale | +| --- | --- | +| `src/bin/desktop/ai_comparison/configured_track.rs` | **production integration.** Adds monotone checked per-track attempt identity and clears previous observation before refusal; calls the existing observed Session path and retains only one bounded attempt. Existing process, cancellation and retirement owners remain. | +| `src/bin/desktop/comparison.rs` | **production read-only consumer.** Loads only exact verified side/publication through existing member/Selection owners; key binds root, recipe, source set, pair and side. Errors invalidate page; no runtime or model loading. Added test rectangle is cfg(test). | +| `src/bin/desktop/inspector.rs` | **production read-only consumer / recording hook.** Existing recorder emits additive workflow profile; selected immutable cache holds exact attempt. Explicit selection/terminal actions validate evidence, failures clear graph; legacy RCT1 and new RCT2 remain distinct, unknown RCT versions refuse. | +| `src/bin/desktop/run_sets/configured/archive.rs` | **production cold intent binding.** Adds RCT2 audit and binds actual workflow call digest, viscosity stage/value, horizon, dt and optional exact provider identity to frozen intent. Uses existing member/archive owner; no new archive or reconstruction of absent RHS. | +| `src/bin/desktop/workflow_inspector.rs` | **production presentation.** Consumes validated cached attempts; explicit terminal load is separate from paint. Exact source/comparison changes invalidate prior graph. Finite typed nodes/units, unavailable facts, keyboard/pointer focus, bounded zoom/pan and evidence scroll preserve read-only scope. | +| `src/bin/desktop/workflow_inspector_tests.rs` | **desktop unit contracts / opt-in procedures.** Real observed Session and existing Worker fixtures cover archive/model removal, legacy unavailability, exact comparison sides, generation-zero terminal and egui events/invalidation. Native-fixture preparation and release overhead procedures are explicitly ignored, not ordinary-suite passes; no learned or physical accuracy claim. | +| `src/bin/rheon-desktop.rs` | **production caller wiring.** Registers workflow inspector; existing Worker finalizes additive WorkflowTermination with retained runtime/attempt facts. Existing App live/archive/comparison navigation invokes cached view and explicit selection. No second worker, stepping loop, store or process supervisor. | +| `src/lib.rs` | **public module registration.** Only adds native_family and workflow exports; prior exports and numerical implementations remain. Registration makes their non-test dependencies part of the complete compiled crate closure. | +| `src/liquid_step.rs` | **production atomic publication observation.** Passes bounded capture through existing carrier preparation, marks completed represented-volume stage and creates accepted workflow before infallible original pressure/owner publication. Disabled versus applied-zero viscosity stays explicit; failures do not swap accepted owners. | +| `src/liquid_volume.rs` | **public numerical API / Q1 transport.** Adds explicit periodic represented-volume boundary policy while preserving original box prepare/commit. Requires AllCells/no columns, paired normal seam velocities, computes lower seam transfer once, mirrors exact high seam and excludes periodic seam from external flux. Source and cancellation gates remain; no periodic pressure or coupled-Stokes admission. | +| `src/native_family.rs` | **public borrowed facade / C1-A.** Closed MAC versus particle-preview dispatch checks declared Session identity/generation before owner callbacks, then delegates native validation/time/quota/cancel/publication. Borrowed snapshot prevents concurrent stepping. Transfers and whole-family substitution explicitly unavailable; declaration equality is not authenticity. | +| `src/native_family/tests.rs` | **core unit contracts / C1-A.** Direct original-owner comparisons cover 100 MAC intervals, particle controls/short dt, exact field borrows, wrong family/source/generation, cancellation/deadline/final-commit rollback, quota/stop and refused transfers. Classical native equivalence only, not inter-family physical equivalence. | +| `src/provider_step.rs` | **production pressure observation hook.** Existing operator builds actual RHS once; records its digest and delegates to solve_observed with original request/settings/provider/cancel. No new pressure arithmetic or alternative numerical owner. | +| `src/recording.rs` | **recording module registration.** Only adds public workflow module under existing recording owner. SQLite envelope/application identity, transactions, budgets, field checks and terminal rules otherwise unchanged. | +| `src/recording/provider.rs` | **production additive codec validation.** Unwraps RCP4 into original RCP2/3 controls; binds workflow source and receipt, checks consecutive native-state digests and increasing attempt identities during full verification. Existing encoder/decoder helpers are shared within recording; original profile encoding preserved. | +| `src/recording/provider/runtime.rs` | **production additive terminal decode.** Unwraps RCT2 into original RCT1, validates source/attempt/runtime association, and shares only existing bounded binding/encoding helpers. Original runtime observation ownership remains; no model execution on decode. | +| `src/recording/workflow.rs` | **production additive recording codec plus inline contracts.** RCP4/RCT2 wrap exact prior payload bytes inside existing SQLite v1; strict bounded node/enumeration/text decoding and source, publication, request, runtime, previous-native-state and terminal associations. Tests cover close/reopen, generation-zero cancellation, forged cross-links/IDs, unknown versions, legacy absence and unrecorded accepted tails. Iteration-count consistency is the known separately owned pending repair. | +| `src/session/configured.rs` | **public observed Session attempt API.** Wraps actual synchronous Session attempt in bounded metadata capture; separates attempt ID from accepted generation, observes actual interval start/dt, retains failed/cancelled/refused prefixes and publishes accepted receipt only with original atomic interval. Caller owns monotonically increasing explicit IDs; existing default method remains available. | +| `src/simulation.rs` | **production numerical-owner observations.** Adds optional capture on existing configured path and emits actual dt/completed numerical stages plus actual projected divergence. Existing advection, forces, viscosity, pressure, tracer arithmetic and acceptance conditions remain; no alternate solver or control loop. | +| `src/solver_provider.rs` | **production dispatcher observations / registration.** Registers composition API and adds internal solve_observed while legacy solve delegates with None. Records actual threshold, candidate qualification, fallback start/selection around unchanged pressure dispatcher. Known workflow iteration-count consistency must be repaired without strengthening historical pressure-v1 behavior. | +| `src/solver_provider/composition.rs` | **public borrowed selection / C1-A.** Only PressureV1 selects existing ProviderWorkspace; unsupported subgraph/whole-family labels refuse without workspace changes. QualifiedPressureV1 borrows exact host-qualified pressure; not corrected velocity or Session state. Compile-fail borrow example prevents overwrite. | +| `src/solver_provider/composition/projection.rs` | **public stateless supplied-array qualifier / C1-B1.** Immutable inputs bind exact grid/IEEE fields/settings/source declaration/representation to digest. Strict closed geometry/header refusals precede callbacks. Capped scratch validates supplied pressure and bit-exact in-place momentum witness, original dispatcher gates and actual f32 divergence; native fallback restarts from same immutable input, retaining discarded candidate report. Returns disposable borrowed arrays; no provider execution or Session adoption. | +| `src/solver_provider/composition/projection_tests.rs` | **core unit contracts / C1-B1.** Both native methods cover nonzero RHS, 100 independent fixed-input requests, divergence-free wrong momentum, signed-zero/wall bits, exact input/representation binding, bad fields/gauge/residual, all cooperative cancel phases, clean retry, native iteration failure, actual-divergence fallback and aggregate managed-array cap. Explicitly not 100 integrated trajectories. | +| `src/solver_provider/composition_tests.rs` | **core unit contracts / C1-A.** Matches original pressure dispatcher outcomes/fields/requests for exact and adversarial classical candidates, invalid inputs/cancellation and unavailable scopes. Preserves legacy max_iterations=0 candidate acceptance instead of silently redefining pressure-v1. | +| `src/solver_provider/configured.rs` | **production configured-provider observation adapter.** Adds bounded workflow field and support/predict observations around actual existing calls; retains validated package identity and authoritative context stamp. prediction_called remains a trait invocation fact, not IPC dispatch. No runtime or history owner added. | +| `src/workflow.rs` | **public bounded observation contract / internal capture.** Finite typed sealed-MAC descriptor/edges and ordered actual-attempt prefixes; exact parameter/native-field/request digests, explicit optional diagnostics and bounded metadata. Source consistency is not physics proof/authentication. No executable graph; existing numerical owners emit facts. Known report-iteration consistency is provisional pending assigned fix. | +| `src/workflow/tests.rs` | **core unit contracts / G1.** Real Session fixtures cover support/invalid-output fallback and applied-zero stage, multiple cancellation positions, exact shortened interval/native fields, descriptor/request/control corruption, stage prefixes and generation-zero refusal. Does not establish real-window rendering or continuum accuracy. | diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification-9c04278-review.json b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification-9c04278-review.json new file mode 100644 index 00000000..1016092a --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification-9c04278-review.json @@ -0,0 +1,114 @@ +{ + "schema": "rheon-staged-native-qualification-independent-audit-v1", + "status": "APPROVED_EXACT_EXECUTED_RECEIPTS_AND_BOUNDED_COUNTS", + "reviewed_at_utc": "2026-10-20T02:51:38.510654+00:00", + "executed_source_head": "9c04278e6cdd44418628c35f944c1730cbe6173e", + "executed_source_tree": "b2008a22a65246c5a38c632437c1acc30a8cb27a", + "source_receipt_hashes_verified": 1437, + "selected_closure_count": 135, + "selected_map_sha256": "9af9e8fceeb49febc428301ca51f0c428bfc25e38203d6eccd23fdece031e8e8", + "selected_delta_since_provisional": { + "src/recording/workflow.rs": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9" + }, + "admission_inventory_sha256": "3cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330", + "bound_review_sha256": "9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c", + "summary_sha256": "dc028788768c8a2035e85ce1f956d185fdd699ff7657ba2d757213c995369939", + "native_receipt_sha256": "6df83df7782357a522cb5a9d645d2934ee902916e762e4c5a3f75e9fe26082d7", + "native_commands": 18, + "native_all_exits_zero": true, + "native_rust_tests": 35, + "native_rational_specimens": 5, + "focused_contract_total": 72, + "packet_tests_each_mode": 26, + "all_logged_skips_ignores_failures": 0, + "verified_log_counts": { + "native-qualified-v1/rust-contracts.log": { + "passed": 35, + "failed": 0, + "ignored": 0 + }, + "focused-workflow.log": { + "passed": 23, + "failed": 0, + "ignored": 0 + }, + "focused-native-family.log": { + "passed": 9, + "failed": 0, + "ignored": 0 + }, + "focused-composition.log": { + "passed": 14, + "failed": 0, + "ignored": 0 + }, + "focused-volume.log": { + "passed": 23, + "failed": 0, + "ignored": 0 + }, + "borrow-doctests.log": { + "passed": 3, + "failed": 0, + "ignored": 0 + }, + "packet-tests-normal.log": { + "passed": 26, + "failed": 0, + "skipped": 0 + }, + "packet-tests-optimized.log": { + "passed": 26, + "failed": 0, + "skipped": 0 + }, + "native-qualified-v1/qualification-gate-tests.log": { + "passed": 5, + "failed": 0, + "skipped": 0 + }, + "native-qualified-v1/qualification-gate-tests-optimized.log": { + "passed": 5, + "failed": 0, + "skipped": 0 + }, + "native-qualified-v1/oracle-tests.log": { + "passed": 10, + "failed": 0, + "skipped": 0 + }, + "native-qualified-v1/oracle-tests-optimized.log": { + "passed": 10, + "failed": 0, + "skipped": 0 + } + }, + "verified_evidence_file_count": 48, + "verified_native_artifact_count": 28, + "actual_retained_ELF_sha256": "7eb04fe27e4702a7bae70322d2b98c32a4ab97af0fde15e769bc3bbf2a06bc0e", + "archive": { + "path": "/workspace/rheon-native-admission-stage-9c04278.zip", + "bytes": 726459, + "sha256": "d11247940d0365ae1cab1c7e069a19ac15f8672e9ed9274a5f973f9ff0846630", + "entries_byte_verified": 48, + "crc_ok": true + }, + "current_checkout_observation": { + "head": "afa6191cbebb64c298ae4d99d1273b2e079e46e5", + "tree": "b2008a22a65246c5a38c632437c1acc30a8cb27a", + "same_tree_as_execution": true, + "clean": true + }, + "findings": [], + "scope_limits": [ + "Exact executed subject remains 9c04278; later ancestry-only heads do not become newly executed subjects.", + "Finite aligned-strain algebra/native/rational/real-packet and focused no-default contracts only; not behavioral coverage of all 135 modules.", + "23 workflow includes 7 core workflow and 16 recording workflow; 9 native-family; 14 composition includes 11 projection and 3 facade; 23 volume includes 18 box and 5 periodic; 3 compile-fail borrow doctests.", + "No duplicate builds, tests, campaigns or source/ref/PR mutations performed by this reviewer.", + "No fresh Lean, default/desktop, hosted Pages/browser, native-window, performance, learned-model or physical qualification.", + "Q2 future boundary repair remains excluded; original negative P1/Q1 results retain their subjects.", + "Source/artifact digest integrity is not authenticity or bit reproducibility." + ], + "evidence_root": "/workspace/rheon-native-admission-20261020-evidence" +} diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification-9c04278-review.md b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification-9c04278-review.md new file mode 100644 index 00000000..7dd27aae --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification-9c04278-review.md @@ -0,0 +1,17 @@ +# Independent staged qualification audit + +Approved the reported bounded execution and artifact custody for **9c04278e6cdd44418628c35f944c1730cbe6173e**, tree **b2008a22a65246c5a38c632437c1acc30a8cb27a**. No findings. + +Verified all 1,437 receipt source hashes against exact committed blobs, the complete 135-path selected closure, admission/review binding, all 48 retained evidence-file hashes, 28 native artifact hashes, the actual built and retained ELF, and all 48 ZIP members byte-for-byte with valid CRCs. The current ancestry-only afa6191 checkout had the same tree and was clean at audit; the execution subject remains 9c04278. + +Raw logs confirm: + +- All 18 native qualifier commands exited zero: 35 Rust tests and five native/rational specimens, with 5 guard tests and 10 oracle tests in each normal/optimized Python mode. +- The real packet passed 26 normal and 26 optimized tests, without skips. +- Separate focused no-default execution passed 72 contracts: 23 workflow, 9 native-family, 14 composition, 23 volume and 3 compile-fail borrow doctests. No failures or ignores. These are distinct selected contracts, not behavioral coverage of every admitted module. + +The retained ELF SHA256 is `7eb04fe27e4702a7bae70322d2b98c32a4ab97af0fde15e769bc3bbf2a06bc0e`. The 726,459-byte archive SHA256 is `d11247940d0365ae1cab1c7e069a19ac15f8672e9ed9274a5f973f9ff0846630`. + +This establishes fixed staged native/rational/packet and focused contract evidence only. No fresh Lean, default/desktop, hosted Pages/browser, native-window, performance, learned-model or physical qualification follows. Future Q2 boundary repair is excluded; original negative numerical outcomes retain their subjects. Digest integrity establishes neither authenticity nor bit reproducibility. No duplicate execution or repository/ref/PR mutation was performed. + +[Machine-readable audit and exact hashes](qualification-9c04278-review.json). diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification.json b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification.json new file mode 100644 index 00000000..e5fc3d6e --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification.json @@ -0,0 +1,106 @@ +{ + "schema": "rheon-staged-native-admission-qualification-v1", + "source_head": "9c04278e6cdd44418628c35f944c1730cbe6173e", + "source_tree": "b2008a22a65246c5a38c632437c1acc30a8cb27a", + "clean": true, + "selected_native_count": 135, + "selected_map_sha256": "9af9e8fceeb49febc428301ca51f0c428bfc25e38203d6eccd23fdece031e8e8", + "admission_inventory_sha256": "3cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330", + "bound_review_sha256": "9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c", + "native_qualification": { + "status": "passed", + "commands": 18, + "rust_tests": 35, + "specimens": 5, + "guard_tests_normal": 5, + "guard_tests_optimized": 5, + "oracle_tests_normal": 10, + "oracle_tests_optimized": 10, + "lean_checked": false, + "receipt_sha256": "6df83df7782357a522cb5a9d645d2934ee902916e762e4c5a3f75e9fe26082d7", + "executable_sha256": "7eb04fe27e4702a7bae70322d2b98c32a4ab97af0fde15e769bc3bbf2a06bc0e" + }, + "packet": { + "status": "passed", + "normal_tests": 26, + "optimized_tests": 26, + "skipped": 0, + "artifacts_sha256": { + "data.json": "e1b71c15b1b2a57abb0ff3c0f0f3e5fe1e699aaec86c67980c39efa09f7ea9ae", + "qualification.json": "5d1699f32ffecff37e8e750a15bf19e6c1455fd377ade7f503e953ec091f4285", + "native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "primary-qualification.json": "6df83df7782357a522cb5a9d645d2934ee902916e762e4c5a3f75e9fe26082d7" + } + }, + "focused_composed_contracts": { + "status": "passed", + "counts": { + "focused-workflow": 23, + "focused-native-family": 9, + "focused-composition": 14, + "focused-volume": 23, + "borrow-doctests": 3 + }, + "passed_total": 72, + "failed": 0, + "ignored": 0, + "default_desktop_executed": false + }, + "archive": { + "path": "/workspace/rheon-native-admission-stage-9c04278.zip", + "bytes": 726459, + "sha256": "d11247940d0365ae1cab1c7e069a19ac15f8672e9ed9274a5f973f9ff0846630" + }, + "evidence_files_sha256": { + "aligned-strain-native-executable": "7eb04fe27e4702a7bae70322d2b98c32a4ab97af0fde15e769bc3bbf2a06bc0e", + "borrow-doctests.log": "b8ee283afb538fddf1a1628e903752c17c41beb62a72bc2a504d7dbd85cd88e4", + "committed-admission-check.log": "0a50656e6b25a636263e31bcef696d56cfc9a12e872c5dcf2ed1c1cee0154533", + "execution-context.json": "19fc13c82dd8957f3a177408d799b4b6944ebc33b9f3bee859defd3cc2c62c9b", + "final-admission-review/review.json": "0d66e1f0279c0bbd664ab94d3f58f15282581674e71c5d5acd0ab4a64ac80ce4", + "final-admission-review/review.md": "95342d50ea2bc1ec79e85f8f752f6832e4e6911ab32b9efd52c9c17f0107a0dd", + "focused-composition.log": "d0579b321a850bddf8652d98bde12d9068ec006808c29616ab6e91234a39ed14", + "focused-execution.json": "969f3f4f441256564c8e9cbb8269f32928023301e9ab0e5d1399790aa8ec6010", + "focused-native-family.log": "a8ad34f4517af079652e6b6a8869d4c8746236cc8f8319b850c45f84a067b99c", + "focused-volume.log": "e8b9a050e735257b5c1c4a90e60182ff721dc90c99add877471614ad804a5d64", + "focused-workflow.log": "83cc215299fc024ddf7997e54f613de7618b93ef34fca297b5eb402e206540e9", + "native-qualified-v1/format.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/large-origin-nonmidpoint-oracle-comparison.log": "2a373f7e0a5d00417b7b02a3ba4ab12076b605ef337e2eb503953c3110da9f00", + "native-qualified-v1/large-origin-nonmidpoint-oracle-summary.json": "2a373f7e0a5d00417b7b02a3ba4ab12076b605ef337e2eb503953c3110da9f00", + "native-qualified-v1/large-origin-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/large-origin-nonmidpoint.tsv": "38405a03996ba2be5dc952b85b1d7e0b0e7df4d115e30b9bdfe14852e55c3628", + "native-qualified-v1/native-oracle-comparison.log": "cae5f2851cf5a981695e663088ffae211145fa22dd81745d240da5bcdafff7c5", + "native-qualified-v1/native-oracle-summary.json": "cae5f2851cf5a981695e663088ffae211145fa22dd81745d240da5bcdafff7c5", + "native-qualified-v1/native-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/native.tsv": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45", + "native-qualified-v1/oracle-tests-optimized.log": "d8d8c25b0b521d811a5ed157c0c42bb7cd7e32e8f71f896cd2e13a399430c935", + "native-qualified-v1/oracle-tests.log": "e3964af2049397b18350ec1a99197f24e3af4b43a9b3faa7ec3cf9557f7bb490", + "native-qualified-v1/qualification-gate-tests-optimized.log": "191e9a8139c8d8f4819d79316374637363b919a57cb0d0ffdb9d70111cf25ab5", + "native-qualified-v1/qualification-gate-tests.log": "216eddac08320533ba66fe5875ef7df99be7ea420ee28da96cc49d185d144f55", + "native-qualified-v1/qualification.json": "6df83df7782357a522cb5a9d645d2934ee902916e762e4c5a3f75e9fe26082d7", + "native-qualified-v1/reflected-anisotropic-oracle-comparison.log": "6b5562d10d016245bc86f9c02f80977a975e7534bd91d90eee5b2b15b0f4996c", + "native-qualified-v1/reflected-anisotropic-oracle-summary.json": "6b5562d10d016245bc86f9c02f80977a975e7534bd91d90eee5b2b15b0f4996c", + "native-qualified-v1/reflected-anisotropic-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/reflected-anisotropic.tsv": "04821a0128a562dc796b5ec369e552eff2b867d09c55a7d1333cdfb35048b4d3", + "native-qualified-v1/represented-nonmidpoint-oracle-comparison.log": "00bd57dea9264603cfddd34a60c86311ba9bf1b914e179f45072be95981f618f", + "native-qualified-v1/represented-nonmidpoint-oracle-summary.json": "00bd57dea9264603cfddd34a60c86311ba9bf1b914e179f45072be95981f618f", + "native-qualified-v1/represented-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/represented-nonmidpoint.tsv": "c7eed9042d4806d437a573ddae91817c692c8cbd77b32e2df296b0e0b38d96f2", + "native-qualified-v1/rust-build.log": "27175bdb8a73ce6fa149513bd472db8c081c0a3f25bd44b3b7a20e2ee25ca2b4", + "native-qualified-v1/rust-clippy.log": "8ec3b0b46fcc7dcb0d6bfc34e8133ecf122d9aca09838746fe2800dd29e2ca31", + "native-qualified-v1/rust-contracts.log": "b4518af1e24f2a29b076f6d4cd6100494a90c57b17a523e60ff55c775fe21ee4", + "native-qualified-v1/unit-center-cube-oracle-comparison.log": "aa69c6286b42eb94d5ea84a9510131f43334fa540f7b49179eca26aff0b9b3ea", + "native-qualified-v1/unit-center-cube-oracle-summary.json": "aa69c6286b42eb94d5ea84a9510131f43334fa540f7b49179eca26aff0b9b3ea", + "native-qualified-v1/unit-center-cube-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/unit-center-cube.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "packet-create.log": "0074778f8a8cda45309ea913a78081b8551c0c61693b2f69489016c82649ba4a", + "packet-execution.json": "c46d719e24c31a54f44b11eddb7f713c4a33215ac91f71bbaa8a072a49351a8b", + "packet-tests-normal.log": "d1de8eacd20bd12d77f1e83f9f3dba53cbdb446c065a2d31752bef69a68038b2", + "packet-tests-optimized.log": "445ea694fc39396e22bb9f94f1788bfb47f4ab835019e29de8108fd3517ef40d", + "packet-v1/data.json": "e1b71c15b1b2a57abb0ff3c0f0f3e5fe1e699aaec86c67980c39efa09f7ea9ae", + "packet-v1/native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "packet-v1/primary-qualification.json": "6df83df7782357a522cb5a9d645d2934ee902916e762e4c5a3f75e9fe26082d7", + "packet-v1/qualification.json": "5d1699f32ffecff37e8e750a15bf19e6c1455fd377ade7f503e953ec091f4285" + }, + "excluded_followup": "Ongoing Q2 geometry-boundary repair; no topology/DOF/B/M/S/W or coupled PDE promotion", + "scope": "Fixed staged native/rational/real-packet and focused no-default contracts only. No new Lean, hosted Pages/browser/desktop/native-window/performance/learned/physical qualification." +} diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification.md b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification.md new file mode 100644 index 00000000..15385445 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification.md @@ -0,0 +1,103 @@ +# Fixed staged native admission qualification + +Fresh native/rational, real-packet and focused composed contracts passed on clean +commit **`9c04278e6cdd44418628c35f944c1730cbe6173e`**, tree +`b2008a22a65246c5a38c632437c1acc30a8cb27a`. This qualifies the fixed staged +aligned-strain export and selected contracts. The ongoing Q2 geometry-boundary +repair is excluded; no fluid accuracy or production replacement gate is promoted. + +## Reviewed source and admission + +The staged source includes PR130 `c2fbbea` and final PR131 `97cdce6`, whose tested +iteration repair is `34e2e73`. The [complete per-path review](provisional-readiness.md), +[iteration delta review](iteration-repair-34e2e73-review.md) and +[final metadata review](final-metadata-review.md) approve the exact 135-path map: +11 added, 16 changed, 108 unchanged, none removed versus the prior 124-path +admission. Canonical sorted compact source-map SHA256 is +`9af9e8fceeb49febc428301ca51f0c428bfc25e38203d6eccd23fdece031e8e8`. +The reviewed v3 inventory SHA256 is +`3cafdc2a319420089262057f707be259ffd4b3b35a971ea529e853cd431e2330`; +the append-only bound review SHA256 is +`9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c`. +Frozen predecessor bytes, immutable primary tree, selector, checker, qualifier, +oracle, packet schemas and refusal checks are unchanged. The old stale-map +refusal is retained separately; it was a source-identity refusal before numerical +comparison. No old pass receipt was transferred or relabelled. + +## Executed qualification + +| Existing command or suite | Observed result at 9c04278 | +| --- | --- | +| `check_native_admission.py` | 135 inputs match; source admission only | +| `qualify_aligned_strain.py` without `--allow-dirty` or `--lean` | All 18 commands pass; clean exact source | +| Locked Rust aligned-strain, obstacle-flow, static-obstacle and native-example contracts | 35 pass, 0 fail, 0 ignored | +| Native specimens and independent rational comparisons | Five freshly executed specimens pass, each with adversarial negatives | +| Qualification-gate Python tests | 5 normal + 5 optimized pass | +| Real-native oracle tests | 10 normal + 10 optimized pass | +| Fresh real-packet contracts with `RHEON_ALIGNED_PACKET` | 26 normal + 26 optimized pass, 0 skipped | +| `cargo test --locked --no-default-features --lib workflow::` | 23 pass, 0 fail, 0 ignored | +| Same flags, `native_family::` | 9 pass, including the existing 100-interval owner-equivalence fixture | +| Same flags, `solver_provider::composition` | 14 pass, including supplied-array projection fixtures | +| Locked no-default `liquid_volume_contract` and `liquid_volume_periodic_contract` | 18 + 5 pass | +| Locked no-default Rustdoc contracts | 3 compile-fail borrow contracts pass | + +The focused composed total is **72 passing tests, zero failures, zero ignored**. +The filtered tests outside those selectors are not counted as executed. These +focused contracts supplement the native qualifier, which does not execute all new +unit modules. The unchanged qualifier includes formatting, locked native build and +strict Clippy for its library/example/aligned-contract scope; it is not an +all-target desktop qualification. PR131's separate default/desktop results remain +bound to `34e2e73`, rather than being relabelled as fresh integration execution. + +The new packet contains exactly `native.tsv`, `data.json`, `qualification.json` +and `primary-qualification.json`. It was built from the new actual executable and +fresh clean qualification receipt. Both packet test modes exercised real packet +validation, publication/renderer bindings and malformed/stale inventory, +predecessor, review, source, binary, receipt and corrupted/rehashed payload refusal. +No native packet-dependent test was skipped. + +## Environment and retained artifacts + +Rust/Cargo 1.92.0, x86_64-unknown-linux-gnu, Python 3.12.14. The external target is +`/workspace/rheon-native-admission-20261020-build`; Cargo/Rustup homes are +`/workspace/.rheon-tools/cargo` and `/workspace/.rheon-tools/rustup`. +`CARGO_BUILD_JOBS=2`, `CARGO_INCREMENTAL=0`, and dev/test debug information is +disabled to fit the selected environment. Default opt-level zero and debug +assertions remain; no numerical criterion changes. Normal invocations clear +ambient `PYTHONOPTIMIZE`; Python bytecode writes are disabled. + +The [compact manifest](qualification.json) binds every retained evidence file. +Fresh native receipt SHA256: +`6df83df7782357a522cb5a9d645d2934ee902916e762e4c5a3f75e9fe26082d7`. +Actual retained executable SHA256: +`7eb04fe27e4702a7bae70322d2b98c32a4ab97af0fde15e769bc3bbf2a06bc0e`. +Raw logs, new native TSVs/oracle results, real packet, source receipts, executable +and final admission review are archived outside Git at +`/workspace/rheon-native-admission-stage-9c04278.zip`, 726459 bytes, SHA256 +`d11247940d0365ae1cab1c7e069a19ac15f8672e9ed9274a5f973f9ff0846630`. +No archive overwrote an existing campaign or historical failure. + +An independent [execution audit](qualification-9c04278-review.md) verified all 1437 committed source hashes, +all 135 selected identities, the admission binding, actual retained ELF and all 48 +archive members/CRCs/hashes. Logs and command counts match the scoped result; no +material finding remained. The reviewer executed no duplicate suite. + +## Integration and remaining gates + +After qualification, PR120 merged as `193d86ce1a06f4585208226069b41c619e530a00` +and PR119 as `718469beedb9a949f4bb6f3299c7b880b4c47e47`, each after fresh +exact-head readiness checks. PR122 was retargeted to main; no source branch was +deleted. Retaining that actual main ancestry in private commit `afa6191` produced +the identical qualified tree. This result report and subsequent documentation are +descendants; the executed source remains 9c04278. Source/admission/review bytes +must remain exact for the packet's existing receipt binding. A new source map +requires its own explicit review and fresh qualification. + +Hosted Pages/browser/publication, full default/desktop integration, new native +window/performance, Lean, learned-provider and scientific/physical validation are +separate gates. G1-C's iteration defect is repaired and locally verified; G1-U +retains its historical display scope. C1-B1 still qualifies supplied arrays, with +no candidate invocation or Session adoption. P1 remains stopped; Q1 remains +accuracy-incomplete; Q2's five native positive apertures on exact-zero-measure +faces block topology/DOF/B/M/S/W and coupled-Stokes promotion. The numerical +owner's principled Q2 boundary repair is a separate active follow-up. diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.json b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.json new file mode 100644 index 00000000..fbe10dba --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.json @@ -0,0 +1,207 @@ +{ + "active_inventory_changed_by_reviewer": false, + "ancestry": { + "21d4122c3d0edb2ca5c3ce089175c70035d737a3": true, + "2209012bc5f902693d0f695ec1c2d854126af317": true, + "a3a66b18b34bef2a32ce1b658fce952115b1f7f4": true, + "b61ae293224ff8262e99984a1b8fa8b2135b8c83": true, + "f75cd66c6dc4167ad1ec3febb72e6fb2aa6b4d0b": true + }, + "counts": { + "added": 11, + "changed": 16, + "removed": 0, + "total": 135, + "unchanged": 108 + }, + "critical_paths_changed_from_prior_main": [], + "critical_pins": { + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "5836c3fa71bf20b72dbde79a2f5d27dd281ffc3930e0af7ad81f9039fd3edd42", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "75415a192381d0457785526120c120f7ced9217169afbc64f2511e834c0ff20f", + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "decision": "existing-v3 explicit refresh appropriate; provisional closure verified; final source admission and execution deferred until coordinated owner fixes", + "execution_performed": false, + "later_worktree_observation": { + "clean": true, + "head": "64f49a92b9bd3e8097e584713e557e0d6498c32d", + "source_and_mechanism_bytes_still_match_reviewed_candidate": true, + "tree": "0f90cad33429249cabd654551bb4833c626c482d" + }, + "mapped_worktree_and_commit_mismatches": [], + "paths": { + "added": [ + "src/bin/desktop/workflow_inspector.rs", + "src/bin/desktop/workflow_inspector_tests.rs", + "src/native_family.rs", + "src/native_family/tests.rs", + "src/recording/workflow.rs", + "src/solver_provider/composition.rs", + "src/solver_provider/composition/projection.rs", + "src/solver_provider/composition/projection_tests.rs", + "src/solver_provider/composition_tests.rs", + "src/workflow.rs", + "src/workflow/tests.rs" + ], + "changed": [ + "src/bin/desktop/ai_comparison/configured_track.rs", + "src/bin/desktop/comparison.rs", + "src/bin/desktop/inspector.rs", + "src/bin/desktop/run_sets/configured/archive.rs", + "src/bin/rheon-desktop.rs", + "src/lib.rs", + "src/liquid_step.rs", + "src/liquid_volume.rs", + "src/provider_step.rs", + "src/recording.rs", + "src/recording/provider.rs", + "src/recording/provider/runtime.rs", + "src/session/configured.rs", + "src/simulation.rs", + "src/solver_provider.rs", + "src/solver_provider/configured.rs" + ], + "removed": [], + "unchanged": [ + "Cargo.lock", + "Cargo.toml", + "examples/aligned_strain.rs", + "rust-toolchain.toml", + "src/advection.rs", + "src/aligned_strain.rs", + "src/bin/desktop/README.md", + "src/bin/desktop/accepted_session.rs", + "src/bin/desktop/ai_comparison/accepted_provider.rs", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs", + "src/bin/desktop/ai_comparison/adapter.rs", + "src/bin/desktop/ai_comparison/configured_track_tests.rs", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs", + "src/bin/desktop/ai_comparison/diagnostic_view.rs", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs", + "src/bin/desktop/ai_comparison/engine.rs", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs", + "src/bin/desktop/ai_comparison/mod.rs", + "src/bin/desktop/ai_comparison/model_process.rs", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs", + "src/bin/desktop/ai_comparison/record.rs", + "src/bin/desktop/ai_comparison/scene.rs", + "src/bin/desktop/ai_comparison/view.rs", + "src/bin/desktop/ai_comparison/worker.rs", + "src/bin/desktop/archive_view.rs", + "src/bin/desktop/build_identity.rs", + "src/bin/desktop/camera.rs", + "src/bin/desktop/carrier_execution.rs", + "src/bin/desktop/collision_ui.rs", + "src/bin/desktop/comparison_archive.rs", + "src/bin/desktop/comparison_field_view.rs", + "src/bin/desktop/configured_comparison_tests.rs", + "src/bin/desktop/configured_controls.rs", + "src/bin/desktop/configured_producer_exit_tests.rs", + "src/bin/desktop/configured_worker_tests.rs", + "src/bin/desktop/emitter_controls.rs", + "src/bin/desktop/engineering.rs", + "src/bin/desktop/export_ui.rs", + "src/bin/desktop/history.rs", + "src/bin/desktop/identity.rs", + "src/bin/desktop/particle_view.rs", + "src/bin/desktop/run_set_view.rs", + "src/bin/desktop/run_sets.rs", + "src/bin/desktop/run_sets/configured.rs", + "src/bin/desktop/run_sets/source.rs", + "src/bin/desktop/settings.rs", + "src/bin/desktop/transport_view.rs", + "src/bin/desktop/viewport.rs", + "src/bin/rheon-ai-compare.rs", + "src/bin/rheon.rs", + "src/box_flux.rs", + "src/box_flux_step.rs", + "src/collision.rs", + "src/column_mac.rs", + "src/column_momentum.rs", + "src/column_shear.rs", + "src/column_surface.rs", + "src/compressible.rs", + "src/coupled_discrete.rs", + "src/dense3d_sequence.rs", + "src/emitter.rs", + "src/emitter_controls.rs", + "src/export.rs", + "src/fitted_height.rs", + "src/fixed_bottom_ale.rs", + "src/forces.rs", + "src/free_surface.rs", + "src/geometry.rs", + "src/material.rs", + "src/material_session.rs", + "src/mesh_collision.rs", + "src/mesh_import.rs", + "src/motion.rs", + "src/observation.rs", + "src/obstacle_pressure.rs", + "src/obstacle_shear.rs", + "src/operator.rs", + "src/parallel.rs", + "src/particle_fluid.rs", + "src/pressure.rs", + "src/pressure_session.rs", + "src/recording/carrier.rs", + "src/recording/comparison.rs", + "src/recording/diagnostic.rs", + "src/recording/material.rs", + "src/recording/provider/comparison.rs", + "src/sampling.rs", + "src/scheduling.rs", + "src/session.rs", + "src/sgs.rs", + "src/solver_provider/context.rs", + "src/solver_provider/modal.rs", + "src/static_obstacle.rs", + "src/tracer_barrier.rs", + "src/translated_viscous.rs", + "src/viscosity.rs", + "src/vtk_export.rs", + "tests/aligned_strain_contract.rs", + "tests/obstacle_flow_contract.rs", + "tests/static_obstacle_contract.rs", + "tools/aligned_strain_oracle.py", + "tools/qualify_aligned_strain.py", + "tools/test_aligned_strain_oracle.py", + "tools/test_qualify_aligned_strain.py" + ] + }, + "primary_tree": "bda8ebca0a226e10f03f975ffcf9701df4326095", + "prior124_committed_blob_mismatches": [], + "prior_main": "bc2f472787060d9a69cb619ed2c2fea10fd754b6", + "required_followup": [ + "Coordinate final iteration-count and evaluator repair heads; review exact final closure deltas.", + "Append current bounded admission record preserving history; explicitly update complete v3 map and review SHA together; preserve v1/v2 bytes/schema/base/primary and selector/oracle semantics.", + "Commit clean final source before fresh admission check, 18-command qualification, actual packet, 26 normal and 26 optimized packet contracts.", + "Separately execute composed new module contracts and required builds/hosted gates; qualification18 is not broad 135-module behavioral acceptance." + ], + "review_input": { + "path": "/workspace/rheon-native-admission-20261020-evidence/provisional-complete-closure.json", + "sha256": "ea0ea4b43b222b20b760d4ac7fc1af6c93e7a5b4467f08b9e0be8c663d873a2a" + }, + "schema": "rheon-independent-admission-mechanism-review-v1", + "selector_count": 135, + "selector_exact": true, + "source_map_sha256": "de1f61379e0f5ad7dd3ff04180edee4591993fcbb958b805b51ce2df1f6c6e70", + "subject": { + "clean_at_initial_observation": true, + "head": "6137e46ccfcc576b239dbe34f6700b84f109de38", + "private_candidate": true, + "tree": "8fa48084cd9e8af2dde077812fbc5d967efbd8f5" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md new file mode 100644 index 00000000..17235df1 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md @@ -0,0 +1,57 @@ +# Independent complete-source admission mechanism review — 2026-10-20 + +Decision: the existing explicit version-three admission refresh is appropriate. No version-four inventory or selector/qualifier/oracle change is needed for this extension. The provisional closure is verified as a review input. Final source admission and execution remain deferred until the assigned iteration-count and evaluator repairs are coordinated and independently reviewed. This review neither activates the provisional map nor qualifies the candidate. + +## Exact subject and independent checks + +Reviewed private candidate `6137e46ccfcc576b239dbe34f6700b84f109de38`, tree `8fa48084cd9e8af2dde077812fbc5d967efbd8f5`. It was clean at the initial observation. Input `provisional-complete-closure.json` SHA256 is `ea0ea4b43b222b20b760d4ac7fc1af6c93e7a5b4467f08b9e0be8c663d873a2a`; canonical sorted compact source-map SHA256 is `de1f61379e0f5ad7dd3ff04180edee4591993fcbb958b805b51ce2df1f6c6e70`. + +I independently reconstructed the unchanged selector from its source and filesystem: exactly 135 paths, 11 added, 16 changed, 108 unchanged, zero removed versus the admitted 124. Every mapped digest matches both the candidate's committed Git blob and observed file bytes. All 124 prior hashes also match committed `bc2f472787060d9a69cb619ed2c2fea10fd754b6` blobs. The JSON receipt lists all paths and critical pins; source-map.json retains the reviewed map. These are observed bytes, not an instruction to copy them into the active inventory. + +All eleven reviewed mechanism/history files remain byte-identical to that prior main, including the three inventories, admission review, selector/packet code, checker, qualifier, oracle and their tests. The active old v3 inventory remains SHA256 `75415a192381d0457785526120c120f7ced9217169afbc64f2511e834c0ff20f`; the admission review remains `5836c3fa71bf20b72dbde79a2f5d27dd281ffc3930e0af7ad81f9039fd3edd42`. No admission input was changed by this reviewer. + +During receipt preparation the owner's worktree advanced to clean `64f49a92b9bd3e8097e584713e557e0d6498c32d`, tree `0f90cad33429249cabd654551bb4833c626c482d`. All 135 selected inputs and eleven mechanism/history files still matched the reviewed candidate. This later observation is recorded separately, not substituted for the exact 6137 subject or for future execution evidence. + +## Existing owned mechanism and history + +`NATIVE_ADMISSION_INTEGRATION_REVIEW.md:85–89` explicitly preserves earlier v3 review as history and refreshes the same integration epoch while retaining schema/base/predecessor semantics. Lines119–123 authorize fresh qualification only, bind the review and complete inventory committed together, and require future wiring to receive its own explicit review and fresh receipt. This is the smallest established mechanism for the present extension. + +Append a bounded current review without rewriting earlier decisions. Explicitly update the complete v3 source map and its review SHA together after final coordinated source review. Preserve: + +- Schema `rheon-reviewed-aligned-strain-native-sources-v3` and base `21d4122c3d0edb2ca5c3ce089175c70035d737a3`. +- Frozen v1 SHA256 `84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a` and v2 SHA256 `6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d`. +- Immutable primary `f75cd66c6dc4167ad1ec3febb72e6fb2aa6b4d0b`, tree `bda8ebca0a226e10f03f975ffcf9701df4326095`, all reviewed-base ancestry checks, and existing receipt/packet schemas. +- The conservative all-src/.cargo/toolchain/build-and-qualification-input selection; no assumed numerical subset or test-module exclusion. + +All five relevant primary/v1/v2/v3/qualifier bases are candidate ancestors. A new epoch would require a reason to change these trust semantics; none is needed here. Historical v3 bytes remain available at their committed subjects and in retained evidence. Never imply their old pass receipts qualify the refreshed map. + +`aligned_strain_packet.py:78–138` selects the newest present inventory, refuses changed predecessors, enforces exact identity/review binding/ancestry/complete path set/current digests, and does not fall back on malformed newest records. `trusted_primary:181–218` additionally binds the native receipt to the committed source path set, actual committed source and all four admission-file blobs, and executable digest. Keep these checks intact. The early admission check is source identity, not a failed or passed numerical comparison. + +## Final procedure after the owners' fixes + +First obtain the coordinated final heads, review their exact source and evaluator deltas, rederive the complete map, and commit the explicitly approved inventory plus appended review. The counts may remain135, but neither their count nor these hashes should be assumed unchanged. Require clean committed inputs and preserve failed/intermediate receipts separately. + +With explicit Rust/Cargo/Python environment, exclusive accurately disclosed target, `CARGO_INCREMENTAL=0`, fresh external output directories, and no `--allow-dirty`: + +```sh +python3 docs/education/check_native_admission.py +python3 tools/qualify_aligned_strain.py /tmp/FINAL-qualified +python3 docs/education/aligned_strain_packet.py \ + --output /tmp/FINAL-packet \ + --executable "$CARGO_TARGET_DIR/debug/examples/aligned_strain" \ + --primary-qualification /tmp/FINAL-qualified/qualification.json +RHEON_ALIGNED_PACKET=/tmp/FINAL-packet python3 -m unittest discover -s docs/education -p test_aligned_strain_packet.py -v +RHEON_ALIGNED_PACKET=/tmp/FINAL-packet python3 -O -m unittest discover -s docs/education -p test_aligned_strain_packet.py -v +``` + +Clear ambient PYTHONOPTIMIZE for the normal invocation; PYTHONDONTWRITEBYTECODE avoids source-tree cache writes. Require 18 qualifier commands: fmt, locked Rust contracts/build/strict Clippy, five qualification-guard tests normal and optimized, five actual native specimen executions each with independent rational comparison and adversarial negatives, and ten oracle tests in both modes with the actual native TSV supplied. No Lean claim without the separate executed Lean commands. + +Require all26 packet contracts in normal mode and all26 under `-O`, using the actual fresh packet rather than accepting packet-dependent skips. Existing negative controls cover malformed/stale newest inventory without fallback; changed/missing/added source/build inputs; changed frozen predecessors and review path/SHA; committed receipt/source/admission mismatch; dirty state and changed source/tree/binary; output reuse/Git-owned output; rehashed corrupt native/packet data; removed rows, mass, reflected-corner and basis corruption; extra artifact/receipt fields and unauthorized stepping scope. Preserve explicit runtime refusal checks under optimization. No new permanent gate machinery is necessary merely to refresh approved hashes. + +Audit exact final head/tree, before/after tracked bytes, command exits, artifacts and executable hashes. Fresh receipt status must be passed/clean. The packet must reopen and verify its exact four-file roster and newly generated native data. Bind any final claimed subject explicitly; later source/admission edits require a new review and fresh execution rather than receipt relabeling. + +## Scope and remaining blockers + +This is mechanism/identity/history review, not a second behavioral review of all27 changed/added modules. The independent source owner review and focused G1/C1-A/C1-B1/Q1 evidence remain necessary. In particular the 18-command qualifier does not execute every new module's unit tests: run and retain the composed focused contract matrix separately, plus applicable native/browser and hosted publication gates. Do not equate an all-source identity map with all-source scientific qualification, learned-model availability, a full fluid accuracy result, or new GUI evidence. + +The known iteration-count consistency and evaluator repairs are assigned elsewhere and pending for the final subject. No builds, simulations, models, qualification suites, publication, ref changes or merge retries were performed here. No additional admission-mechanism blocker was found. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/guard-followup-review.md b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/guard-followup-review.md new file mode 100644 index 00000000..35ff30ec --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/guard-followup-review.md @@ -0,0 +1,20 @@ +# Reviewed source-only guard follow-up + +The PR142 lead authorized isolated reconciliation of exact dependency +`3cd735fde7655aedffbd0ffb2f041ca6994961a4` in comment 6328842516. +Independent reviewer `/root/review_pr138` approved the staged source reconciliation +and hosted-outcome report updates without material findings. The subsequent +public candidate retains only public source, test and CI reporting. + +All 152 selected identities and both bound admission records retain their exact +qualified `91c4f4b` bytes. The source-only workflow guard is byte-identical to the +lead repair: it requires the reviewed 60-minute literal and comments, rejects +30/59/61/missing budgets, and preserves commands, matrix, per-case bounds and +aggregate acceptance. Four focused source-only cases passed normal and optimized +Python; no numerical campaign or native invocation was needed for that check. + +Imported lead reports and complete ledger suffix remain preserved. The earlier +`91c4f4b` desktop timeout, aggregate failure and workflow cancellation retain their +actual source attribution. No stale-source CI retry is requested. Final readiness +still requires verified PR142 merge/main, exact combined-source validation and +review, new hosted gates and the sole integration lead's normal main merge. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/outer-followup-review.md b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/outer-followup-review.md new file mode 100644 index 00000000..bbadca10 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/outer-followup-review.md @@ -0,0 +1,33 @@ +# Reviewed PR142 reporting and CI follow-up + +The lead authorized isolated reconciliation of reporting head +`5eb8bf5607c01f1d59242c604b1d1204882d2eac` in PR138 comment 6328702931. +Independent reviewer `/root/review_pr138` approved actual staged tree +`25de4866d65adb544e1019160295a1032dd1ecb0`, with HEAD `ca519d8` and that merge +dependency, without material findings. + +All 152 selected identities, the active inventory and bound integration review +remain byte-identical to the qualified preliminary `91c4f4b` subject. The canonical +map digest remains `9a10497158827e189fe505f65e1aa203cd8a28fe894c469408977071b055375f`. +Against the new lead head, 150 selected files remain exact and only the same two +Cargo inputs differ. There is no runtime, example, test, qualifier or oracle +change in this follow-up. + +The CI file exactly matches the lead: one feature-job timeout changes from 30 to +60 minutes with two explanatory comments. Commands, matrix, aggregate gate and +per-case acceptance remain unchanged. The nine imported lead reports are exact +bytes. Ledger conflict resolution preserves the complete existing PR138 prefix +and appends the lead's complete 42-line suffix. The canonical plan retains the +lead's status and sole next integration slice, plus an accurately attributed +PR138 preliminary-results paragraph. Cached whitespace checks pass. + +After review, the reviewer-recommended owned issues row was clarified to separate +completed preliminary local qualification from pending final verification. This +and this review record change no admitted source or bound byte. + +No new test execution is attributed to this reporting-only follow-up. All earlier +results remain at their actual `91c4f4b` source. Original failed/cancelled outcomes, +including the lead's deliberately cancelled local duplicate, remain separately +attributed. Final-ready status still requires verified PR142 landing, exact +combined-source revalidation/review, applicable hosted gates and the sole lead's +normal main merge. No main action or campaign was performed by the reviewer. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preflight.md b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preflight.md new file mode 100644 index 00000000..9179c42d --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preflight.md @@ -0,0 +1,59 @@ +# Retained PR138 preparation results + +Preflight examined retained PR138 source +`a6bfcc94481b1bafbe61be804a1abc3426927bbd`, before PR142 integration. It does not +qualify the future combined source. The new protocol was authored during this +preflight; implementation, Cargo and test bytes remained unchanged. No clean +whole-tree qualification receipt is claimed for these preliminary checks. + +Independent read-only review by delegated reviewer `/root/review_pr138` compared +that exact head with `8bf542eddd8198008b6d77d52e009e9384998f18` and found no material +defect. It verified PR132/134 ancestry, all 28 recorded component pins, exact +tested implementation/test bytes, complete membership and hashes of the 135-input +selector, the historical review's exact prefix and frozen v1/v2 inventories. +Only the two Cargo files change in the selected source closure. No production +`src`, CI, qualifier or oracle changes belong to this reference delta. + +The reviewer identified the deciding stale-composition limit: retained PR142 +`4f2d55323825c8907cf9209914f29130ec7de511` selects 140 inputs, with five additional +paths and 13 differing shared hashes versus PR138. The 135-input map cannot +qualify combined source. A read-only Git merge-tree comparison predicts seven +shared-document conflicts, including both native-admission records and canonical +composition status; no reference or production source conflict occurs between +those two retained heads. This is preparation, not conflict resolution against +the lead's eventual repaired source. + +Fresh local checks with Rust/Cargo 1.92.0 and Python 3.12.14: + +- `cargo test --locked --no-default-features --test grid_geometry_reference_contract + --test grid_coupled_reference_contract`: 9 geometry and 2 coupled tests pass, + zero failed or ignored. The existing five-artifact geometry regression completed; + neither sealed scientific field campaign was rerun. +- Strict Clippy on both private examples and both contract adapters with + `--locked --no-default-features` and `-D warnings`: passes. +- `cargo tree --locked --no-default-features --edges normal`: all three newly + added exact-arithmetic crates are absent from the normal production graph. +- Downloaded Cargo registry archives for num-bigint 0.4.8, num-integer 0.1.47 and + num-rational 0.4.2 match the lock checksums. Their actual MIT/Apache license bytes + match every retained dependency-review hash. Existing package identities remain + unchanged; no version broadening occurred. +- Both component pin manifests independently rechecked: 16 PR132 and 12 PR134 + identities match and exact owner heads remain ancestors. +- `git diff --check`: passes. + +Raw logs and dependency graph remain outside Git in +`/workspace/pr138-evidence/preflight-a6bfcc9/`; the build target is +`/workspace/pr138-build`. Jobs 2, incremental 0 and dev/test debug information 0 +were used. These outputs remain preliminary and are not borrowed for final +combined-source native/packet acceptance. + +GitHub read-only metadata confirms workflow run +[39367910080](https://github.com/MrScripty/Rheon/actions/runs/39367910080), attempt 2, +completed successfully on exact retained `a6bfcc9`. Attempt 1 cancellation and +aggregate failure remain historical. No rerun was requested here. + +Final dependency remains pending: PR142's landed head, lead agreement for shared +admission reconciliation, fresh complete-source review/qualification and required +hosted checks, then the lead's exact-head merge authorization. No main merge, +cloud-task access, historical artifact download, branch deletion or force push was +performed. No additional scientific or whole-application production claim follows. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preliminary-qualification.json b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preliminary-qualification.json new file mode 100644 index 00000000..b174ec80 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preliminary-qualification.json @@ -0,0 +1,74 @@ +{ + "schema": "rheon-pr138-preliminary-summary-v1", + "source_head": "91c4f4bd8bb29e9862f6ee29cd8bdead79e0d57e", + "source_tree": "01a550807263a35b8dca51ba7be22a7079b07176", + "status": "passed", + "commands": 14, + "source_files": 1946, + "native_receipt_sha256": "40f431b4c56607de99db043f8d5581ebe61bb5d5b901b9ebece39e90c065b7db", + "packet_receipt_sha256": "0c5fa5476945117b489bb04568e1c4d88797598f59094f4f54bc2646357de920", + "journal_sha256": "eff47c70efde0d5937c9a93632dff59f1c2bd7987a94182d8e031fea9e782c15", + "executing_elf_records": 9, + "archive": "/workspace/pr138-evidence/rheon-pr138-preliminary-91c4f4b.zip", + "archive_bytes": 23871596, + "archive_sha256": "8822d40bfedd0cca4013307ee49a689b522ebacae48fc19dc55fd0f2352f2124", + "archive_members": 2011, + "archive_crc_hash_audit": "passed", + "qualification": "preliminary; final merged-main and lead merge remain gated", + "selected_native": { + "count": 152, + "changed": [ + "Cargo.toml", + "Cargo.lock" + ], + "unchanged": 150, + "added": 0, + "removed": 0, + "canonical_map_sha256": "9a10497158827e189fe505f65e1aa203cd8a28fe894c469408977071b055375f" + }, + "counts": { + "native_commands": 18, + "native_rust": 35, + "native_specimens": 5, + "guard_normal": 5, + "guard_optimized": 5, + "oracle_normal": 10, + "oracle_optimized": 10, + "packet_normal": 26, + "packet_optimized": 26, + "packet_skipped": 0, + "library": 106, + "volume": 23, + "borrow_doctests": 3, + "private_references": 11, + "focused_total": 143 + }, + "independent_execution_review": { + "reviewer": "/root/review_pr138", + "disposition": "pass", + "mismatches": 0, + "tests_rerun": false + }, + "dependency_archive": { + "file_name": "rheon-pr138-dependency-materials.zip", + "bytes": 177210, + "sha256": "9be980b51ab3247eb7d071812a4f4530c59529c4a7eed095234711d675f02609", + "members": 10 + }, + "durable_storage": "pending_final_bundle", + "final_merged_main_verification": "pending", + "hosted_preliminary": { + "source_head": "91c4f4bd8bb29e9862f6ee29cd8bdead79e0d57e", + "run_id": 39689782274, + "desktop_job": 119532815829, + "desktop_outcome": "cancelled", + "annotation": "The job has exceeded the maximum execution time of 30m0s", + "default_feature": "passed", + "core_only_feature": "passed", + "aggregate_outcome": "failure", + "repair_owner": "PR142 lead; reviewed60-minute outer budget and coordinated source-only guard repair", + "stale_run_retry_requested": false, + "aggregate_job": 119544629626, + "workflow_conclusion": "cancelled" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preliminary-results.md b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preliminary-results.md new file mode 100644 index 00000000..5797ebf7 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/preliminary-results.md @@ -0,0 +1,83 @@ +# Preliminary composed-source execution + +Fresh clean execution passes on exact commit +`91c4f4bd8bb29e9862f6ee29cd8bdead79e0d57e`, tree +`01a550807263a35b8dca51ba7be22a7079b07176`. This is the lead-authorized preliminary +composition with frozen PR142 `dbd49d3`, not verified merged main. Final dependency +verification, exact-source revalidation, applicable hosted checks and the sole +lead's normal merge remain required. + +| Check | Observed result | +| --- | --- | +| Complete admission | 152 inputs; 150 exact PR142 identities plus two Cargo changes | +| Unchanged native qualifier | All 18 commands; 35 Rust contracts, five actual native/rational specimens | +| Native qualification guards | 5 normal + 5 optimized | +| Actual native oracle tests | 10 normal + 10 optimized | +| New real packet | 26 normal + 26 optimized tests; zero skips | +| Ordinary no-default library | 106 passed, zero failed/ignored | +| Original and periodic volume contracts | 23 passed, zero failed/ignored | +| Borrow compile-fail doctests | 3 passed | +| Private exact-geometry and coupled adapters | 9 + 2 passed; zero failed/ignored | +| Reference strict Clippy | Both examples/adapters pass with `-D warnings` | +| Production dependency graph | All three newly added exact-arithmetic crates absent from normal no-default edges | +| Locked no-default release library | Build passes; no execution/performance claim | + +The focused ordinary total is 143; native qualifier Rust contracts are separate. +The five-artifact regression is an existing fixed contract, not a rerun of the +sealed 24-case geometry field campaign or eight-case coupled scientific campaign. +No ignored tests were requested. All original component scientific sources, +failures and receipts retain their earlier scope. + +Actual Rust/Cargo 1.92.0 and Python 3.12.14 were used with a fresh external target, +jobs 2, incremental 0, dev/test debug information 0, default debug optimization +and assertions, normal Python optimization unset and bytecode writes disabled. +Every one of the 1,946 committed-source identities and clean HEAD/status remained +unchanged throughout. The task-local driver ran 14 outer commands and retained +their exact arguments, source identity, exits and logs. + +The independent reviewer `/root/review_pr138` audited the execution without +rerunning any test/campaign. Zero mismatches or material findings were found in +all 1,946 source files versus Git/current/archive, all 2,011 archive members, +their exact rosters/sizes/SHA256/ZIP CRC, every command/log hash, the native and +packet receipt chain, the exact unit-center specimen, the retained actual native +exporter and nine recorded executing test ELFs. The ten-member dependency archive +contains the actual three crate archives and all MIT/Apache license bytes; every +checksum/license hash matches. Adding this result report changes no selected +input or bound admission byte. + +| Retained identity | SHA256 | +| --- | --- | +| Native qualification receipt | `40f431b4c56607de99db043f8d5581ebe61bb5d5b901b9ebece39e90c065b7db` | +| Packet qualification receipt | `0c5fa5476945117b489bb04568e1c4d88797598f59094f4f54bc2646357de920` | +| Actual native exporter | `136d62f61744519e9a55fa88af2896622b94c59cc7763946164f60d047b7c895` | +| Raw 23,871,596-byte archive | `8822d40bfedd0cca4013307ee49a689b522ebacae48fc19dc55fd0f2352f2124` | +| Dependency 177,210-byte archive | `9be980b51ab3247eb7d071812a4f4530c59529c4a7eed095234711d675f02609` | +| Preliminary summary | `24d131eb671bb29306a300aed2e2a170734d642df3ad54d62814158844ae5e8e` | + +Raw archives remain outside Git at `/workspace/pr138-evidence/`, with final +durable storage still pending. The complete command and source snapshot is in +`preliminary-composed-1/journal.json`; the compact authored manifest beside this +report records the important identities. + +The temporary driver's escaping and failure-recording defects were found and +corrected during review before execution; the original and corrected scripts +remain in the archive. They are not failed numerical runs. The stale PR142 map +refusal and twelve inherited-log whitespace warnings are retained separately; +all warning paths match exact dependency bytes. Focused whitespace checking +against `dbd49d3` passes. Historical CI attempt 1 cancellation and attempt 2 success +remain distinct; current hosted checks are still pending at this report's creation. + +This proves bounded reference/build and named ordinary contracts only. No new +PDE/physical/production-water, native-window, learned/GPU, performance or +whole-application production acceptance follows. Final-ready status is pending. + + +A later hosted read records source `91c4f4b` desktop job 119532815829 in run +39689782274 as cancelled. Its annotation explicitly states the 30-minute job +budget was exceeded. Default and core-only feature jobs passed. Aggregate job +119544629626 failed; the workflow records its overall conclusion as cancelled. +Run/jobs/annotation metadata remains retained. The +lead's independently reviewed 60-minute outer budget and coordinated source-only +workflow guard repair are being inherited from PR142. No stale-source retry was +requested and no assertion/test acceptance was weakened. Final exact-head hosted +success is still required. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/protocol.md b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/protocol.md new file mode 100644 index 00000000..037377e4 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/protocol.md @@ -0,0 +1,88 @@ +# PR138 serial integration protocol + +Continue the existing `docs/plans/fluid-accuracy-composition/plan.md` integration +operation under the user's 2026-10-21 request to complete and merge the five +remaining PRs. PR142 is the sole serial integration lead; order is PR142, PR138, +PR143, then PR59, with PR150 admitted separately by that lead. This supersedes +the historical no-merge instruction only within the new request's scope; it does +not authorize retrying denied cloud-task or artifact-download operations. + +PR138's retained original head is +`a6bfcc94481b1bafbe61be804a1abc3426927bbd`. Preserve exact PR132 +`e6525a116a07af486e4a682cc2b157241d6b9150` and PR134 +`f84f65104d6a0f6f8f1a9b903412b1e5155f72a2` ancestry, their tested source identities, +scientific protocols, failures, receipts and manifests. Do not rerun their sealed +field campaigns. Historical run 39367910080 attempt 2 succeeded on the retained +head; its cancelled first attempt and aggregate failure remain historical. + +The isolated preparation branch is `integration/pr138-repair-20261021`, initially +at the retained head. All original branches remain. Use ordinary merge commits +to incorporate the lead's verified landed dependency; no rebase, force push, +branch deletion or unrelated feature change. The lead authorizes shared-file +reconciliation and any main merge through exact-head GitHub comments. Recheck +current main and that authorization immediately before authoritative integration. + +The lead's later [preparation authorization](https://github.com/MrScripty/Rheon/pull/138#issuecomment-6328266160) +also permits isolated preliminary composition/admission/testing against published +frozen PR142 `dbd49d3e41c482a753884abc8aaaff7d1b0d0653` while its ordinary gates +run. The [ownership agreement](https://github.com/MrScripty/Rheon/pull/138#issuecomment-6328139025) +covers both shared admission records and PR138-specific review/results/status. +Label every preliminary receipt with its actual executed source. This permission +does not waive final verification against the verified merged-main dependency or +authorize a main merge. A later CI-budget-only or result-document change from the +lead requires an exact selected-source identity comparison before deciding the +necessary final revalidation; material source changes require renewed admission. + +The expected implementation delta after PR142 consists of Cargo.toml/Cargo.lock +development-only rational dependencies and the existing private exact-geometry +and aligned coupled reference examples/contracts. Preserve the lead's product, +workflow, thermal and UI fixes. Shared native-admission records must preserve both +historical review sections, and canonical composition status must retain later +dispositions. Do not resolve these by copying an old inventory or unioning maps. +Reconcile only after the lead agrees to ownership and supplies its committed +source binding. + +Before a new qualification, enumerate the entire unchanged conservative selector +and compare every path against the lead's admitted map. Independently review the +actual complete source, exact component preservation, dependency identities and +licenses, and append-only admission metadata. Preserve the v3 schema/base, primary +tree, frozen v1/v2 bytes, checker, qualifier, oracle and refusal behavior. Commit +the newly reviewed map and bound review together. A stale map is a failed gate, +not permission to refresh automatically. Record the exact combined head/tree and +selected-map digest separately from historical source receipts. + +Use pinned Rust/Cargo 1.92.0, jobs 2, incremental 0, dev/test debug information 0 and a +fresh external target/output for final qualification. Keep normal Python +optimization unset and bytecode writes disabled. Run the unchanged native +qualifier's 18 commands, build a new real packet from its actual executable/receipt, +and run all 26 packet tests normally and optimized with zero skips. Run existing +focused workflow/native-family/composition/volume, borrow-doctest and both private +reference contracts; these fixed regressions are distinct from sealed field +campaigns. Run affected locked dependency-graph, formatting and strict lint checks +plus required hosted CI. Retain failed/partial outputs in separate directories. +Do not run `--ignored` campaigns to clear CI or weaken test selection. + +Independent exact-source review is required before merge. Record its subject, +findings/disposition, exact ready head, dependency head and test/CI results on +PR138 for the lead. If the lead performs the merge, verify the merge commit and +ancestry and observe post-merge checks. No PR138 merge is permitted before PR142 +lands or without the lead's exact-head authorization. + +This admits bounded reference/build integration only. Exact geometry remains +limited to its fixed represented-source corpus; aligned coupled algebra remains +an eight-case reference. General cut/free-surface spaces, conditioning, mixed-pair +stability, PDE/physical validation, production-water replacement, hardware/native +window, learned/GPU and performance acceptance do not follow from merging. +Generated logs, fields, executables and archives stay outside Git under the +repository output policy. Record results in a separate report after execution; +do not relabel old campaigns as new combined-source acceptance. + +Standards source is `MrScripty/Coding-Standards` at +`0fc92a24279f3a4574c80af0a2f31ea347a21597`, fetched directly in this environment. +No Rheon or ancestor AGENTS.md was found. Core/Router select implementation, +verification, proportionality, commit, planning, build, documentation, Rust and +Rust dependencies, dependency/license ownership and serial stale-state checks. +Their concrete effect is complete current-source review, dev-only dependency +closure, unchanged refusal contracts, isolated outputs and exact source-bound +evidence. This slice adds no runtime/API/UI/physical capability or new evidence +framework. No automated standards-conformance certificate is claimed. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/source-admission.json b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/source-admission.json new file mode 100644 index 00000000..282055a5 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/source-admission.json @@ -0,0 +1,27 @@ +{ + "schema": "rheon-pr138-source-admission-review-input-v1", + "dependency_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "retained_pr138_head": "a6bfcc94481b1bafbe61be804a1abc3426927bbd", + "authority_comment": "https://github.com/MrScripty/Rheon/pull/138#issuecomment-6328266160", + "selector_count": 152, + "added": [], + "removed": [], + "unchanged_count": 150, + "changed": { + "Cargo.lock": { + "lead_sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "composed_sha256": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f" + }, + "Cargo.toml": { + "lead_sha256": "f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae", + "composed_sha256": "997fb098f13c60e4f85ead3f5f7f2527f87ad1cba04fdac82d0bfb24959fca3a" + } + }, + "canonical_source_map_sha256": "9a10497158827e189fe505f65e1aa203cd8a28fe894c469408977071b055375f", + "inventory_sha256": "e3ac26c5c62b909aa1ef1384b8e0baffb5587e14c1794f02f0e68ae655d14195", + "review_sha256": "b4e7fcaf0c33b9e220fc7626d04969a95b31767897e9779eee850a9cfd71d0f9", + "historical_dependency_review_prefix_bytes": 111676, + "preserved_pr138_q2_suffix_sha256": "da0f2cf753fac7ee575474ecc7992e487ffca3c1619d643b39fe4b31ec907dac", + "sealed_campaigns_rerun": false, + "status": "pending_independent_review" +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/source-review.md b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/source-review.md new file mode 100644 index 00000000..26662217 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr138-integration-20261021/source-review.md @@ -0,0 +1,45 @@ +# Independent preliminary composed-source admission review + +Independent reviewer `/root/review_pr138` approves the actual staged source and +metadata, with no material finding. Reviewed staged tree: +`fb541f8ae74fe4a9bb15302d13d3fc114006db3d`, HEAD +`8186ad18568b1bac6d4613a142f570303b20a041` and merge dependency +`dbd49d3e41c482a753884abc8aaaff7d1b0d0653`. + +| Reviewed identity | Value | +| --- | --- | +| Complete conservative selector | 152 files; 150 exact dependency identities, two Cargo changes, no additions/removals | +| Sorted compact source-map SHA256, no newline | `9a10497158827e189fe505f65e1aa203cd8a28fe894c469408977071b055375f` | +| Actual active inventory SHA256 | `e3ac26c5c62b909aa1ef1384b8e0baffb5587e14c1794f02f0e68ae655d14195` | +| Actual bound review SHA256 | `b4e7fcaf0c33b9e220fc7626d04969a95b31767897e9779eee850a9cfd71d0f9` | + +The reviewer independently verified the complete actual selector and staged +identities, schema/base, frozen v1/v2 inventories, immutable primary tree, +ancestry, unchanged checker/qualifier/oracle/refusal sources and successful +152-input admission preflight. The full 111,676-byte PR142 review prefix and +complete 3,756-byte historical PR138 suffix remain exact; suffix SHA256 is +`da0f2cf753fac7ee575474ecc7992e487ffca3c1619d643b39fe4b31ec907dac`. + +All 28 original component pins and exact PR132/134 ancestry are preserved. +Private reference implementation/test bytes remain exact; composed Cargo retains +the lead's serde configuration. Only the three previously reviewed development +crate identities are added, prior registry records remain unchanged, and actual +cached archive/license hashes match. There is no `src`, `.github` or `tools` delta +against the dependency. Canonical status preserves later C1/CV dispositions and +labels this composition preliminary, with final dependency verification and main +merge solely owned by the lead. + +Focused staged whitespace checking against `dbd49d3` passes. Whole-index checking +against the old PR138 parent reported trailing blank lines in twelve inherited +current-main UI logs; these are exact dependency bytes, retained unchanged. This +is not a numerical or contract-test failure, and no inherited receipt was edited +to remove the warning. + +This report records the completed approval of the preceding +`source-admission.json` review input. Adding this authored result changes no +reviewed selected input or bound admission byte. Approval permits a normal +preliminary merge commit and fresh clean-source qualification only. Execution +review, actual merged-main verification, applicable hosted gates and the lead's +normal main merge remain pending. No scientific campaign, artifact download, +GitHub mutation or source edit was performed by the reviewer. No scientific, +graphical, hardware, performance or whole-application production acceptance follows. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/ci-budget-guard-repair.json b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/ci-budget-guard-repair.json new file mode 100644 index 00000000..d2af8eed --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/ci-budget-guard-repair.json @@ -0,0 +1,42 @@ +{ + "schema": "rheon-pr142-ci-budget-guard-repair-v1", + "failed_source_head": "5eb8bf5607c01f1d59242c604b1d1204882d2eac", + "failed_run": 39692282682, + "failed_job": 119541101644, + "actual_checkout": "7ce8a40dfd240bb81c2f7ffcad947138194494b1", + "raw_log_sha256": "aec251631819cb28b421ef2e517ec4e13dd697949ba6c1328d40e2ef5e4cd404", + "raw_log_retained_locally": "/workspace/pr142-failed-5eb8bf5-executable.log", + "result": { + "tests": 219, + "errors": 2, + "skipped": 27, + "exit_code": 1, + "failure_owner": "source-only CiBudgetContract exact feature-job prefix" + }, + "errors": [ + "test_ci_budget_preserves_every_existing_job_check", + "test_only_exact_reviewed_isolated_setup_and_additive_contracts_are_allowed" + ], + "diagnostic": "runner/budget/matrix/dependencies: feature-contracts", + "repair": "Coordinate the source-only exact expected feature prefix with reviewed actual workflow: exact two comments and60minutes. Frozen baseline and all commands/matrix/aggregate/per-case/scientific checks remain unchanged. Add rejection of30/59/61/missing feature budget.", + "guard_source_sha256": "46a9d538ef4680e983099a3dfdcb6eb98b7ca87a5f8c8ec80e02d64508142960", + "focused_checks": { + "normal": { + "passed": 4, + "failed": 0, + "skipped": 0, + "log_sha256": "f4b0bc8cee953e5b29e79e1e007c4d093d73853a350ee94051b37b6500685085" + }, + "optimized": { + "passed": 4, + "failed": 0, + "skipped": 0, + "log_sha256": "b835a38207a75d7d44c75f3d31d1727f585e5fc31f4e6c2559058accb76f3f6a" + } + }, + "selected_native_input_count": 152, + "selected_native_input_delta": 0, + "source_formula_or_numerical_verifier_delta": 0, + "historical_failed_outcome_preserved": true, + "new_head_ci": "required; pending" +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/ci-budget-guard-repair.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/ci-budget-guard-repair.md new file mode 100644 index 00000000..86dcec3c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/ci-budget-guard-repair.md @@ -0,0 +1,33 @@ +# Exact CI budget contract coordination + +The first reporting head `5eb8bf5607c01f1d59242c604b1d1204882d2eac` exposed a +recoverable source-contract omission: the reviewed outer feature-job budget was +60 minutes, but `tools/test_column_interface_verifier.py` still required the exact +old 30-minute feature prefix. Executable job 119541101644 in run 39692282682 +failed two `CiBudgetContract` checks with +`runner/budget/matrix/dependencies: feature-contracts`. Its full ordinary Python +run reports 219 tests, 2 errors, 27 skips; no numerical-verifier case failed. The +successful smoke export, original failed job/log and outcomes remain retained. +Actual checkout 7ce8a40 merges that reporting head into main15026a9. + +The bounded repair updates only that source-only contract's expected feature +prefix to the exact approved two comments and 60-minute line. The historical +frozen eight-step workflow snapshot remains byte-identical. Every workload, +assertion, action pin, bootstrap, matrix, dependency, executable/aggregate 30-minute +budget and numerical verifier remains exact. No generic range, arbitrary +normalization, conditional skip or success fallback is admitted. + +A new source-only regression proves the actual feature prefix contains exactly +one 60-minute budget, then refuses 30, 59, 61 or missing budgets with the specific +feature-prefix diagnostic. Existing negative cases still reject deleted tests, +changed flags/limits, early/skip success, setup drift and changes to the other +jobs' budgets. The four complete `CiBudgetContract` cases pass normally and +under Python -O, with no skips. They construct no numerical fixture and rerun +no sealed campaign. + +The unchanged conservative native selector still has 152 exact inputs; this +workflow-source guard is outside that closure. Actual native/packet/core +receipts remain on dbd49d3, and the prior failed 5eb8 job is not relabelled. The +[machine receipt](ci-budget-guard-repair.json) binds the failed log, exact new +source and focused checks. Independent repair review and fresh full checks on +the next exact head remain required before normal merge. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/custody-manifest.json b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/custody-manifest.json new file mode 100644 index 00000000..56c69302 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/custody-manifest.json @@ -0,0 +1,1482 @@ +{ + "schema": "rheon-pr142-compact-custody-v1", + "source_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "archive": { + "schema": "rheon-pr142-raw-archive-seal-v1", + "source_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "source_tree": "2f37db7c119b846003f5a01a82d46c4cf965b474", + "archive": "/workspace/rheon-pr142-dbd49d3-qualification.zip", + "sha256": "4d55283ec9894b5c4c742e743913b6bc63fc8fbf413a21b6c6e6098d8e1fa04e", + "bytes": 153125915, + "members": 191, + "all_members_crc_sha256_verified": true, + "member_manifest_sha256": "c26fe09fa7d6961415e0113e510e3360c7cd6ce367e6cd187d0e7234ae359bd1" + }, + "members": { + "CANCELLED-LOCAL-ATTEMPT.json": { + "bytes": 774, + "sha256": "ab181b04fe0b6f684ea123ba41f750aefdc166ba1948d1d5ea6c01001f0e4445" + }, + "RECONCILIATION.json": { + "bytes": 3716, + "sha256": "aa2ff743c2f6c4c1515e36adc28ec6e1c2fe869c986611771d2040616348bc86" + }, + "admission.log": { + "bytes": 262, + "sha256": "3a7efec29f6fdbbe8d9a6af302a0edad462605cc61378feaec8fe213cab92f05" + }, + "cargo-metadata.log": { + "bytes": 32018, + "sha256": "f86839e7411a9432294a52a1d947b88b61e048ef723e01659e2b5e0de4f5d1e4" + }, + "clippy-core-only.log": { + "bytes": 106, + "sha256": "c5b5ac830f0e8d8364d1ac2bbe6a0fb3e06d2651cb2ed81fbb7b8ca9e0959f1d" + }, + "clippy-default.log": { + "bytes": 343, + "sha256": "ed237104fbe554eae7194c7df66089072829fbccb08413d72c15eb67272fcca1" + }, + "driver/run-qualification.py": { + "bytes": 5233, + "sha256": "136201ef09fb74cbe9ea43138ea8b7f354d2412737431314627829ce4009fb9b" + }, + "driver/seal-evidence.py": { + "bytes": 3558, + "sha256": "5579f0f0f7d961749cb720acf12ae3abed9dcac28f80650555128c5acf843685" + }, + "driver/stdout.log": { + "bytes": 770, + "sha256": "987df4bad986d728c5237e28988b9441b007b489f6656d438b741af65c336171" + }, + "executables/007afbbf8594d9f1ab4e208b41638912756ed35f749deeece24b8853a9d503ab": { + "bytes": 1704856, + "sha256": "007afbbf8594d9f1ab4e208b41638912756ed35f749deeece24b8853a9d503ab" + }, + "executables/0090dfb625c0994c6ab628120233ad3fb5610463ba5d086de593d780e22a4d41": { + "bytes": 2082072, + "sha256": "0090dfb625c0994c6ab628120233ad3fb5610463ba5d086de593d780e22a4d41" + }, + "executables/020af57a0fed79064e89bff5c932ef5870d6564a905003c4fa9cef218a00715f": { + "bytes": 1059952, + "sha256": "020af57a0fed79064e89bff5c932ef5870d6564a905003c4fa9cef218a00715f" + }, + "executables/022288243a52c141edea841b0021f11ea67e32607f51e6cb3231ed956c5db733": { + "bytes": 1778232, + "sha256": "022288243a52c141edea841b0021f11ea67e32607f51e6cb3231ed956c5db733" + }, + "executables/05a1fd8b109b7d955754c2b1e2cb88eff95e3490c8607dd1ba369724f65f3937": { + "bytes": 64702752, + "sha256": "05a1fd8b109b7d955754c2b1e2cb88eff95e3490c8607dd1ba369724f65f3937" + }, + "executables/063b9fccf5ae33d713d7f9be18912f5e1864e5a2cbf44ad89ca3bff68261a968": { + "bytes": 4629152, + "sha256": "063b9fccf5ae33d713d7f9be18912f5e1864e5a2cbf44ad89ca3bff68261a968" + }, + "executables/0a89caea3e6673595b0ce2a2820c3cd930bd47f22f66153b96e05e9a192d0bd0": { + "bytes": 4531304, + "sha256": "0a89caea3e6673595b0ce2a2820c3cd930bd47f22f66153b96e05e9a192d0bd0" + }, + "executables/0b8f36d994078eca8c8c05e865e466c37952533ae3cbe9248c5d474e173dbc5f": { + "bytes": 6450520, + "sha256": "0b8f36d994078eca8c8c05e865e466c37952533ae3cbe9248c5d474e173dbc5f" + }, + "executables/1198863bd58c4f251528ed5afbcddb61ef60f26103dc8ea86b610b9c22247b9c": { + "bytes": 3728664, + "sha256": "1198863bd58c4f251528ed5afbcddb61ef60f26103dc8ea86b610b9c22247b9c" + }, + "executables/11b660cac276b1e0eedc8ee8ea13c26bab12ca30248cb6d970d01284aa916faf": { + "bytes": 1060016, + "sha256": "11b660cac276b1e0eedc8ee8ea13c26bab12ca30248cb6d970d01284aa916faf" + }, + "executables/1896166012fe9450851616907de373d7c6a56ac8d7ca657b3683f539592cc705": { + "bytes": 1700560, + "sha256": "1896166012fe9450851616907de373d7c6a56ac8d7ca657b3683f539592cc705" + }, + "executables/1a144d01a4e621a4399f3d4697160c1696d6cc63099f21996c1e1538923e5023": { + "bytes": 2440016, + "sha256": "1a144d01a4e621a4399f3d4697160c1696d6cc63099f21996c1e1538923e5023" + }, + "executables/1a224f838c5845b3df2d99249bd1ed7c23ff74ae6f55a31aeed174721e7dd7b3": { + "bytes": 3756528, + "sha256": "1a224f838c5845b3df2d99249bd1ed7c23ff74ae6f55a31aeed174721e7dd7b3" + }, + "executables/1aaeaba074767941acdc667f8bdc112c6614c72bda48520492685ed824578752": { + "bytes": 1864040, + "sha256": "1aaeaba074767941acdc667f8bdc112c6614c72bda48520492685ed824578752" + }, + "executables/1b03d8f7112140816992aed2089feaae07e8151b715d3fa91a3f5e3492f89dc5": { + "bytes": 8173944, + "sha256": "1b03d8f7112140816992aed2089feaae07e8151b715d3fa91a3f5e3492f89dc5" + }, + "executables/1c77e3ee24114a5388a931af4320e7fd20045466e3f343118c62dbc09a65f315": { + "bytes": 8142872, + "sha256": "1c77e3ee24114a5388a931af4320e7fd20045466e3f343118c62dbc09a65f315" + }, + "executables/1c9f68041eabe637f377522ce240e595bdcb98c27db99c288d800c92974081d3": { + "bytes": 8481088, + "sha256": "1c9f68041eabe637f377522ce240e595bdcb98c27db99c288d800c92974081d3" + }, + "executables/1db254cd354b089299fb6ee11ed0136e6a454593a6216010d6841430c3e0f54f": { + "bytes": 2496880, + "sha256": "1db254cd354b089299fb6ee11ed0136e6a454593a6216010d6841430c3e0f54f" + }, + "executables/243f7b9cf625a2dd11423e8dced82e0e71ea0b81c8f43e7bc0f63468d31680ce": { + "bytes": 1981336, + "sha256": "243f7b9cf625a2dd11423e8dced82e0e71ea0b81c8f43e7bc0f63468d31680ce" + }, + "executables/2516e8ba5590baafa0fc56c198d14af9e59488a3c8dc41d1b72dc72cb3a1129a": { + "bytes": 2645296, + "sha256": "2516e8ba5590baafa0fc56c198d14af9e59488a3c8dc41d1b72dc72cb3a1129a" + }, + "executables/2734eafa6a5805837bf96fb55f39a58c10276818355325cad0d6d7fd885e9735": { + "bytes": 8335424, + "sha256": "2734eafa6a5805837bf96fb55f39a58c10276818355325cad0d6d7fd885e9735" + }, + "executables/276033483d8415ec559a37564790db0c1a4c86eb740b7395d5e491a72686ef80": { + "bytes": 5715760, + "sha256": "276033483d8415ec559a37564790db0c1a4c86eb740b7395d5e491a72686ef80" + }, + "executables/29e9ab2927900d9e6c7dfae1a61dcb1c0ce28a0ea279c4a309cc2393812917de": { + "bytes": 9392864, + "sha256": "29e9ab2927900d9e6c7dfae1a61dcb1c0ce28a0ea279c4a309cc2393812917de" + }, + "executables/29ec150a583aba2b6f099ad65750711f5d89c6caa0e660cb9aab49aadbb5fc98": { + "bytes": 1060000, + "sha256": "29ec150a583aba2b6f099ad65750711f5d89c6caa0e660cb9aab49aadbb5fc98" + }, + "executables/303ee0f85888d43a19e7c6cc14f740f771bafd4144801b59acfbfbc597ee68fb": { + "bytes": 5966144, + "sha256": "303ee0f85888d43a19e7c6cc14f740f771bafd4144801b59acfbfbc597ee68fb" + }, + "executables/32ef98bfeb427cadcc87b94fdfa892a0b55a7290ae4ca63a5d9398e571ec5305": { + "bytes": 4349976, + "sha256": "32ef98bfeb427cadcc87b94fdfa892a0b55a7290ae4ca63a5d9398e571ec5305" + }, + "executables/33f06291862168627d4e483d9fcdb210005989e5effe8d6badece24206c1037f": { + "bytes": 1060016, + "sha256": "33f06291862168627d4e483d9fcdb210005989e5effe8d6badece24206c1037f" + }, + "executables/3730e6f9ee8fb9dbbb4cb96186276c83dbc8c9be5c5ae78a783ba35f5bc02d8e": { + "bytes": 13670800, + "sha256": "3730e6f9ee8fb9dbbb4cb96186276c83dbc8c9be5c5ae78a783ba35f5bc02d8e" + }, + "executables/387d1012d789eb157357d38ac4dd10be6a3dc0183eb8ece2741ec18f05857386": { + "bytes": 1523104, + "sha256": "387d1012d789eb157357d38ac4dd10be6a3dc0183eb8ece2741ec18f05857386" + }, + "executables/39f123fd8f4e5716113512505219387e6e91b59082abe659cf6fef99faf42b57": { + "bytes": 3756632, + "sha256": "39f123fd8f4e5716113512505219387e6e91b59082abe659cf6fef99faf42b57" + }, + "executables/3cb6f842e51d205eb49864ceededb6480485e94ef26d590481b6d742f9413b31": { + "bytes": 64656752, + "sha256": "3cb6f842e51d205eb49864ceededb6480485e94ef26d590481b6d742f9413b31" + }, + "executables/41c2324ae4168699e029d24d96f7c2330e0c24dff0a90888a4b5c5a0aa317d45": { + "bytes": 8791024, + "sha256": "41c2324ae4168699e029d24d96f7c2330e0c24dff0a90888a4b5c5a0aa317d45" + }, + "executables/455627237f504bcf7e756bea9827d540ddfa480642ad707fda93e0c254d44d3e": { + "bytes": 9962048, + "sha256": "455627237f504bcf7e756bea9827d540ddfa480642ad707fda93e0c254d44d3e" + }, + "executables/458aa73b18f515ba83a1aa6f88baeee5d0a9df9da5539106d44471a14ccf0102": { + "bytes": 2378624, + "sha256": "458aa73b18f515ba83a1aa6f88baeee5d0a9df9da5539106d44471a14ccf0102" + }, + "executables/45db020abdc603f624faf1a6851d688297ae864cad01d008c827ebed595d8eea": { + "bytes": 1721488, + "sha256": "45db020abdc603f624faf1a6851d688297ae864cad01d008c827ebed595d8eea" + }, + "executables/47884ec7684ca4e9281bd732c17da3231900d1880e230eeed04227e204b9d9f0": { + "bytes": 1177288, + "sha256": "47884ec7684ca4e9281bd732c17da3231900d1880e230eeed04227e204b9d9f0" + }, + "executables/47d66dbb1b3774891fd8eb848d5c1fd52c9470ba32ab20a5908f024cbf762664": { + "bytes": 11005824, + "sha256": "47d66dbb1b3774891fd8eb848d5c1fd52c9470ba32ab20a5908f024cbf762664" + }, + "executables/4839797d0160511fad5e563c367097e041c6ff4e615946841c746d9abd244bb8": { + "bytes": 6571448, + "sha256": "4839797d0160511fad5e563c367097e041c6ff4e615946841c746d9abd244bb8" + }, + "executables/49822b3df5760f096e78f9d7df9cc7cc7131c8b4448d781a5db87b86e6fd728c": { + "bytes": 1946848, + "sha256": "49822b3df5760f096e78f9d7df9cc7cc7131c8b4448d781a5db87b86e6fd728c" + }, + "executables/4b2c44d880cbada3ac031f81b68c0a120b84aebd8c320f6d20d8d90dfd84943c": { + "bytes": 1482232, + "sha256": "4b2c44d880cbada3ac031f81b68c0a120b84aebd8c320f6d20d8d90dfd84943c" + }, + "executables/4dd188abd041d330fd69f7f168a8a8f1eb21ba34850e263867cbdbf309727500": { + "bytes": 1789592, + "sha256": "4dd188abd041d330fd69f7f168a8a8f1eb21ba34850e263867cbdbf309727500" + }, + "executables/4faee36f339456705f23cd58d2b08178f56a386c2b5910ebdf95871fb289d39d": { + "bytes": 2546304, + "sha256": "4faee36f339456705f23cd58d2b08178f56a386c2b5910ebdf95871fb289d39d" + }, + "executables/52f5a3a956d4841a690b0a7cae2a56a76123628a9bb07c561b21d911231d10f3": { + "bytes": 2696480, + "sha256": "52f5a3a956d4841a690b0a7cae2a56a76123628a9bb07c561b21d911231d10f3" + }, + "executables/541d99bca413ae845f9ddd85b970cc4d0a9b0757307c88b454ca89adf27fdd4a": { + "bytes": 1598184, + "sha256": "541d99bca413ae845f9ddd85b970cc4d0a9b0757307c88b454ca89adf27fdd4a" + }, + "executables/5517c1e085680762e216eb5730665edc3b2221e4791cde4dd56dd603e3d9181f": { + "bytes": 10031000, + "sha256": "5517c1e085680762e216eb5730665edc3b2221e4791cde4dd56dd603e3d9181f" + }, + "executables/59bdebb074fbdff651a10040ddcf094f41c80c5cce161b0a24ca3eb4ab0d7f0b": { + "bytes": 11747376, + "sha256": "59bdebb074fbdff651a10040ddcf094f41c80c5cce161b0a24ca3eb4ab0d7f0b" + }, + "executables/5f084174e86510fec938cdae7de65513354cb255982f38cddb65e5684d05ec1e": { + "bytes": 1762344, + "sha256": "5f084174e86510fec938cdae7de65513354cb255982f38cddb65e5684d05ec1e" + }, + "executables/6023047c40d17fecd9c3c5ee1819e81148296f2562a525bc2b29f271a78d5256": { + "bytes": 2255656, + "sha256": "6023047c40d17fecd9c3c5ee1819e81148296f2562a525bc2b29f271a78d5256" + }, + "executables/639b830894e4932a16f98239a4a904b7e7d24143a3cef6360cd87e59ea518c8a": { + "bytes": 4629176, + "sha256": "639b830894e4932a16f98239a4a904b7e7d24143a3cef6360cd87e59ea518c8a" + }, + "executables/679595cbde19ea92ea3aaf88ea931018b166636b93401dc90b0e0b4c91249e74": { + "bytes": 7751448, + "sha256": "679595cbde19ea92ea3aaf88ea931018b166636b93401dc90b0e0b4c91249e74" + }, + "executables/6bdb99615194b51ec7e6da4b10203c422fdb643273ca93904d0d0150cc3ab1dd": { + "bytes": 2142144, + "sha256": "6bdb99615194b51ec7e6da4b10203c422fdb643273ca93904d0d0150cc3ab1dd" + }, + "executables/6ec811d8800f329fc22c4250396ff4c714c82a1342e9db6194570afd4d5980bb": { + "bytes": 1060000, + "sha256": "6ec811d8800f329fc22c4250396ff4c714c82a1342e9db6194570afd4d5980bb" + }, + "executables/6fe7d8422f2a4b1450ecf48216b7103a7bdf1f750daeb7d597a401065e676bf6": { + "bytes": 7720384, + "sha256": "6fe7d8422f2a4b1450ecf48216b7103a7bdf1f750daeb7d597a401065e676bf6" + }, + "executables/73788ee2e04d8283583dfb730b2ee68578c53a397688fdf942c11f2237d6895c": { + "bytes": 1060000, + "sha256": "73788ee2e04d8283583dfb730b2ee68578c53a397688fdf942c11f2237d6895c" + }, + "executables/7478a2679b1347270cb09bd0b56b4d135e73e7eae30b9a7dc5dde4bc1b5d9320": { + "bytes": 7323864, + "sha256": "7478a2679b1347270cb09bd0b56b4d135e73e7eae30b9a7dc5dde4bc1b5d9320" + }, + "executables/76fa3d0f399f91eb97d8772777083fd3780cbfa575a8ec42a574b2a70874e31a": { + "bytes": 8754712, + "sha256": "76fa3d0f399f91eb97d8772777083fd3780cbfa575a8ec42a574b2a70874e31a" + }, + "executables/77136404e28aa1418cdf28fa1893db91b3d5e25843511d33c7e0cba5aa1c486b": { + "bytes": 6478880, + "sha256": "77136404e28aa1418cdf28fa1893db91b3d5e25843511d33c7e0cba5aa1c486b" + }, + "executables/79ebc295361edf431c76fb15727b365ba7ca97df07395bbf4cc1f960d1b66e65": { + "bytes": 1060016, + "sha256": "79ebc295361edf431c76fb15727b365ba7ca97df07395bbf4cc1f960d1b66e65" + }, + "executables/7af1950bb701df1e65909266fd84a0f8e6b5591681a091561c4b91a29f3802ee": { + "bytes": 3263384, + "sha256": "7af1950bb701df1e65909266fd84a0f8e6b5591681a091561c4b91a29f3802ee" + }, + "executables/7e65ad6ae3e08ee8d60e32e0cc841817e6a231273bc7df970595b8bca5fcafde": { + "bytes": 2877560, + "sha256": "7e65ad6ae3e08ee8d60e32e0cc841817e6a231273bc7df970595b8bca5fcafde" + }, + "executables/7e97cafcf0eada322c01d64b78143d4015b2804e7fd93a33cead2a6db58c6122": { + "bytes": 1059984, + "sha256": "7e97cafcf0eada322c01d64b78143d4015b2804e7fd93a33cead2a6db58c6122" + }, + "executables/7f4ce297640847a077c6a067a364b848df7681e8dbbdf7513eb33cb647d56f72": { + "bytes": 7295496, + "sha256": "7f4ce297640847a077c6a067a364b848df7681e8dbbdf7513eb33cb647d56f72" + }, + "executables/80e8d6b0bea227613ae6bea5241b64a44118fad997b3a3038d9648ea23e9e121": { + "bytes": 1228528, + "sha256": "80e8d6b0bea227613ae6bea5241b64a44118fad997b3a3038d9648ea23e9e121" + }, + "executables/82b311fc7fa6f20448e2b9bb10e3c3e27f88a145be9389f003ba97b04eae7e07": { + "bytes": 5260792, + "sha256": "82b311fc7fa6f20448e2b9bb10e3c3e27f88a145be9389f003ba97b04eae7e07" + }, + "executables/849a455c295e05babbe4886c7f7feee0b95a70d5df3bb898e5da51bded3bcb74": { + "bytes": 11769712, + "sha256": "849a455c295e05babbe4886c7f7feee0b95a70d5df3bb898e5da51bded3bcb74" + }, + "executables/85a2a21c3cfc1ce7f5508f7ddecc63f5551469f1b6b0c73d102e258b20ec25a8": { + "bytes": 6018424, + "sha256": "85a2a21c3cfc1ce7f5508f7ddecc63f5551469f1b6b0c73d102e258b20ec25a8" + }, + "executables/85ccca0c9ae01c7829b2e3bfa74f401e1377c7b2504c1cfcb6281bb6add98e9f": { + "bytes": 6626320, + "sha256": "85ccca0c9ae01c7829b2e3bfa74f401e1377c7b2504c1cfcb6281bb6add98e9f" + }, + "executables/8ae4438acc7e4b6019bfb20d9b177679b3b0a6a7d137039d7a5b4e2913c4dadb": { + "bytes": 1603952, + "sha256": "8ae4438acc7e4b6019bfb20d9b177679b3b0a6a7d137039d7a5b4e2913c4dadb" + }, + "executables/8b621c23bc307be9fdeaee9fc0f141f9190bb51879e316fd915240791c3f7b1e": { + "bytes": 2171032, + "sha256": "8b621c23bc307be9fdeaee9fc0f141f9190bb51879e316fd915240791c3f7b1e" + }, + "executables/8d471d547c7417a820528e1d8add03f84ce0aad53763bd29d61402cd20f3a2cf": { + "bytes": 5789232, + "sha256": "8d471d547c7417a820528e1d8add03f84ce0aad53763bd29d61402cd20f3a2cf" + }, + "executables/94c312687aedd4b574ee1cea6ff359ff0c8d274b8087b71e4664a15bda2a8482": { + "bytes": 1866528, + "sha256": "94c312687aedd4b574ee1cea6ff359ff0c8d274b8087b71e4664a15bda2a8482" + }, + "executables/9634bbce4da044d2413e60e5d89612bbbb9a6cfc6d449621d3962bd38fd23145": { + "bytes": 1892504, + "sha256": "9634bbce4da044d2413e60e5d89612bbbb9a6cfc6d449621d3962bd38fd23145" + }, + "executables/9738f05ae69aecb06e4267ee40818c4636f9af5b5047628da09390b2beb1c4c2": { + "bytes": 3291328, + "sha256": "9738f05ae69aecb06e4267ee40818c4636f9af5b5047628da09390b2beb1c4c2" + }, + "executables/97c6e4941ebc32cf26e211a37866b8e12dd7847b472095261cccab980b8756ad": { + "bytes": 2044160, + "sha256": "97c6e4941ebc32cf26e211a37866b8e12dd7847b472095261cccab980b8756ad" + }, + "executables/992531c834018a6a083a725ffd60850ccd873f7eb1ceb6b41773ebcc037ba313": { + "bytes": 6532296, + "sha256": "992531c834018a6a083a725ffd60850ccd873f7eb1ceb6b41773ebcc037ba313" + }, + "executables/9a63b12c6dc1abaa4ecf5fdadd71a5f0ec370a89de6bb8f37113cabf140ed89d": { + "bytes": 1059976, + "sha256": "9a63b12c6dc1abaa4ecf5fdadd71a5f0ec370a89de6bb8f37113cabf140ed89d" + }, + "executables/9a82ab433ddbf666d27155fe0e75bed1fd9b2902de0974914860e3e78a49b97f": { + "bytes": 7172552, + "sha256": "9a82ab433ddbf666d27155fe0e75bed1fd9b2902de0974914860e3e78a49b97f" + }, + "executables/9f26be8199f70979e48754ced6b04ef5e7e8e208df741e7058d98f08f051a4a8": { + "bytes": 9361064, + "sha256": "9f26be8199f70979e48754ced6b04ef5e7e8e208df741e7058d98f08f051a4a8" + }, + "executables/9f387ef91a1df61d054ca9afafcfa6df2ce1ca8df863ac180e83137d785f8bab": { + "bytes": 1749072, + "sha256": "9f387ef91a1df61d054ca9afafcfa6df2ce1ca8df863ac180e83137d785f8bab" + }, + "executables/a00f9c38f8d15774319f5ad2e3617502cbd6eae55335d41ec51021989eb45a41": { + "bytes": 4237552, + "sha256": "a00f9c38f8d15774319f5ad2e3617502cbd6eae55335d41ec51021989eb45a41" + }, + "executables/a157607b7ac427e472be8e41720e2d201880494cc4a8df3beb6e26d82ff0e75c": { + "bytes": 2573608, + "sha256": "a157607b7ac427e472be8e41720e2d201880494cc4a8df3beb6e26d82ff0e75c" + }, + "executables/a17342ed03f73ad3576f7ab7fbf48df97e5cca9f0c4bb925a46f280b0902c9d4": { + "bytes": 4242136, + "sha256": "a17342ed03f73ad3576f7ab7fbf48df97e5cca9f0c4bb925a46f280b0902c9d4" + }, + "executables/a20d5097d88636c855323f635f7b9bfa3ca8c8c73112743e65aebdb49b6551f7": { + "bytes": 4319464, + "sha256": "a20d5097d88636c855323f635f7b9bfa3ca8c8c73112743e65aebdb49b6551f7" + }, + "executables/a31c689409bdfafee2cad34b70033594af25e6eb5f744ef2c1dade2cb02eb9b8": { + "bytes": 1060000, + "sha256": "a31c689409bdfafee2cad34b70033594af25e6eb5f744ef2c1dade2cb02eb9b8" + }, + "executables/a52950a500ba52c07875bb5f2714a3945cfe0736c5a305315b2ec4691e5e43bb": { + "bytes": 5684040, + "sha256": "a52950a500ba52c07875bb5f2714a3945cfe0736c5a305315b2ec4691e5e43bb" + }, + "executables/a53f78879e1a323437b8d3bf15fea9d27bdd6bfa0f2b661863b5aadf7ef71777": { + "bytes": 13707304, + "sha256": "a53f78879e1a323437b8d3bf15fea9d27bdd6bfa0f2b661863b5aadf7ef71777" + }, + "executables/a60ecc90b424e252dc88a2c8335670c5b148e354866cca2f0f16322761f26a18": { + "bytes": 1628992, + "sha256": "a60ecc90b424e252dc88a2c8335670c5b148e354866cca2f0f16322761f26a18" + }, + "executables/ae4cc4d7d0a9265660b4901e67e22b87ac9c0c1ff05c0280067f0281b2caa67c": { + "bytes": 1060000, + "sha256": "ae4cc4d7d0a9265660b4901e67e22b87ac9c0c1ff05c0280067f0281b2caa67c" + }, + "executables/af106b0623471181e08be7d7524e211a4eb5fe9eab94152d01969a01fff387cd": { + "bytes": 1672072, + "sha256": "af106b0623471181e08be7d7524e211a4eb5fe9eab94152d01969a01fff387cd" + }, + "executables/afc494454ef29953093603f8fdc9cf134931c62a4fec5208fc10ea5ae1a964cb": { + "bytes": 3765208, + "sha256": "afc494454ef29953093603f8fdc9cf134931c62a4fec5208fc10ea5ae1a964cb" + }, + "executables/b3fbd16a09afb044330f2d56552f83d5bcc18f6b7a1fe39fb675e74fde0462ed": { + "bytes": 1059984, + "sha256": "b3fbd16a09afb044330f2d56552f83d5bcc18f6b7a1fe39fb675e74fde0462ed" + }, + "executables/bb0969d433610bc4e79463cb13cf3f8b412e76fea0e404e91afef0f68b8f9542": { + "bytes": 7123600, + "sha256": "bb0969d433610bc4e79463cb13cf3f8b412e76fea0e404e91afef0f68b8f9542" + }, + "executables/bb0ae05831585679b79a0c32fdc05b537984a8acddfdc02d38c01f7066d15fb5": { + "bytes": 4598368, + "sha256": "bb0ae05831585679b79a0c32fdc05b537984a8acddfdc02d38c01f7066d15fb5" + }, + "executables/bb9cbef3a088c7cc60db0c6e94561d34fd48cf699be55792b0b6057fe4ed4797": { + "bytes": 1798288, + "sha256": "bb9cbef3a088c7cc60db0c6e94561d34fd48cf699be55792b0b6057fe4ed4797" + }, + "executables/bbdeb07a2b4612e2e236d359caa0a0efe91fc020be22a7b51f24d6edb2cd3422": { + "bytes": 8541824, + "sha256": "bbdeb07a2b4612e2e236d359caa0a0efe91fc020be22a7b51f24d6edb2cd3422" + }, + "executables/bfd9a3518a804a1bc90b5a99818e567eb4e970160e74d6fd874e4769f32edee4": { + "bytes": 2163552, + "sha256": "bfd9a3518a804a1bc90b5a99818e567eb4e970160e74d6fd874e4769f32edee4" + }, + "executables/c04fef7a4d8d57557359252d92ded7140f5f46b9eabc739a56941ef16471e207": { + "bytes": 1895800, + "sha256": "c04fef7a4d8d57557359252d92ded7140f5f46b9eabc739a56941ef16471e207" + }, + "executables/c12b75f9f552825da8d6f2441aa2b3fedf33b254a3da1d25d74406cf2d320cc1": { + "bytes": 5228992, + "sha256": "c12b75f9f552825da8d6f2441aa2b3fedf33b254a3da1d25d74406cf2d320cc1" + }, + "executables/c24a88d394807f0ffff71478f74570f8a33f2cedc4170c0fe865e862247e6377": { + "bytes": 1850992, + "sha256": "c24a88d394807f0ffff71478f74570f8a33f2cedc4170c0fe865e862247e6377" + }, + "executables/c281cc62b4185da796572bc9f63bc85e3ad7bba8a9fdc3fce2056d232bba1e53": { + "bytes": 6664160, + "sha256": "c281cc62b4185da796572bc9f63bc85e3ad7bba8a9fdc3fce2056d232bba1e53" + }, + "executables/c302f6eeb8051d3cd699e34f92bdd88c8796c7c06ee65d16e012792161d86351": { + "bytes": 1060000, + "sha256": "c302f6eeb8051d3cd699e34f92bdd88c8796c7c06ee65d16e012792161d86351" + }, + "executables/c49e5a9eefebd30d11be76de8522c72da2802cf1034b31eeae9036cd842f1245": { + "bytes": 6814616, + "sha256": "c49e5a9eefebd30d11be76de8522c72da2802cf1034b31eeae9036cd842f1245" + }, + "executables/c68e945cc66e1295dbb6afc032be541438a3e4eaff3e6e0d132e9fe834fb41da": { + "bytes": 5938160, + "sha256": "c68e945cc66e1295dbb6afc032be541438a3e4eaff3e6e0d132e9fe834fb41da" + }, + "executables/c6ac223b6dcadbc04b4f37ed218e8d5fd9774c96decbd2ad6ab39d3a7edf70fe": { + "bytes": 11801512, + "sha256": "c6ac223b6dcadbc04b4f37ed218e8d5fd9774c96decbd2ad6ab39d3a7edf70fe" + }, + "executables/c7a7cd6bd8da1d909117a739e831062e66f8381c8a0c162f0c54c348921b3298": { + "bytes": 7494688, + "sha256": "c7a7cd6bd8da1d909117a739e831062e66f8381c8a0c162f0c54c348921b3298" + }, + "executables/cc079b98f8c746f4296c83a34a37fb7251dc13093a644228481991d71d349234": { + "bytes": 2147456, + "sha256": "cc079b98f8c746f4296c83a34a37fb7251dc13093a644228481991d71d349234" + }, + "executables/ccb25a553195c13628b943c13d3548fe55787af25efc1f38f6ffa1abc2cbbeac": { + "bytes": 2177656, + "sha256": "ccb25a553195c13628b943c13d3548fe55787af25efc1f38f6ffa1abc2cbbeac" + }, + "executables/cd479dad1bc35615885b6443aa11338543ff7e8927285ced7bf49b69809096ae": { + "bytes": 6056616, + "sha256": "cd479dad1bc35615885b6443aa11338543ff7e8927285ced7bf49b69809096ae" + }, + "executables/ced10faa8962333699ef33ad05344c2e857d345067ce8e6267d566917924c5ce": { + "bytes": 4597480, + "sha256": "ced10faa8962333699ef33ad05344c2e857d345067ce8e6267d566917924c5ce" + }, + "executables/cfc68f63a9dc7f3e0535167257d83dffa09a5087d3b9717d29567eab35dccd64": { + "bytes": 3570576, + "sha256": "cfc68f63a9dc7f3e0535167257d83dffa09a5087d3b9717d29567eab35dccd64" + }, + "executables/d06841e99fb92ebdc014ad4f50c4e4c777228b26cad203eb4159b74fd31e44a9": { + "bytes": 8021872, + "sha256": "d06841e99fb92ebdc014ad4f50c4e4c777228b26cad203eb4159b74fd31e44a9" + }, + "executables/d09f6c40113571f9f37b26afbefa502c9e45fd232d65742d0e0d1c42c988c53a": { + "bytes": 2468152, + "sha256": "d09f6c40113571f9f37b26afbefa502c9e45fd232d65742d0e0d1c42c988c53a" + }, + "executables/d5714a8fc74fe79036cdccb847a4b81be33b7a02421bcc6c91ca54b69887c88d": { + "bytes": 1604704, + "sha256": "d5714a8fc74fe79036cdccb847a4b81be33b7a02421bcc6c91ca54b69887c88d" + }, + "executables/d78558e8e9e84bd03f50958f0a80c529ea4bf56ff127ebeac95d23dc377f25b2": { + "bytes": 3733544, + "sha256": "d78558e8e9e84bd03f50958f0a80c529ea4bf56ff127ebeac95d23dc377f25b2" + }, + "executables/da65bd6bc1dfc77ddb5a64f54af5de3c9d52c052c273274a516b627afe91b152": { + "bytes": 1676872, + "sha256": "da65bd6bc1dfc77ddb5a64f54af5de3c9d52c052c273274a516b627afe91b152" + }, + "executables/deee2bc9ba82d112773ec84234cba5059ad53d2e6e9a86f2b4439b591eadda27": { + "bytes": 5856888, + "sha256": "deee2bc9ba82d112773ec84234cba5059ad53d2e6e9a86f2b4439b591eadda27" + }, + "executables/e0d83230607f6f9c9a236356c31f35456c8c9d6160c3fbc585353d93835b769b": { + "bytes": 1060016, + "sha256": "e0d83230607f6f9c9a236356c31f35456c8c9d6160c3fbc585353d93835b769b" + }, + "executables/e619290dd8d1abf22d1d99cd7c03563d5d86cd029cd5ced058958bfaa8cc06ca": { + "bytes": 1750520, + "sha256": "e619290dd8d1abf22d1d99cd7c03563d5d86cd029cd5ced058958bfaa8cc06ca" + }, + "executables/ecc2d0f0eaaccd3773d977710ebb014f21fcabb791dc4d0c310283c4a76d13ff": { + "bytes": 1060000, + "sha256": "ecc2d0f0eaaccd3773d977710ebb014f21fcabb791dc4d0c310283c4a76d13ff" + }, + "executables/edaaa9de98b2860cea5a763ca59852f84631f2aa165fb1008531b9a540de6564": { + "bytes": 1653144, + "sha256": "edaaa9de98b2860cea5a763ca59852f84631f2aa165fb1008531b9a540de6564" + }, + "executables/ee4a2344251a72ffc7a77bca31290bc08823b833c5d654c240a21461a6c3b2b0": { + "bytes": 6942264, + "sha256": "ee4a2344251a72ffc7a77bca31290bc08823b833c5d654c240a21461a6c3b2b0" + }, + "executables/f2911738e1eb1f77ec084e7bb7511d1e902e378de57aad895db11bd3160f8eed": { + "bytes": 2548248, + "sha256": "f2911738e1eb1f77ec084e7bb7511d1e902e378de57aad895db11bd3160f8eed" + }, + "executables/f2ba485b0b94e7939dc9f9471aa1738be6a4d27dd40b5152a220be6fad2a6b16": { + "bytes": 3540936, + "sha256": "f2ba485b0b94e7939dc9f9471aa1738be6a4d27dd40b5152a220be6fad2a6b16" + }, + "executables/f3684dde6ff22bc0ea640fcf88e71a096551af73bfc9e2bfd8ca150c3ed1d9aa": { + "bytes": 2678184, + "sha256": "f3684dde6ff22bc0ea640fcf88e71a096551af73bfc9e2bfd8ca150c3ed1d9aa" + }, + "executables/f4a35facc6d6d187aee28bd479ae9fe531a714727eaa6b9e4921460fa6360f94": { + "bytes": 1059968, + "sha256": "f4a35facc6d6d187aee28bd479ae9fe531a714727eaa6b9e4921460fa6360f94" + }, + "executables/f4df9ad6b89af2948344879887b785cd07f1d039a2470142e02a660f032000f7": { + "bytes": 1625288, + "sha256": "f4df9ad6b89af2948344879887b785cd07f1d039a2470142e02a660f032000f7" + }, + "executables/f68eaa10a8bd0525e6b69e2de2973e874b1b8109e85ebe57ca8b8e64062ce38c": { + "bytes": 2575968, + "sha256": "f68eaa10a8bd0525e6b69e2de2973e874b1b8109e85ebe57ca8b8e64062ce38c" + }, + "executables/f7554e4b3c346a8711b529631719680fe46d32baae16467f64cdaa5e0288123f": { + "bytes": 1059976, + "sha256": "f7554e4b3c346a8711b529631719680fe46d32baae16467f64cdaa5e0288123f" + }, + "executables/fa853ad4e8a19dfa3435309c6e2ffd1508c679214989ed1751b884e0c5c0e491": { + "bytes": 7206680, + "sha256": "fa853ad4e8a19dfa3435309c6e2ffd1508c679214989ed1751b884e0c5c0e491" + }, + "executables/fafb4fe8d5040e4bcf2d714f919c7dc111b002d6d98d942fb8dd637a047d4678": { + "bytes": 1059984, + "sha256": "fafb4fe8d5040e4bcf2d714f919c7dc111b002d6d98d942fb8dd637a047d4678" + }, + "executables/fcd65a0fe57256f3707513fd4855fbd1ea33b10bf28adcc4321b56163de7e7a5": { + "bytes": 1826272, + "sha256": "fcd65a0fe57256f3707513fd4855fbd1ea33b10bf28adcc4321b56163de7e7a5" + }, + "format.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "hosted/119526972309.log": { + "bytes": 151657, + "sha256": "836c1482f5da4eea789a7b89288d7cb03cbdade69d918cb99ddaeb0c1dbca13b" + }, + "hosted/119526972766.log": { + "bytes": 239506, + "sha256": "bf80a828f9e7be4dde2d3add12955e464df2d65c5af6569354dc2fb2ff1806c9" + }, + "hosted/119526972867.log": { + "bytes": 147674, + "sha256": "a6b2a716c69de8a2bd581516c62464aaf96e360fe021999c98ca4a546bd8bacf" + }, + "hosted/jobs.json": { + "bytes": 11380, + "sha256": "11ce888de9235095fb8aa88438e20270c780995f467c7723f33b03d16619ed74" + }, + "hosted/run.json": { + "bytes": 12555, + "sha256": "3853ee6239122db61a7f7a9c54dbc0f217092a539b6af911f29d4d65291a2196" + }, + "journal.json": { + "bytes": 289263, + "sha256": "f7e8cb4a45f4fafbb6b12b1282157867738d1880b103eb0760ea66dbcb73e992" + }, + "native-qualification.log": { + "bytes": 263, + "sha256": "5c9c0b18274ffa180b0a16abad8a3681c6843d158eeff1bd6b1a5748f1b50347" + }, + "native/format.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native/large-origin-nonmidpoint-oracle-comparison.log": { + "bytes": 822, + "sha256": "c4ba2c4f41b3610efa2d945da86bb525da3a133582808244aafa0a72cc55f0c2" + }, + "native/large-origin-nonmidpoint-oracle-summary.json": { + "bytes": 822, + "sha256": "c4ba2c4f41b3610efa2d945da86bb525da3a133582808244aafa0a72cc55f0c2" + }, + "native/large-origin-nonmidpoint-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native/large-origin-nonmidpoint.tsv": { + "bytes": 39656, + "sha256": "38405a03996ba2be5dc952b85b1d7e0b0e7df4d115e30b9bdfe14852e55c3628" + }, + "native/native-oracle-comparison.log": { + "bytes": 402, + "sha256": "5e43659700729d7cc5d0e0250c0a3019d6fa9071d4b293657944ea00dda02425" + }, + "native/native-oracle-summary.json": { + "bytes": 402, + "sha256": "5e43659700729d7cc5d0e0250c0a3019d6fa9071d4b293657944ea00dda02425" + }, + "native/native-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native/native.tsv": { + "bytes": 112802, + "sha256": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45" + }, + "native/oracle-tests-optimized.log": { + "bytes": 1633, + "sha256": "706dc27569a1dbc330f92e4c81a8fd1b06d1cc7fbba332f7227a122d67f660b7" + }, + "native/oracle-tests.log": { + "bytes": 1633, + "sha256": "2edf5d69509c6dfd8a780163298d62a613be1c4ba1ec9b449cb136b60e06b834" + }, + "native/qualification-gate-tests-optimized.log": { + "bytes": 872, + "sha256": "44a1a7630f01d8905f57c4303a34c92d6f26221015df7365307504ae332a810f" + }, + "native/qualification-gate-tests.log": { + "bytes": 872, + "sha256": "7c5821bac407cda67d413b016da118be9e4848bbbf5e6f96f65977e0407f1e85" + }, + "native/qualification.json": { + "bytes": 258371, + "sha256": "c295a810ccc480bd5fd267179f89f9815a419c03fc3ad8f5211d2c188caa3bf7" + }, + "native/reflected-anisotropic-oracle-comparison.log": { + "bytes": 418, + "sha256": "4f48508dd4a59fc2a9c100acc6c7179393782cafba86b0df4862015163667765" + }, + "native/reflected-anisotropic-oracle-summary.json": { + "bytes": 418, + "sha256": "4f48508dd4a59fc2a9c100acc6c7179393782cafba86b0df4862015163667765" + }, + "native/reflected-anisotropic-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native/reflected-anisotropic.tsv": { + "bytes": 100823, + "sha256": "04821a0128a562dc796b5ec369e552eff2b867d09c55a7d1333cdfb35048b4d3" + }, + "native/represented-nonmidpoint-oracle-comparison.log": { + "bytes": 1047, + "sha256": "458f42df77d9c75e81818d6893441937045f241b888669912b63d19d02a4d9ae" + }, + "native/represented-nonmidpoint-oracle-summary.json": { + "bytes": 1047, + "sha256": "458f42df77d9c75e81818d6893441937045f241b888669912b63d19d02a4d9ae" + }, + "native/represented-nonmidpoint-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native/represented-nonmidpoint.tsv": { + "bytes": 112802, + "sha256": "c7eed9042d4806d437a573ddae91817c692c8cbd77b32e2df296b0e0b38d96f2" + }, + "native/rust-build.log": { + "bytes": 105, + "sha256": "e0603cfd1cfa74e6d5757b2024b781a1e962335568366310e09d910ba05ac4a2" + }, + "native/rust-clippy.log": { + "bytes": 105, + "sha256": "ecbf53654128420d0f4f0052a53572bde464835e2fe11eb9dd111c2dbecd8beb" + }, + "native/rust-contracts.log": { + "bytes": 4173, + "sha256": "2cfad8dea3400d1e2200b4f8f191a49c5090ac3cb58e3360bd421a5ed6c26f53" + }, + "native/unit-center-cube-oracle-comparison.log": { + "bytes": 400, + "sha256": "324602066581959b0f796442860d9c276f645f94084da08da5f14b0eab734ba9" + }, + "native/unit-center-cube-oracle-summary.json": { + "bytes": 400, + "sha256": "324602066581959b0f796442860d9c276f645f94084da08da5f14b0eab734ba9" + }, + "native/unit-center-cube-run.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "native/unit-center-cube.tsv": { + "bytes": 39656, + "sha256": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566" + }, + "packet-create.log": { + "bytes": 253, + "sha256": "fd127d5f1159ad2e69a5831579fd38a0c63c863c7b3f3a691e59332247f2ba24" + }, + "packet-normal.log": { + "bytes": 4272, + "sha256": "a04e93f3b3e6f20b2fe038de501646ba32563d3c05955c968da1fa09b13867be" + }, + "packet-optimized.log": { + "bytes": 4272, + "sha256": "03ff512a4b50f585043bd41cdb983acec1987883cb501c9eb142e60039d122fd" + }, + "packet/data.json": { + "bytes": 131754, + "sha256": "2a3e9211269177acedb343dac7055b1429456f3d20afaa00fc4a0270a1b02410" + }, + "packet/native.tsv": { + "bytes": 39656, + "sha256": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566" + }, + "packet/primary-qualification.json": { + "bytes": 258371, + "sha256": "c295a810ccc480bd5fd267179f89f9815a419c03fc3ad8f5211d2c188caa3bf7" + }, + "packet/qualification.json": { + "bytes": 17382, + "sha256": "59a2c46d1bb0bd2ae2255ab80d146acd1744be6e7e74aa018b22f61218c1d434" + }, + "preflight/desktop-directory-regression-exact.log": { + "bytes": 391, + "sha256": "09ae282c0ff19974b67cbe7415534dca5f801775c20cf0bc3f161547d8786656" + }, + "preflight/desktop-directory-regression.log": { + "bytes": 15409, + "sha256": "a6546c81d49699ef983691a72dc43c507e62c5887586caaf205c482331b4bad4" + }, + "preflight/desktop-original-collision-contract.log": { + "bytes": 405, + "sha256": "1021379b5c300dec87828fd6a753884df32ee96eaff36746b4e9ae1125f38fb9" + }, + "preflight/expected-stale-admission.log": { + "bytes": 388, + "sha256": "bfae68d322da416895ad29301a6a8bd634bfb03a35d0815ce47dc0fef9847f73" + }, + "tests-core-only.log": { + "bytes": 83434, + "sha256": "54bbe5bccc9eb45509ee215a6a5903ae29ba58bad9474c302f8e2c066feb7107" + }, + "tests-default.log": { + "bytes": 49532, + "sha256": "200ee402e911511b116a198776b3999c5e704f3da30a35530262fe6e3ba73b48" + } + }, + "executing_elf_entries": { + "/workspace/pr142-target/debug/examples/aligned_strain": { + "sha256": "4b2c44d880cbada3ac031f81b68c0a120b84aebd8c320f6d20d8d90dfd84943c", + "copy": "executables/4b2c44d880cbada3ac031f81b68c0a120b84aebd8c320f6d20d8d90dfd84943c" + }, + "/workspace/pr142-target/debug/deps/aligned_strain_contract-2260b287e32432c2": { + "sha256": "cc079b98f8c746f4296c83a34a37fb7251dc13093a644228481991d71d349234", + "copy": "executables/cc079b98f8c746f4296c83a34a37fb7251dc13093a644228481991d71d349234" + }, + "/workspace/pr142-target/debug/deps/obstacle_flow_contract-960c9dc0be44c2f9": { + "sha256": "52f5a3a956d4841a690b0a7cae2a56a76123628a9bb07c561b21d911231d10f3", + "copy": "executables/52f5a3a956d4841a690b0a7cae2a56a76123628a9bb07c561b21d911231d10f3" + }, + "/workspace/pr142-target/debug/deps/static_obstacle_contract-b0d0ccb0b94e567b": { + "sha256": "97c6e4941ebc32cf26e211a37866b8e12dd7847b472095261cccab980b8756ad", + "copy": "executables/97c6e4941ebc32cf26e211a37866b8e12dd7847b472095261cccab980b8756ad" + }, + "/workspace/pr142-target/debug/examples/aligned_strain-e0c34e514a40a128": { + "sha256": "d5714a8fc74fe79036cdccb847a4b81be33b7a02421bcc6c91ca54b69887c88d", + "copy": "executables/d5714a8fc74fe79036cdccb847a4b81be33b7a02421bcc6c91ca54b69887c88d" + }, + "/workspace/pr142-target/debug/deps/rheon-a429e726eb179735": { + "sha256": "3cb6f842e51d205eb49864ceededb6480485e94ef26d590481b6d742f9413b31", + "copy": "executables/3cb6f842e51d205eb49864ceededb6480485e94ef26d590481b6d742f9413b31" + }, + "/workspace/pr142-target/debug/deps/advection_contract-65a3485ff5cd028f": { + "sha256": "45db020abdc603f624faf1a6851d688297ae864cad01d008c827ebed595d8eea", + "copy": "executables/45db020abdc603f624faf1a6851d688297ae864cad01d008c827ebed595d8eea" + }, + "/workspace/pr142-target/debug/deps/aligned_stokes_contract-858ba93c0d9c9d0f": { + "sha256": "f2ba485b0b94e7939dc9f9471aa1738be6a4d27dd40b5152a220be6fad2a6b16", + "copy": "executables/f2ba485b0b94e7939dc9f9471aa1738be6a4d27dd40b5152a220be6fad2a6b16" + }, + "/workspace/pr142-target/debug/deps/box_flux_contract-3cc72bf27f06dd82": { + "sha256": "1a144d01a4e621a4399f3d4697160c1696d6cc63099f21996c1e1538923e5023", + "copy": "executables/1a144d01a4e621a4399f3d4697160c1696d6cc63099f21996c1e1538923e5023" + }, + "/workspace/pr142-target/debug/deps/box_flux_step_contract-d52dc2423d7e71b1": { + "sha256": "849a455c295e05babbe4886c7f7feee0b95a70d5df3bb898e5da51bded3bcb74", + "copy": "executables/849a455c295e05babbe4886c7f7feee0b95a70d5df3bb898e5da51bded3bcb74" + }, + "/workspace/pr142-target/debug/deps/cli_contract-b837608c54ecee63": { + "sha256": "f4a35facc6d6d187aee28bd479ae9fe531a714727eaa6b9e4921460fa6360f94", + "copy": "executables/f4a35facc6d6d187aee28bd479ae9fe531a714727eaa6b9e4921460fa6360f94" + }, + "/workspace/pr142-target/debug/deps/collision_contract-deb13aaaebb86b44": { + "sha256": "bb9cbef3a088c7cc60db0c6e94561d34fd48cf699be55792b0b6057fe4ed4797", + "copy": "executables/bb9cbef3a088c7cc60db0c6e94561d34fd48cf699be55792b0b6057fe4ed4797" + }, + "/workspace/pr142-target/debug/deps/column_mac_contract-3aa9996e46a80f1d": { + "sha256": "a20d5097d88636c855323f635f7b9bfa3ca8c8c73112743e65aebdb49b6551f7", + "copy": "executables/a20d5097d88636c855323f635f7b9bfa3ca8c8c73112743e65aebdb49b6551f7" + }, + "/workspace/pr142-target/debug/deps/column_momentum_contract-a2d25d960d97f6d4": { + "sha256": "4faee36f339456705f23cd58d2b08178f56a386c2b5910ebdf95871fb289d39d", + "copy": "executables/4faee36f339456705f23cd58d2b08178f56a386c2b5910ebdf95871fb289d39d" + }, + "/workspace/pr142-target/debug/deps/column_shear_contract-ef1df61103e57e68": { + "sha256": "c68e945cc66e1295dbb6afc032be541438a3e4eaff3e6e0d132e9fe834fb41da", + "copy": "executables/c68e945cc66e1295dbb6afc032be541438a3e4eaff3e6e0d132e9fe834fb41da" + }, + "/workspace/pr142-target/debug/deps/column_surface_contract-0196b1664ecf22a0": { + "sha256": "1c77e3ee24114a5388a931af4320e7fd20045466e3f343118c62dbc09a65f315", + "copy": "executables/1c77e3ee24114a5388a931af4320e7fd20045466e3f343118c62dbc09a65f315" + }, + "/workspace/pr142-target/debug/deps/comparison_archive_contract-63025641be4da5b4": { + "sha256": "6ec811d8800f329fc22c4250396ff4c714c82a1342e9db6194570afd4d5980bb", + "copy": "executables/6ec811d8800f329fc22c4250396ff4c714c82a1342e9db6194570afd4d5980bb" + }, + "/workspace/pr142-target/debug/deps/comparison_field_view_contract-e9aa7e50e8c1dc92": { + "sha256": "ecc2d0f0eaaccd3773d977710ebb014f21fcabb791dc4d0c310283c4a76d13ff", + "copy": "executables/ecc2d0f0eaaccd3773d977710ebb014f21fcabb791dc4d0c310283c4a76d13ff" + }, + "/workspace/pr142-target/debug/deps/compressible_contract-1066ac8ba3e72175": { + "sha256": "6bdb99615194b51ec7e6da4b10203c422fdb643273ca93904d0d0150cc3ab1dd", + "copy": "executables/6bdb99615194b51ec7e6da4b10203c422fdb643273ca93904d0d0150cc3ab1dd" + }, + "/workspace/pr142-target/debug/deps/configured_archive_binding_contract-003c9c20f49140e2": { + "sha256": "11b660cac276b1e0eedc8ee8ea13c26bab12ca30248cb6d970d01284aa916faf", + "copy": "executables/11b660cac276b1e0eedc8ee8ea13c26bab12ca30248cb6d970d01284aa916faf" + }, + "/workspace/pr142-target/debug/deps/configured_provider_session_contract-18899f217e5c3858": { + "sha256": "3730e6f9ee8fb9dbbb4cb96186276c83dbc8c9be5c5ae78a783ba35f5bc02d8e", + "copy": "executables/3730e6f9ee8fb9dbbb4cb96186276c83dbc8c9be5c5ae78a783ba35f5bc02d8e" + }, + "/workspace/pr142-target/debug/deps/configured_recording_comparison_contract-2d1fb379bfdabde6": { + "sha256": "992531c834018a6a083a725ffd60850ccd873f7eb1ceb6b41773ebcc037ba313", + "copy": "executables/992531c834018a6a083a725ffd60850ccd873f7eb1ceb6b41773ebcc037ba313" + }, + "/workspace/pr142-target/debug/deps/configured_run_sets_contract-5a1b5ff3ad182c28": { + "sha256": "a31c689409bdfafee2cad34b70033594af25e6eb5f744ef2c1dade2cb02eb9b8", + "copy": "executables/a31c689409bdfafee2cad34b70033594af25e6eb5f744ef2c1dade2cb02eb9b8" + }, + "/workspace/pr142-target/debug/deps/coupled_discrete_contract-fa7ee8a677dab683": { + "sha256": "7f4ce297640847a077c6a067a364b848df7681e8dbbdf7513eb33cb647d56f72", + "copy": "executables/7f4ce297640847a077c6a067a364b848df7681e8dbbdf7513eb33cb647d56f72" + }, + "/workspace/pr142-target/debug/deps/dense3d_controls_contract-b1195965fbabae5f": { + "sha256": "76fa3d0f399f91eb97d8772777083fd3780cbfa575a8ec42a574b2a70874e31a", + "copy": "executables/76fa3d0f399f91eb97d8772777083fd3780cbfa575a8ec42a574b2a70874e31a" + }, + "/workspace/pr142-target/debug/deps/dense3d_sequence_contract-4fa21e98735a20f5": { + "sha256": "9a82ab433ddbf666d27155fe0e75bed1fd9b2902de0974914860e3e78a49b97f", + "copy": "executables/9a82ab433ddbf666d27155fe0e75bed1fd9b2902de0974914860e3e78a49b97f" + }, + "/workspace/pr142-target/debug/deps/diagnostic_pressure_oracle_contract-d9465ea528c65591": { + "sha256": "e0d83230607f6f9c9a236356c31f35456c8c9d6160c3fbc585353d93835b769b", + "copy": "executables/e0d83230607f6f9c9a236356c31f35456c8c9d6160c3fbc585353d93835b769b" + }, + "/workspace/pr142-target/debug/deps/diagnostic_recording_contract-5665fa786e5463aa": { + "sha256": "85ccca0c9ae01c7829b2e3bfa74f401e1377c7b2504c1cfcb6281bb6add98e9f", + "copy": "executables/85ccca0c9ae01c7829b2e3bfa74f401e1377c7b2504c1cfcb6281bb6add98e9f" + }, + "/workspace/pr142-target/debug/deps/emitter_contract-859cb68d6fbb8f53": { + "sha256": "ced10faa8962333699ef33ad05344c2e857d345067ce8e6267d566917924c5ce", + "copy": "executables/ced10faa8962333699ef33ad05344c2e857d345067ce8e6267d566917924c5ce" + }, + "/workspace/pr142-target/debug/deps/emitter_controls_contract-17e8befd598e79ca": { + "sha256": "bb0ae05831585679b79a0c32fdc05b537984a8acddfdc02d38c01f7066d15fb5", + "copy": "executables/bb0ae05831585679b79a0c32fdc05b537984a8acddfdc02d38c01f7066d15fb5" + }, + "/workspace/pr142-target/debug/deps/export_contract-50b6acf30fc728e2": { + "sha256": "9a63b12c6dc1abaa4ecf5fdadd71a5f0ec370a89de6bb8f37113cabf140ed89d", + "copy": "executables/9a63b12c6dc1abaa4ecf5fdadd71a5f0ec370a89de6bb8f37113cabf140ed89d" + }, + "/workspace/pr142-target/debug/deps/extruded_third_contract-190afb9032589478": { + "sha256": "0b8f36d994078eca8c8c05e865e466c37952533ae3cbe9248c5d474e173dbc5f", + "copy": "executables/0b8f36d994078eca8c8c05e865e466c37952533ae3cbe9248c5d474e173dbc5f" + }, + "/workspace/pr142-target/debug/deps/fitted_height_contract-3395dd7c29377770": { + "sha256": "7af1950bb701df1e65909266fd84a0f8e6b5591681a091561c4b91a29f3802ee", + "copy": "executables/7af1950bb701df1e65909266fd84a0f8e6b5591681a091561c4b91a29f3802ee" + }, + "/workspace/pr142-target/debug/deps/fixed_bottom_ale_contract-04ca68e51e529e3c": { + "sha256": "1198863bd58c4f251528ed5afbcddb61ef60f26103dc8ea86b610b9c22247b9c", + "copy": "executables/1198863bd58c4f251528ed5afbcddb61ef60f26103dc8ea86b610b9c22247b9c" + }, + "/workspace/pr142-target/debug/deps/force_field_contract-190ce99d572846d9": { + "sha256": "da65bd6bc1dfc77ddb5a64f54af5de3c9d52c052c273274a516b627afe91b152", + "copy": "executables/da65bd6bc1dfc77ddb5a64f54af5de3c9d52c052c273274a516b627afe91b152" + }, + "/workspace/pr142-target/debug/deps/force_field_solver_contract-9a3f6582ecb09136": { + "sha256": "c12b75f9f552825da8d6f2441aa2b3fedf33b254a3da1d25d74406cf2d320cc1", + "copy": "executables/c12b75f9f552825da8d6f2441aa2b3fedf33b254a3da1d25d74406cf2d320cc1" + }, + "/workspace/pr142-target/debug/deps/force_recording_integration_contract-ce7fba7c06671439": { + "sha256": "85a2a21c3cfc1ce7f5508f7ddecc63f5551469f1b6b0c73d102e258b20ec25a8", + "copy": "executables/85a2a21c3cfc1ce7f5508f7ddecc63f5551469f1b6b0c73d102e258b20ec25a8" + }, + "/workspace/pr142-target/debug/deps/forces_contract-927cfd25a7793dbd": { + "sha256": "9f26be8199f70979e48754ced6b04ef5e7e8e208df741e7058d98f08f051a4a8", + "copy": "executables/9f26be8199f70979e48754ced6b04ef5e7e8e208df741e7058d98f08f051a4a8" + }, + "/workspace/pr142-target/debug/deps/free_surface_contract-bd1010cdfd8a039e": { + "sha256": "6fe7d8422f2a4b1450ecf48216b7103a7bdf1f750daeb7d597a401065e676bf6", + "copy": "executables/6fe7d8422f2a4b1450ecf48216b7103a7bdf1f750daeb7d597a401065e676bf6" + }, + "/workspace/pr142-target/debug/deps/geometry_contract-ac55959565d3855d": { + "sha256": "541d99bca413ae845f9ddd85b970cc4d0a9b0757307c88b454ca89adf27fdd4a", + "copy": "executables/541d99bca413ae845f9ddd85b970cc4d0a9b0757307c88b454ca89adf27fdd4a" + }, + "/workspace/pr142-target/debug/deps/grid_geometry_reference_contract-5b1e3677fa98ca71": { + "sha256": "5f084174e86510fec938cdae7de65513354cb255982f38cddb65e5684d05ec1e", + "copy": "executables/5f084174e86510fec938cdae7de65513354cb255982f38cddb65e5684d05ec1e" + }, + "/workspace/pr142-target/debug/deps/grid_verification_contract-44473168da6fd6e8": { + "sha256": "e619290dd8d1abf22d1d99cd7c03563d5d86cd029cd5ced058958bfaa8cc06ca", + "copy": "executables/e619290dd8d1abf22d1d99cd7c03563d5d86cd029cd5ced058958bfaa8cc06ca" + }, + "/workspace/pr142-target/debug/deps/implementation_contract-159dde3c77ef3d18": { + "sha256": "a52950a500ba52c07875bb5f2714a3945cfe0736c5a305315b2ec4691e5e43bb", + "copy": "executables/a52950a500ba52c07875bb5f2714a3945cfe0736c5a305315b2ec4691e5e43bb" + }, + "/workspace/pr142-target/debug/deps/liquid_scale_division_contract-98c5e64105d264f5": { + "sha256": "af106b0623471181e08be7d7524e211a4eb5fe9eab94152d01969a01fff387cd", + "copy": "executables/af106b0623471181e08be7d7524e211a4eb5fe9eab94152d01969a01fff387cd" + }, + "/workspace/pr142-target/debug/deps/liquid_step_contract-6eb8dc91fc406d9f": { + "sha256": "455627237f504bcf7e756bea9827d540ddfa480642ad707fda93e0c254d44d3e", + "copy": "executables/455627237f504bcf7e756bea9827d540ddfa480642ad707fda93e0c254d44d3e" + }, + "/workspace/pr142-target/debug/deps/liquid_volume_contract-feec3ae32dcbefe5": { + "sha256": "d78558e8e9e84bd03f50958f0a80c529ea4bf56ff127ebeac95d23dc377f25b2", + "copy": "executables/d78558e8e9e84bd03f50958f0a80c529ea4bf56ff127ebeac95d23dc377f25b2" + }, + "/workspace/pr142-target/debug/deps/liquid_volume_periodic_contract-09940e33b41d83b5": { + "sha256": "1aaeaba074767941acdc667f8bdc112c6614c72bda48520492685ed824578752", + "copy": "executables/1aaeaba074767941acdc667f8bdc112c6614c72bda48520492685ed824578752" + }, + "/workspace/pr142-target/debug/deps/material_contract-a29dbb9fafe18d20": { + "sha256": "f2911738e1eb1f77ec084e7bb7511d1e902e378de57aad895db11bd3160f8eed", + "copy": "executables/f2911738e1eb1f77ec084e7bb7511d1e902e378de57aad895db11bd3160f8eed" + }, + "/workspace/pr142-target/debug/deps/material_partition_gate_contract-5b05e68a6490cc04": { + "sha256": "47884ec7684ca4e9281bd732c17da3231900d1880e230eeed04227e204b9d9f0", + "copy": "executables/47884ec7684ca4e9281bd732c17da3231900d1880e230eeed04227e204b9d9f0" + }, + "/workspace/pr142-target/debug/deps/material_reference_contract-45bc050785eb50d1": { + "sha256": "bfd9a3518a804a1bc90b5a99818e567eb4e970160e74d6fd874e4769f32edee4", + "copy": "executables/bfd9a3518a804a1bc90b5a99818e567eb4e970160e74d6fd874e4769f32edee4" + }, + "/workspace/pr142-target/debug/deps/material_session_contract-1af3fc16e5bf506b": { + "sha256": "2516e8ba5590baafa0fc56c198d14af9e59488a3c8dc41d1b72dc72cb3a1129a", + "copy": "executables/2516e8ba5590baafa0fc56c198d14af9e59488a3c8dc41d1b72dc72cb3a1129a" + }, + "/workspace/pr142-target/debug/deps/mesh_collision_contract-efa0536b96061ac3": { + "sha256": "243f7b9cf625a2dd11423e8dced82e0e71ea0b81c8f43e7bc0f63468d31680ce", + "copy": "executables/243f7b9cf625a2dd11423e8dced82e0e71ea0b81c8f43e7bc0f63468d31680ce" + }, + "/workspace/pr142-target/debug/deps/mesh_import_contract-7ee419f0083369dc": { + "sha256": "0a89caea3e6673595b0ce2a2820c3cd930bd47f22f66153b96e05e9a192d0bd0", + "copy": "executables/0a89caea3e6673595b0ce2a2820c3cd930bd47f22f66153b96e05e9a192d0bd0" + }, + "/workspace/pr142-target/debug/deps/native_comparison_oracle_range_contract-f57e65b84d9d1c5f": { + "sha256": "deee2bc9ba82d112773ec84234cba5059ad53d2e6e9a86f2b4439b591eadda27", + "copy": "executables/deee2bc9ba82d112773ec84234cba5059ad53d2e6e9a86f2b4439b591eadda27" + }, + "/workspace/pr142-target/debug/deps/observation_contract-c88b43f9bc90cbf3": { + "sha256": "7e97cafcf0eada322c01d64b78143d4015b2804e7fd93a33cead2a6db58c6122", + "copy": "executables/7e97cafcf0eada322c01d64b78143d4015b2804e7fd93a33cead2a6db58c6122" + }, + "/workspace/pr142-target/debug/deps/operator_contract-804bcafd953b151d": { + "sha256": "edaaa9de98b2860cea5a763ca59852f84631f2aa165fb1008531b9a540de6564", + "copy": "executables/edaaa9de98b2860cea5a763ca59852f84631f2aa165fb1008531b9a540de6564" + }, + "/workspace/pr142-target/debug/deps/parallel_contract-d4bcb4a3d54d62b7": { + "sha256": "f7554e4b3c346a8711b529631719680fe46d32baae16467f64cdaa5e0288123f", + "copy": "executables/f7554e4b3c346a8711b529631719680fe46d32baae16467f64cdaa5e0288123f" + }, + "/workspace/pr142-target/debug/deps/particle_adjoint_selection_contract-65f199956ab3447c": { + "sha256": "80e8d6b0bea227613ae6bea5241b64a44118fad997b3a3038d9648ea23e9e121", + "copy": "executables/80e8d6b0bea227613ae6bea5241b64a44118fad997b3a3038d9648ea23e9e121" + }, + "/workspace/pr142-target/debug/deps/particle_inspection_contract-4397d995a49ce118": { + "sha256": "c04fef7a4d8d57557359252d92ded7140f5f46b9eabc739a56941ef16471e207", + "copy": "executables/c04fef7a4d8d57557359252d92ded7140f5f46b9eabc739a56941ef16471e207" + }, + "/workspace/pr142-target/debug/deps/particle_planar_selection_contract-a6b94df5efe6cb5f": { + "sha256": "387d1012d789eb157357d38ac4dd10be6a3dc0183eb8ece2741ec18f05857386", + "copy": "executables/387d1012d789eb157357d38ac4dd10be6a3dc0183eb8ece2741ec18f05857386" + }, + "/workspace/pr142-target/debug/deps/plate_coupling_contract-6d6aeac220eb9f9e": { + "sha256": "458aa73b18f515ba83a1aa6f88baeee5d0a9df9da5539106d44471a14ccf0102", + "copy": "executables/458aa73b18f515ba83a1aa6f88baeee5d0a9df9da5539106d44471a14ccf0102" + }, + "/workspace/pr142-target/debug/deps/pressure_context_contract-16b38728e40c4f31": { + "sha256": "a60ecc90b424e252dc88a2c8335670c5b148e354866cca2f0f16322761f26a18", + "copy": "executables/a60ecc90b424e252dc88a2c8335670c5b148e354866cca2f0f16322761f26a18" + }, + "/workspace/pr142-target/debug/deps/pressure_contract-5d5dc70a4ca1eebf": { + "sha256": "49822b3df5760f096e78f9d7df9cc7cc7131c8b4448d781a5db87b86e6fd728c", + "copy": "executables/49822b3df5760f096e78f9d7df9cc7cc7131c8b4448d781a5db87b86e6fd728c" + }, + "/workspace/pr142-target/debug/deps/pressure_session_contract-e18df0f878334b98": { + "sha256": "6023047c40d17fecd9c3c5ee1819e81148296f2562a525bc2b29f271a78d5256", + "copy": "executables/6023047c40d17fecd9c3c5ee1819e81148296f2562a525bc2b29f271a78d5256" + }, + "/workspace/pr142-target/debug/deps/projection_session_contract-99cd44f78c569f0c": { + "sha256": "c7a7cd6bd8da1d909117a739e831062e66f8381c8a0c162f0c54c348921b3298", + "copy": "executables/c7a7cd6bd8da1d909117a739e831062e66f8381c8a0c162f0c54c348921b3298" + }, + "/workspace/pr142-target/debug/deps/provider_step_contract-952a7149c0ec5a53": { + "sha256": "5517c1e085680762e216eb5730665edc3b2221e4791cde4dd56dd603e3d9181f", + "copy": "executables/5517c1e085680762e216eb5730665edc3b2221e4791cde4dd56dd603e3d9181f" + }, + "/workspace/pr142-target/debug/deps/recording_carrier_contract-197b2007deaf3829": { + "sha256": "2734eafa6a5805837bf96fb55f39a58c10276818355325cad0d6d7fd885e9735", + "copy": "executables/2734eafa6a5805837bf96fb55f39a58c10276818355325cad0d6d7fd885e9735" + }, + "/workspace/pr142-target/debug/deps/recording_comparison_contract-205af27e4f04bdad": { + "sha256": "bbdeb07a2b4612e2e236d359caa0a0efe91fc020be22a7b51f24d6edb2cd3422", + "copy": "executables/bbdeb07a2b4612e2e236d359caa0a0efe91fc020be22a7b51f24d6edb2cd3422" + }, + "/workspace/pr142-target/debug/deps/recording_contract-db2765a72a4388d0": { + "sha256": "8d471d547c7417a820528e1d8add03f84ce0aad53763bd29d61402cd20f3a2cf", + "copy": "executables/8d471d547c7417a820528e1d8add03f84ce0aad53763bd29d61402cd20f3a2cf" + }, + "/workspace/pr142-target/debug/deps/recording_provider_contract-4563aa0dbc51be38": { + "sha256": "59bdebb074fbdff651a10040ddcf094f41c80c5cce161b0a24ca3eb4ab0d7f0b", + "copy": "executables/59bdebb074fbdff651a10040ddcf094f41c80c5cce161b0a24ca3eb4ab0d7f0b" + }, + "/workspace/pr142-target/debug/deps/recording_provider_runtime_contract-5507579fbf15a50a": { + "sha256": "ee4a2344251a72ffc7a77bca31290bc08823b833c5d654c240a21461a6c3b2b0", + "copy": "executables/ee4a2344251a72ffc7a77bca31290bc08823b833c5d654c240a21461a6c3b2b0" + }, + "/workspace/pr142-target/debug/deps/sampling_contract-ce0c1647787d9784": { + "sha256": "8ae4438acc7e4b6019bfb20d9b177679b3b0a6a7d137039d7a5b4e2913c4dadb", + "copy": "executables/8ae4438acc7e4b6019bfb20d9b177679b3b0a6a7d137039d7a5b4e2913c4dadb" + }, + "/workspace/pr142-target/debug/deps/saved_comparison_ui_contract-15724ea8dfa3381c": { + "sha256": "73788ee2e04d8283583dfb730b2ee68578c53a397688fdf942c11f2237d6895c", + "copy": "executables/73788ee2e04d8283583dfb730b2ee68578c53a397688fdf942c11f2237d6895c" + }, + "/workspace/pr142-target/debug/deps/saved_run_set_contract-d5114b9ac01fac33": { + "sha256": "fafb4fe8d5040e4bcf2d714f919c7dc111b002d6d98d942fb8dd637a047d4678", + "copy": "executables/fafb4fe8d5040e4bcf2d714f919c7dc111b002d6d98d942fb8dd637a047d4678" + }, + "/workspace/pr142-target/debug/deps/saved_source_contract-0b7b4778c321fb9f": { + "sha256": "b3fbd16a09afb044330f2d56552f83d5bcc18f6b7a1fe39fb675e74fde0462ed", + "copy": "executables/b3fbd16a09afb044330f2d56552f83d5bcc18f6b7a1fe39fb675e74fde0462ed" + }, + "/workspace/pr142-target/debug/deps/session_configuration_contract-607f630e12ac72d4": { + "sha256": "a00f9c38f8d15774319f5ad2e3617502cbd6eae55335d41ec51021989eb45a41", + "copy": "executables/a00f9c38f8d15774319f5ad2e3617502cbd6eae55335d41ec51021989eb45a41" + }, + "/workspace/pr142-target/debug/deps/session_contract-fc1728b384fc008c": { + "sha256": "1c9f68041eabe637f377522ce240e595bdcb98c27db99c288d800c92974081d3", + "copy": "executables/1c9f68041eabe637f377522ce240e595bdcb98c27db99c288d800c92974081d3" + }, + "/workspace/pr142-target/debug/deps/session_interval_start_contract-c309b696c6e43ab8": { + "sha256": "a17342ed03f73ad3576f7ab7fbf48df97e5cca9f0c4bb925a46f280b0902c9d4", + "copy": "executables/a17342ed03f73ad3576f7ab7fbf48df97e5cca9f0c4bb925a46f280b0902c9d4" + }, + "/workspace/pr142-target/debug/deps/simulation_contract-0dee4609e99770c0": { + "sha256": "d06841e99fb92ebdc014ad4f50c4e4c777228b26cad203eb4159b74fd31e44a9", + "copy": "executables/d06841e99fb92ebdc014ad4f50c4e4c777228b26cad203eb4159b74fd31e44a9" + }, + "/workspace/pr142-target/debug/deps/solver_provider_contract-c6be55ff3e264ba9": { + "sha256": "0090dfb625c0994c6ab628120233ad3fb5610463ba5d086de593d780e22a4d41", + "copy": "executables/0090dfb625c0994c6ab628120233ad3fb5610463ba5d086de593d780e22a4d41" + }, + "/workspace/pr142-target/debug/deps/submarine_stokes_contract-50fa56204aa12c28": { + "sha256": "7e65ad6ae3e08ee8d60e32e0cc841817e6a231273bc7df970595b8bca5fcafde", + "copy": "executables/7e65ad6ae3e08ee8d60e32e0cc841817e6a231273bc7df970595b8bca5fcafde" + }, + "/workspace/pr142-target/debug/deps/tracer_barrier_contract-aeaa8e5cbd326c7b": { + "sha256": "bb0969d433610bc4e79463cb13cf3f8b412e76fea0e404e91afef0f68b8f9542", + "copy": "executables/bb0969d433610bc4e79463cb13cf3f8b412e76fea0e404e91afef0f68b8f9542" + }, + "/workspace/pr142-target/debug/deps/translated_viscous_contract-22f2c072fbf0c9f7": { + "sha256": "1db254cd354b089299fb6ee11ed0136e6a454593a6216010d6841430c3e0f54f", + "copy": "executables/1db254cd354b089299fb6ee11ed0136e6a454593a6216010d6841430c3e0f54f" + }, + "/workspace/pr142-target/debug/deps/translation_contract-10674b5b5a365e4b": { + "sha256": "c24a88d394807f0ffff71478f74570f8a33f2cedc4170c0fe865e862247e6377", + "copy": "executables/c24a88d394807f0ffff71478f74570f8a33f2cedc4170c0fe865e862247e6377" + }, + "/workspace/pr142-target/debug/deps/viscosity_contract-d5e4414d193ad90f": { + "sha256": "c49e5a9eefebd30d11be76de8522c72da2802cf1034b31eeae9036cd842f1245", + "copy": "executables/c49e5a9eefebd30d11be76de8522c72da2802cf1034b31eeae9036cd842f1245" + }, + "/workspace/pr142-target/debug/deps/vtk_export_contract-c318da565b31f99e": { + "sha256": "39f123fd8f4e5716113512505219387e6e91b59082abe659cf6fef99faf42b57", + "copy": "executables/39f123fd8f4e5716113512505219387e6e91b59082abe659cf6fef99faf42b57" + }, + "/workspace/pr142-target/debug/deps/rheon-c32021bc9423029f": { + "sha256": "05a1fd8b109b7d955754c2b1e2cb88eff95e3490c8607dd1ba369724f65f3937", + "copy": "executables/05a1fd8b109b7d955754c2b1e2cb88eff95e3490c8607dd1ba369724f65f3937" + }, + "/workspace/pr142-target/debug/deps/rheon-ba50f8a2510f9017": { + "sha256": "020af57a0fed79064e89bff5c932ef5870d6564a905003c4fa9cef218a00715f", + "copy": "executables/020af57a0fed79064e89bff5c932ef5870d6564a905003c4fa9cef218a00715f" + }, + "/workspace/pr142-target/debug/deps/advection_contract-d6fac3fced6ec12f": { + "sha256": "9f387ef91a1df61d054ca9afafcfa6df2ce1ca8df863ac180e83137d785f8bab", + "copy": "executables/9f387ef91a1df61d054ca9afafcfa6df2ce1ca8df863ac180e83137d785f8bab" + }, + "/workspace/pr142-target/debug/deps/aligned_stokes_contract-60eeee5aa03e98d8": { + "sha256": "cfc68f63a9dc7f3e0535167257d83dffa09a5087d3b9717d29567eab35dccd64", + "copy": "executables/cfc68f63a9dc7f3e0535167257d83dffa09a5087d3b9717d29567eab35dccd64" + }, + "/workspace/pr142-target/debug/deps/aligned_strain_contract-9456eb792669cd3f": { + "sha256": "ccb25a553195c13628b943c13d3548fe55787af25efc1f38f6ffa1abc2cbbeac", + "copy": "executables/ccb25a553195c13628b943c13d3548fe55787af25efc1f38f6ffa1abc2cbbeac" + }, + "/workspace/pr142-target/debug/deps/box_flux_contract-18b9b1852c27140a": { + "sha256": "d09f6c40113571f9f37b26afbefa502c9e45fd232d65742d0e0d1c42c988c53a", + "copy": "executables/d09f6c40113571f9f37b26afbefa502c9e45fd232d65742d0e0d1c42c988c53a" + }, + "/workspace/pr142-target/debug/deps/box_flux_step_contract-10e6e26c0069cb70": { + "sha256": "c6ac223b6dcadbc04b4f37ed218e8d5fd9774c96decbd2ad6ab39d3a7edf70fe", + "copy": "executables/c6ac223b6dcadbc04b4f37ed218e8d5fd9774c96decbd2ad6ab39d3a7edf70fe" + }, + "/workspace/pr142-target/debug/deps/cli_contract-3b0cfc6d3aa781f7": { + "sha256": "94c312687aedd4b574ee1cea6ff359ff0c8d274b8087b71e4664a15bda2a8482", + "copy": "executables/94c312687aedd4b574ee1cea6ff359ff0c8d274b8087b71e4664a15bda2a8482" + }, + "/workspace/pr142-target/debug/deps/collision_contract-2964bb509ec0a61a": { + "sha256": "fcd65a0fe57256f3707513fd4855fbd1ea33b10bf28adcc4321b56163de7e7a5", + "copy": "executables/fcd65a0fe57256f3707513fd4855fbd1ea33b10bf28adcc4321b56163de7e7a5" + }, + "/workspace/pr142-target/debug/deps/column_mac_contract-0e0d24627cdbbde5": { + "sha256": "32ef98bfeb427cadcc87b94fdfa892a0b55a7290ae4ca63a5d9398e571ec5305", + "copy": "executables/32ef98bfeb427cadcc87b94fdfa892a0b55a7290ae4ca63a5d9398e571ec5305" + }, + "/workspace/pr142-target/debug/deps/column_momentum_contract-91800bc8a9d235be": { + "sha256": "a157607b7ac427e472be8e41720e2d201880494cc4a8df3beb6e26d82ff0e75c", + "copy": "executables/a157607b7ac427e472be8e41720e2d201880494cc4a8df3beb6e26d82ff0e75c" + }, + "/workspace/pr142-target/debug/deps/column_shear_contract-e7f877060cf9e0fd": { + "sha256": "303ee0f85888d43a19e7c6cc14f740f771bafd4144801b59acfbfbc597ee68fb", + "copy": "executables/303ee0f85888d43a19e7c6cc14f740f771bafd4144801b59acfbfbc597ee68fb" + }, + "/workspace/pr142-target/debug/deps/column_surface_contract-792e590edc873054": { + "sha256": "1b03d8f7112140816992aed2089feaae07e8151b715d3fa91a3f5e3492f89dc5", + "copy": "executables/1b03d8f7112140816992aed2089feaae07e8151b715d3fa91a3f5e3492f89dc5" + }, + "/workspace/pr142-target/debug/deps/comparison_archive_contract-aa89d2ab909c98d4": { + "sha256": "ae4cc4d7d0a9265660b4901e67e22b87ac9c0c1ff05c0280067f0281b2caa67c", + "copy": "executables/ae4cc4d7d0a9265660b4901e67e22b87ac9c0c1ff05c0280067f0281b2caa67c" + }, + "/workspace/pr142-target/debug/deps/comparison_field_view_contract-5de97e4e543ec59e": { + "sha256": "c302f6eeb8051d3cd699e34f92bdd88c8796c7c06ee65d16e012792161d86351", + "copy": "executables/c302f6eeb8051d3cd699e34f92bdd88c8796c7c06ee65d16e012792161d86351" + }, + "/workspace/pr142-target/debug/deps/compressible_contract-c69bb651620ab613": { + "sha256": "8b621c23bc307be9fdeaee9fc0f141f9190bb51879e316fd915240791c3f7b1e", + "copy": "executables/8b621c23bc307be9fdeaee9fc0f141f9190bb51879e316fd915240791c3f7b1e" + }, + "/workspace/pr142-target/debug/deps/configured_archive_binding_contract-7c81303a06f39092": { + "sha256": "79ebc295361edf431c76fb15727b365ba7ca97df07395bbf4cc1f960d1b66e65", + "copy": "executables/79ebc295361edf431c76fb15727b365ba7ca97df07395bbf4cc1f960d1b66e65" + }, + "/workspace/pr142-target/debug/deps/configured_provider_session_contract-c3b416ade47dae74": { + "sha256": "a53f78879e1a323437b8d3bf15fea9d27bdd6bfa0f2b661863b5aadf7ef71777", + "copy": "executables/a53f78879e1a323437b8d3bf15fea9d27bdd6bfa0f2b661863b5aadf7ef71777" + }, + "/workspace/pr142-target/debug/deps/configured_recording_comparison_contract-27ec83531080bcb0": { + "sha256": "4839797d0160511fad5e563c367097e041c6ff4e615946841c746d9abd244bb8", + "copy": "executables/4839797d0160511fad5e563c367097e041c6ff4e615946841c746d9abd244bb8" + }, + "/workspace/pr142-target/debug/deps/configured_run_sets_contract-8d13f07cc06ca586": { + "sha256": "29ec150a583aba2b6f099ad65750711f5d89c6caa0e660cb9aab49aadbb5fc98", + "copy": "executables/29ec150a583aba2b6f099ad65750711f5d89c6caa0e660cb9aab49aadbb5fc98" + }, + "/workspace/pr142-target/debug/deps/coupled_discrete_contract-08eef77698f3c9ef": { + "sha256": "7478a2679b1347270cb09bd0b56b4d135e73e7eae30b9a7dc5dde4bc1b5d9320", + "copy": "executables/7478a2679b1347270cb09bd0b56b4d135e73e7eae30b9a7dc5dde4bc1b5d9320" + }, + "/workspace/pr142-target/debug/deps/dense3d_controls_contract-53d97ad4240ac8f3": { + "sha256": "41c2324ae4168699e029d24d96f7c2330e0c24dff0a90888a4b5c5a0aa317d45", + "copy": "executables/41c2324ae4168699e029d24d96f7c2330e0c24dff0a90888a4b5c5a0aa317d45" + }, + "/workspace/pr142-target/debug/deps/dense3d_sequence_contract-dc55213f5c42af3b": { + "sha256": "fa853ad4e8a19dfa3435309c6e2ffd1508c679214989ed1751b884e0c5c0e491", + "copy": "executables/fa853ad4e8a19dfa3435309c6e2ffd1508c679214989ed1751b884e0c5c0e491" + }, + "/workspace/pr142-target/debug/deps/diagnostic_pressure_oracle_contract-88fa7caf52dd0dca": { + "sha256": "33f06291862168627d4e483d9fcdb210005989e5effe8d6badece24206c1037f", + "copy": "executables/33f06291862168627d4e483d9fcdb210005989e5effe8d6badece24206c1037f" + }, + "/workspace/pr142-target/debug/deps/diagnostic_recording_contract-c52864a677654ce1": { + "sha256": "c281cc62b4185da796572bc9f63bc85e3ad7bba8a9fdc3fce2056d232bba1e53", + "copy": "executables/c281cc62b4185da796572bc9f63bc85e3ad7bba8a9fdc3fce2056d232bba1e53" + }, + "/workspace/pr142-target/debug/deps/emitter_contract-1f5ad0a58d9f146f": { + "sha256": "639b830894e4932a16f98239a4a904b7e7d24143a3cef6360cd87e59ea518c8a", + "copy": "executables/639b830894e4932a16f98239a4a904b7e7d24143a3cef6360cd87e59ea518c8a" + }, + "/workspace/pr142-target/debug/deps/emitter_controls_contract-a8c89f10bb745448": { + "sha256": "063b9fccf5ae33d713d7f9be18912f5e1864e5a2cbf44ad89ca3bff68261a968", + "copy": "executables/063b9fccf5ae33d713d7f9be18912f5e1864e5a2cbf44ad89ca3bff68261a968" + }, + "/workspace/pr142-target/debug/deps/export_contract-82823b31ee2c12d9": { + "sha256": "f3684dde6ff22bc0ea640fcf88e71a096551af73bfc9e2bfd8ca150c3ed1d9aa", + "copy": "executables/f3684dde6ff22bc0ea640fcf88e71a096551af73bfc9e2bfd8ca150c3ed1d9aa" + }, + "/workspace/pr142-target/debug/deps/extruded_third_contract-8524de78faefb11f": { + "sha256": "77136404e28aa1418cdf28fa1893db91b3d5e25843511d33c7e0cba5aa1c486b", + "copy": "executables/77136404e28aa1418cdf28fa1893db91b3d5e25843511d33c7e0cba5aa1c486b" + }, + "/workspace/pr142-target/debug/deps/fitted_height_contract-a04b88faf41ab849": { + "sha256": "9738f05ae69aecb06e4267ee40818c4636f9af5b5047628da09390b2beb1c4c2", + "copy": "executables/9738f05ae69aecb06e4267ee40818c4636f9af5b5047628da09390b2beb1c4c2" + }, + "/workspace/pr142-target/debug/deps/fixed_bottom_ale_contract-db23f1071f50f271": { + "sha256": "1a224f838c5845b3df2d99249bd1ed7c23ff74ae6f55a31aeed174721e7dd7b3", + "copy": "executables/1a224f838c5845b3df2d99249bd1ed7c23ff74ae6f55a31aeed174721e7dd7b3" + }, + "/workspace/pr142-target/debug/deps/force_field_contract-bf4c36b2d21373c5": { + "sha256": "007afbbf8594d9f1ab4e208b41638912756ed35f749deeece24b8853a9d503ab", + "copy": "executables/007afbbf8594d9f1ab4e208b41638912756ed35f749deeece24b8853a9d503ab" + }, + "/workspace/pr142-target/debug/deps/force_field_solver_contract-9012bb5271ac0412": { + "sha256": "82b311fc7fa6f20448e2b9bb10e3c3e27f88a145be9389f003ba97b04eae7e07", + "copy": "executables/82b311fc7fa6f20448e2b9bb10e3c3e27f88a145be9389f003ba97b04eae7e07" + }, + "/workspace/pr142-target/debug/deps/force_recording_integration_contract-99d3cda42108fe99": { + "sha256": "cd479dad1bc35615885b6443aa11338543ff7e8927285ced7bf49b69809096ae", + "copy": "executables/cd479dad1bc35615885b6443aa11338543ff7e8927285ced7bf49b69809096ae" + }, + "/workspace/pr142-target/debug/deps/forces_contract-41a4da84c15ef44e": { + "sha256": "29e9ab2927900d9e6c7dfae1a61dcb1c0ce28a0ea279c4a309cc2393812917de", + "copy": "executables/29e9ab2927900d9e6c7dfae1a61dcb1c0ce28a0ea279c4a309cc2393812917de" + }, + "/workspace/pr142-target/debug/deps/free_surface_contract-bad7fc2c63d960ce": { + "sha256": "679595cbde19ea92ea3aaf88ea931018b166636b93401dc90b0e0b4c91249e74", + "copy": "executables/679595cbde19ea92ea3aaf88ea931018b166636b93401dc90b0e0b4c91249e74" + }, + "/workspace/pr142-target/debug/deps/geometry_contract-e6d90b84eb745d3a": { + "sha256": "f4df9ad6b89af2948344879887b785cd07f1d039a2470142e02a660f032000f7", + "copy": "executables/f4df9ad6b89af2948344879887b785cd07f1d039a2470142e02a660f032000f7" + }, + "/workspace/pr142-target/debug/deps/grid_geometry_reference_contract-c0701f6b5dad6ab8": { + "sha256": "4dd188abd041d330fd69f7f168a8a8f1eb21ba34850e263867cbdbf309727500", + "copy": "executables/4dd188abd041d330fd69f7f168a8a8f1eb21ba34850e263867cbdbf309727500" + }, + "/workspace/pr142-target/debug/deps/grid_verification_contract-0b29ee34a6d47a1d": { + "sha256": "022288243a52c141edea841b0021f11ea67e32607f51e6cb3231ed956c5db733", + "copy": "executables/022288243a52c141edea841b0021f11ea67e32607f51e6cb3231ed956c5db733" + }, + "/workspace/pr142-target/debug/deps/implementation_contract-4e3e0d10c714e1ee": { + "sha256": "276033483d8415ec559a37564790db0c1a4c86eb740b7395d5e491a72686ef80", + "copy": "executables/276033483d8415ec559a37564790db0c1a4c86eb740b7395d5e491a72686ef80" + }, + "/workspace/pr142-target/debug/deps/liquid_scale_division_contract-4da9ce9b5a0b3fbf": { + "sha256": "1896166012fe9450851616907de373d7c6a56ac8d7ca657b3683f539592cc705", + "copy": "executables/1896166012fe9450851616907de373d7c6a56ac8d7ca657b3683f539592cc705" + }, + "/workspace/pr142-target/debug/deps/liquid_step_contract-ecd121162d79b37b": { + "sha256": "47d66dbb1b3774891fd8eb848d5c1fd52c9470ba32ab20a5908f024cbf762664", + "copy": "executables/47d66dbb1b3774891fd8eb848d5c1fd52c9470ba32ab20a5908f024cbf762664" + }, + "/workspace/pr142-target/debug/deps/liquid_volume_contract-ecb59e48e79146be": { + "sha256": "afc494454ef29953093603f8fdc9cf134931c62a4fec5208fc10ea5ae1a964cb", + "copy": "executables/afc494454ef29953093603f8fdc9cf134931c62a4fec5208fc10ea5ae1a964cb" + }, + "/workspace/pr142-target/debug/deps/liquid_volume_periodic_contract-86aa438c97dbb59e": { + "sha256": "9634bbce4da044d2413e60e5d89612bbbb9a6cfc6d449621d3962bd38fd23145", + "copy": "executables/9634bbce4da044d2413e60e5d89612bbbb9a6cfc6d449621d3962bd38fd23145" + }, + "/workspace/pr142-target/debug/deps/material_contract-4052afe5fb62db1a": { + "sha256": "f68eaa10a8bd0525e6b69e2de2973e874b1b8109e85ebe57ca8b8e64062ce38c", + "copy": "executables/f68eaa10a8bd0525e6b69e2de2973e874b1b8109e85ebe57ca8b8e64062ce38c" + } + }, + "original_all_local_attempt": { + "status": "failed", + "commands": [ + { + "name": "admission", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "docs/education/check_native_admission.py" + ], + "started_unix": 1792622316.8165588, + "exit": 0, + "ended_unix": 1792622316.9073787, + "log_sha256": "3a7efec29f6fdbbe8d9a6af302a0edad462605cc61378feaec8fe213cab92f05" + }, + { + "name": "cargo-metadata", + "argv": [ + "cargo", + "metadata", + "--locked", + "--format-version", + "1", + "--no-deps" + ], + "started_unix": 1792622316.923055, + "exit": 0, + "ended_unix": 1792622316.9681857, + "log_sha256": "f86839e7411a9432294a52a1d947b88b61e048ef723e01659e2b5e0de4f5d1e4" + }, + { + "name": "format", + "argv": [ + "cargo", + "fmt", + "--all", + "--check" + ], + "started_unix": 1792622316.981375, + "exit": 0, + "ended_unix": 1792622319.5587597, + "log_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "name": "native-qualification", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "tools/qualify_aligned_strain.py", + "/workspace/pr142-qualification-1/native" + ], + "started_unix": 1792622319.5733843, + "exit": 0, + "ended_unix": 1792622364.777222, + "log_sha256": "5c9c0b18274ffa180b0a16abad8a3681c6843d158eeff1bd6b1a5748f1b50347" + }, + { + "name": "packet-create", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "docs/education/aligned_strain_packet.py", + "--output", + "/workspace/pr142-qualification-1/packet", + "--executable", + "/workspace/pr142-target/debug/examples/aligned_strain", + "--primary-qualification", + "/workspace/pr142-qualification-1/native/qualification.json" + ], + "started_unix": 1792622364.8251894, + "exit": 0, + "ended_unix": 1792622366.5520606, + "log_sha256": "fd127d5f1159ad2e69a5831579fd38a0c63c863c7b3f3a691e59332247f2ba24" + }, + { + "name": "packet-normal", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-m", + "unittest", + "discover", + "-s", + "docs/education", + "-p", + "test_aligned_strain_packet.py", + "-v" + ], + "started_unix": 1792622366.5672493, + "exit": 0, + "ended_unix": 1792622388.2941635, + "log_sha256": "a04e93f3b3e6f20b2fe038de501646ba32563d3c05955c968da1fa09b13867be" + }, + { + "name": "packet-optimized", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-O", + "-m", + "unittest", + "discover", + "-s", + "docs/education", + "-p", + "test_aligned_strain_packet.py", + "-v" + ], + "started_unix": 1792622388.312056, + "exit": 0, + "ended_unix": 1792622407.8542092, + "log_sha256": "03ff512a4b50f585043bd41cdb983acec1987883cb501c9eb142e60039d122fd" + }, + { + "name": "clippy-core-only", + "argv": [ + "cargo", + "clippy", + "--locked", + "--no-default-features", + "--all-targets", + "--", + "-D", + "warnings" + ], + "started_unix": 1792622407.9202242, + "exit": 0, + "ended_unix": 1792622424.79842, + "log_sha256": "c5b5ac830f0e8d8364d1ac2bbe6a0fb3e06d2651cb2ed81fbb7b8ca9e0959f1d" + }, + { + "name": "tests-core-only", + "argv": [ + "cargo", + "test", + "--locked", + "--no-default-features" + ], + "started_unix": 1792622424.8133407, + "exit": 0, + "ended_unix": 1792623517.6481335, + "log_sha256": "54bbe5bccc9eb45509ee215a6a5903ae29ba58bad9474c302f8e2c066feb7107" + }, + { + "name": "clippy-default", + "argv": [ + "cargo", + "clippy", + "--locked", + "--all-targets", + "--", + "-D", + "warnings" + ], + "started_unix": 1792623521.0177546, + "exit": 0, + "ended_unix": 1792623542.5825257, + "log_sha256": "ed237104fbe554eae7194c7df66089072829fbccb08413d72c15eb67272fcca1" + }, + { + "name": "tests-default", + "argv": [ + "cargo", + "test", + "--locked" + ], + "started_unix": 1792623542.5976422, + "exit": 101, + "ended_unix": 1792624061.448225, + "log_sha256": "200ee402e911511b116a198776b3999c5e704f3da30a35530262fe6e3ba73b48" + } + ], + "failure": "tests-default failed; retained /workspace/pr142-qualification-1/tests-default.log" + }, + "library_retention": { + "status": "failed-before-preparation", + "operation": "Create Library item from new sealed local qualification archive", + "target": "rheon-pr142-dbd49d3-qualification.zip", + "reason": "hosted apps tools/list request failed: network", + "exit_code": 1, + "library_id_returned": false, + "retried_or_alternate_route": false, + "raw_archive_retained_locally": true + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/evidence-reconciliation.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/evidence-reconciliation.md new file mode 100644 index 00000000..ce69bd48 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/evidence-reconciliation.md @@ -0,0 +1,48 @@ +# Source-identical evidence reconciliation, 2026-10-21 + +The frozen [original protocol](protocol.md) and external driver remain unchanged. +Their all-local attempt at clean `dbd49d3e41c482a753884abc8aaaff7d1b0d0653` +passed native/rational/packet and the complete core-only suite. While a duplicate +local default suite ran, all three required ordinary hosted feature suites, +strict lints, executable and aggregate gates completed successfully on exactly +the same committed source tree. The completed local core suite took 18.2 minutes; further duplicate local +feature suites add no deciding claim after those matching hosted gates. + +The independent source/execution reviewer approved a sufficient composite recipe: +retain local native/rational/packet/fullcore evidence and actual source-identical +hosted core/default/desktop/executable/aggregate evidence. No command, assertion, +ignore, numerical bound, scientific campaign or required gate is changed. This +is an explicit replan based on completed evidence, not a successful relabelling +of an incomplete all-local run. The original protocol is historical and frozen. + +On 2026-10-21 at 23:07:41 UTC, the lead sent SIGINT through a PID file descriptor +to the exact owned duplicate local `material_contract` process. Its parent Cargo +returned 101; the original journal remains `failed`, with raw signal2/traceback +and partial logs retained. Driver, Cargo and test PIDs were confirmed absent +before any source/report mutation. This attempt is **intentionally cancelled**, +not all-local passed. The remaining local desktop suite did not start. No +partial test counts are substituted for required complete hosted suites. + +Hosted workflow 39688034222 attempt 1 reports source head `dbd49d3` and SUCCESS. +Raw job logs show actual checkout `d5ef6e22322183f34be437a1e9427a2b7d53d9d2`, +whose Git tree is exactly `2f37db7c119b846003f5a01a82d46c4cf965b474`, equal +to the reviewed local execution tree; parents are main15026a9 plus dbd49d3. +All three full Clippy/test steps and the aggregate succeeded. Local/hosted +results are kept separate in [the summary](qualification.json). Desktop counts +exclude four nested child-test summaries; ignores remain unexecuted. + +The separately reviewed CI follow-up increases only the ordinary feature-job +outer scheduling budget 30→60 minutes. Historical PR143 desktop job 119483887509 +ran 21:07:18–21:37:33 and was cancelled at the prior 30-minute budget after lints +and progressing ordinary tests; its failure/cancellation remains preserved. +No per-case, solver, scientific, timeout assertion, matrix, command or aggregate +is changed. PR142's existing hosted feature jobs actually passed within 30 minutes; +the adjustment addresses the evidenced larger downstream composition. It does +not guarantee 60 minutes suffices or make a performance claim. + +The follow-up changes only workflow scheduling and authored reports/status; +selected152 runtime/build/qualifier inputs and frozen v3 admission stay exact. +Receipts remain bound to actual dbd49d3, never to a later reporting head. Final +new-head hosted checks, independent result review, normal expected-head merge +and post-merge verification remain required. No whole-application production, +GUI-window, physical/model/GPU/performance/release acceptance follows. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/frozen-native-receipt.json b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/frozen-native-receipt.json new file mode 100644 index 00000000..1f10f57c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/frozen-native-receipt.json @@ -0,0 +1,2238 @@ +{ + "schema": "rheon-reconstructed-aligned-strain-qualification-v1", + "base": "b61ae293224ff8262e99984a1b8fa8b2135b8c83", + "source_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "source_tree": "2f37db7c119b846003f5a01a82d46c4cf965b474", + "clean": true, + "source_sha256": { + ".coderabbit.config.ts": "f36f2813d414825dd24ab5776b6fe22399f8048f7a2300c256293f2608db6369", + ".github/workflows/ai-pressure.yml": "0737713fc48cbec872ed25c92dfd1d64ea07ffc88ebfadc413e252a86cc1881d", + ".github/workflows/aligned-stokes.yml": "7e9c0d664668c371660e55379c3caf71a9b92440bc37d8a07872d995f69d7759", + ".github/workflows/aligned-strain.yml": "5f11e95615da0177d4b9712cb10b119279dcc527e7897e797efd2b1e4dc8aa94", + ".github/workflows/cloud-acceptance.yml": "ef1229ecbc176c85c5925f1317f46ccb6d102d355260aad03a6973d48a5b84ab", + ".github/workflows/collision-mesh.yml": "0eb908ef47a88be976c03efd1d9961c2533329c47c99ccca9c0704099b950208", + ".github/workflows/compressible-research.yml": "71b03347aa363aa54d25992f1ec03fa391298174cf26166ab7ed8b73466c00dd", + ".github/workflows/dense3d-controls.yml": "459938030d7949a11cfa9f87a9d6bde23c34eb2cd9372b51892c37b09c020381", + ".github/workflows/lean-rheon.yml": "e79d83b98214aa90edf67271c6e1289845f42799e327abe05fa1514232a8ae6e", + ".github/workflows/plate-coupling.yml": "fcf14a13f5d22e8a7a1210968bfa586562f0a4fe7bf86c4023d7b9f5d89275c4", + ".github/workflows/research-book-pages.yml": "a4ab0fdddbd141d0323db8a2dd800c484c235dd23121028f5b9d14bfe20acc67", + ".github/workflows/research-book-reviewed-pages.yml": "5972edb5be7c4f59cab52503cd5388962437de33f4f061e96337bf32ab82a2f3", + ".github/workflows/research-numerics.yml": "42bff70a9d8122f219517f5e492f263acf2de6976726181056b7e11fb0ebe31e", + ".github/workflows/rust-rheon.yml": "769e89aadb3ed2abbcf2e72a8a722ab0de5165976de0f8f35eca0ad37e63ea76", + ".github/workflows/vtk-interchange.yml": "81c52a043429f8b7bc8262ad7e9a82d448b0deca21826bea848bfb4ddf39dd43", + ".gitignore": "400fafa9dd40470d3ca3871974fb6edc9b9a118069a649b60376ab7e3dded591", + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae", + "LICENSE": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4", + "README.md": "576954cd220feb32da48a0d76444f890e96d77c9a6a024ec0b1b26f82687bf30", + "browser/solver/Cargo.lock": "d77e825663daceafb6bf841a8ea38e98e1cede8e163a892f466c137afdeb7f90", + "browser/solver/Cargo.toml": "c19826dcc69b7e9049cc0ac0ae2ace4cafd4081037a613869a587b4abc113ef6", + "browser/solver/README.md": "15ccd62c1fe3806db9df43dcb708db2cbcbe6bf88bac28f76792ec23bbb93284", + "browser/solver/src/bin/flow-reference.rs": "4be0fde70f7babe84e2b736d0515b3b3ff44df8388e2dc9a0c82c0d99fc131fa", + "browser/solver/src/bin/reference.rs": "4fbcdf17e81882e22895830149cc3db6a607c1e25276ab5025305f5e527c2e65", + "browser/solver/src/flow.rs": "dce9c79650a69a423ad5bec33cc679274c03471c25639f6be9a353dc5804cdb7", + "browser/solver/src/lib.rs": "144dd1ac312c7d83e91f62dbebe1ed83b3f96b2f9a7d50110b7c0577b6bac2b7", + "browser/solver/tests/contract.rs": "e598f0cccb79dfb94b890579f1e652cd2c9e44c5581ce45969a61c4405cd97e9", + "browser/solver/tests/flow_contract.rs": "2b67707339d47360c7fff71de6ede7cba45185759d08499f6b43e5d96062c70c", + "browser/viewer/README.md": "b5c91bb78dcd479ea56644f1ba2790efa1f9f3944a51a2d7f61a4c5ea0344243", + "browser/viewer/package.json": "01fa0054e73160fa08cc0b50806e11c7eacaf8233945b8611689d6784e615932", + "browser/viewer/shell.css": "837248044390fd0fdeed110df45d5762d699d3439c9e1876613ec1f123ef027e", + "browser/viewer/view.js": "f5c5921c86a6ffffc4579fbbceb79857e88809da14868c4e3f9b0e094d0be927", + "docs/COMPARISON.md": "b61d7db93c9497dc55d96579380a66071c68320b3f1109c30a32af2bdcf5c67c", + "docs/MILESTONE.md": "90d56d05439e92404c755bbb24b95b52ebbeb1819a907f84a40135bab5473a82", + "docs/REPOSITORY_OUTPUTS.md": "91992b4a524542414eaa68b5ab20e2576b7d54ce2eb4b9ad7b83d2523a969d77", + "docs/ai-pressure-comparison.md": "1d45deb4685a7adc857a24d199dbd15a9d086226b1da9b8376fbf201e31d433d", + "docs/api/comparison-archive.md": "2a24f43b16865773e184b34b34cfc0c8ba81d14865e13305dbeed7df4b49a801", + "docs/api/comparison-field-view.md": "3e8f47cbb2df13bb4742b6bfd62941982752306c74aead9d89a79d1dc40508fb", + "docs/api/compressible.md": "a4dd299293d2652b1277b1b7b2bebefca61f7b644b2046999be81c8d930f6dde", + "docs/api/configured-desktop-session.md": "6c9d96456f860f6d2b92d1e8396ae43c80d610b271a18ef6a84d57531a7c7aca", + "docs/api/configured-pressure-session.md": "53c212dc3898f2cd61e1fecee74b2549fba199c0174ec987f7481f5bf91147ff", + "docs/api/configured-provider-recording.md": "bed659ef1e03bd8b5121afd589f9bb4e795bfa4afdf8674ef3e97c5edbb76c60", + "docs/api/configured-recording-comparison.md": "97f8b9c66ee1cd42d1ef6ddfe8b685d98283784dd30c446cb8838f20aea711af", + "docs/api/configured-runtime-recording.md": "82b3f67116f13f168dae048a06515e16273c205cae8a27d04ea29d75341f04d3", + "docs/api/configured-saved-comparison.md": "4733d9f56839059ba90ab55330fe9b7089c5a3cfd0aa494991697e62b09e5cf6", + "docs/api/configured-session-intent.md": "0b3debf93ebacca8e45df814fd67694eac52f5bcac95a89c193b392b2e77b71d", + "docs/api/diagnostic-experiments.md": "124cc0cce052326d7419256f65616e49f9b077adbd958591f040d60a25a91f98", + "docs/api/diagnostic-recording.md": "2c9c0980ac0f27dab29158ee3ab3bd1021eb4f4dcf73dc6f480a54058bf84f93", + "docs/api/domain-density.md": "81f0a5baa8fdc38a07356da3309e0ecbcc308cd89caa838f59242c197a31e90d", + "docs/api/full-step-provider.md": "396eae98e99b10a446f891bffc8de7fb8e6c087519aaba624081472734f8f784", + "docs/api/material-session.md": "c979df4783dd661b104685188c4c0b7110147c15031389c1d04edb97632cd6fd", + "docs/api/measured-pressure-bundle-handoff.md": "0547dedfe6eba98369d1ef5fc875c107c24d296b485120b2d09949be778d5e51", + "docs/api/pressure-context.md": "3f220195d7a78959952be489829d6ecf12d47504807c8641d0007f4c8d2cbd1f", + "docs/api/pressure-session.md": "9b6d17b17d3f216bd1e66970557298cf40f0846ef17412ac331ac6a6a716c7ef", + "docs/api/qualified-desktop-build.md": "b157f2acb0d9c0279658cb80e93f1f7b547960c47e385cae42558f2b0169f9aa", + "docs/api/recording-comparison.md": "ec84486507902959bf6355adf005fae02a31e0544a41427f72cbb22ac6506318", + "docs/api/recording.md": "7009c3278c98059055937ca0b067949015799dfb3da72fe4da516b4c6b974056", + "docs/api/saved-run-sets.md": "915b45c9e8730f5d496e2132058b769331fee2df7f34adafb4875c2e3eaa1db9", + "docs/api/simulation-session.md": "aacbb6e7633a421559bbfd0d35ecceda49b6458247e89b69acf9eb1afb72e686", + "docs/api/vtk-interchange.md": "556109db86f7f3cbec365d6c9ecea205c774179baec31a78d8d871ae89a2b48d", + "docs/audits/general-fluid-20261019/manifest.json": "f42c43946f7f489f44938963cdd3e9f0aff30c4cf43c5b952808fcf81eb0d4a8", + "docs/audits/general-fluid-20261019/protocol.md": "8db22e52be198979ec9afdb0b10b00a71d3743660c31f4d3221e2e0adb6802d2", + "docs/audits/general-fluid-20261019/report.md": "b44284f090ed26c952fd655765cbc205dbb474412a6351ce38772f2e3836f1cb", + "docs/audits/paper-20261020/independent-review.md": "d58136a6bc91546f8d5190d3f08b0896cbd18378d9a436224a3bea720e14c3b3", + "docs/audits/paper-20261020/report.md": "a001d97bca0fdccb0f1c5b426c3646e929a1c1f9987d3bbcfb53c60ec4baa026", + "docs/broader-physics-milestone.md": "8276e84bb7dc3b193c668acbfce8bf9b9d516864bf2f1d8964914136f94d932d", + "docs/collision-meshes.md": "77aa3626ac1698e461a02be03c75efe655d2b435170142b2d72136921b82237e", + "docs/education/.gitignore": "cb72839141e8389b4706c95fd4f06eda6c57c473e56c0835c0a4a8282c9ed532", + "docs/education/BROWSER_TIMESTEP.md": "b9565eb58509268f45b0d5c623287f793605c7d4cac3f4f1bf8e5bbaf6a75ab6", + "docs/education/COMPRESSIBLE_INTEGRATION_REVIEW.md": "7035ed6bf52ca5007a97b1ba9ac937d805609cb3ebdbeaca8a19d01f55623dd5", + "docs/education/CONTINUATION.md": "f06916dc6c950fdc2d240ab0c4dcc8f8eca38712eeee7aa643968eafd4cd7e57", + "docs/education/COVERAGE.md": "fc08664507e6ce5b9bd4437f022d546e87c5c7dac7681b5649b995418efa272a", + "docs/education/ENGINEERING_COMPLETION_PLAN.md": "5a85e1b5a2846580ff84d99866751aa9ae30516204072be26e428fc7f4a29ef4", + "docs/education/ENGINEERING_PLAN.md": "77b435569db4ceefffcce768837f5644907b17aa57514fd939248ce1ac6561fe", + "docs/education/INTEGRATION_EVIDENCE.json": "75bfa4f69151f8cafe7a74dcd756806976a2a6c7a553c702725dc9349256a1c3", + "docs/education/NATIVE_ADMISSION_INTEGRATION.md": "e2ff3664f45c5204dc136ed9786567b318f205192451b2048129e78196dabd64", + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "014e19aac55f3fceae1edef9deff8c41337b5c3ca3db655ba07b978b562fb28e", + "docs/education/NATIVE_ADMISSION_RUNTIME_REVIEW.md": "7620b2fad83873ecf4fc3906b0f71a1b6bcc3c789e3ef007a617a2edd7ffccf8", + "docs/education/PRESSURE_GAUGE_PLAN.md": "a3b51dba1b56edef097989d1decc8e591eb01c951bc02755a050e0eb599ba216", + "docs/education/README.md": "f0824c2a4cfadccadca8540b2d4e16d4c43fb18ec773f7dcfb08fb931b71c4c0", + "docs/education/TIME_MODE_MILESTONE.md": "5605c49bceeebd24ed4a0c7daa9dcd65e86816a04365457a3dad717b10672231", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "a1c59a4d17ccdd1af16ff8ceadc08eedad54e92b1de043147057b7da48774a7f", + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned_strain.css": "abd5dbf057dd56613f138065c003f2c84fe8ec58dc86a97895a0ae87d8ea0c34", + "docs/education/aligned_strain.js": "b383400da4be532b0c1c8ca24a46aaf96173d33319feacea030f475403980413", + "docs/education/aligned_strain_browser.py": "101458c3287f2f6ec3d79268696f8e95a2b4c454bff52c74720978a57a54a8e6", + "docs/education/aligned_strain_html.py": "edd680f90841dabcaa3906af4dba0639da9b695ce070d0e8561a9a1b52b7d2fb", + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/browser_qualification.py": "23c7f7c2ec8a0ee370765ed2bd1cc7ac770044cebc0a5fc779db71278e71161b", + "docs/education/build.py": "2a5edbf09bab1027733962feb51264a750efd68dc36037b04148337eec14134c", + "docs/education/build_solver.py": "264ab362fad76b73a8407baefe98b0d322c46f1c4373aa3e11a01b7669809855", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "docs/education/completion_browser.py": "e3cf5bbaeae27988ac4a34308173812caabd31128fcf4e14f4209e646edcbb8d", + "docs/education/completion_labs.js": "9b8f8ed9e8a5a548eb35ad2504a2871d53ef4490f498554edd200fdca00c076a", + "docs/education/completion_oracle.py": "ed9cf537360194440e6a75e181cfd1c0e7509d4f763789594f9058cd1a698715", + "docs/education/completion_reference.js": "9cfeb4d083f6cceb08dadb8d42790b2fe76ea502a92fbf2f165f1a47f34376a5", + "docs/education/compressible.js": "3aaa2092224df64ff845d41dff515444578d71c7866635be5d9e0f792695e9f6", + "docs/education/compressible_browser.py": "e68f64abe6cf33671393d192eaa56d8abc16319c8b2b795dbf737432b4540bd7", + "docs/education/compressible_lab.py": "f90d4ea76d6689b2436ffddda82c771539765315e6d97e7cadb22dc3d5fd7903", + "docs/education/decay_browser.py": "fa452f01835082596eff1819e112b17c2edaac03120783c4aff762e19d7c9535", + "docs/education/decay_labs.js": "a5a4e8b4e0fea6acb048576df01a084f8bc7348ce58161befaddcbccec263ab8", + "docs/education/decay_reference.js": "68d7e4441f232d312dd3fe95972cf9e66bd658b306734a23e93937f997604e97", + "docs/education/engineering_browser.py": "511a8439392a4994a730bce6256e966fb110a0cf4703c451e734f682531ca9dd", + "docs/education/engineering_labs.js": "7532a694be8a93c210a22b57bdff913150dbc2c2300828c6f3d15f11708c1f8b", + "docs/education/engineering_oracle.py": "0a7517b096fe2d84ca4b4c020de967baa06985e6ab0a5b6d07db657277847572", + "docs/education/engineering_reference.js": "16cfaed2788ab13db253d36cc3a3d81b1218fc693862cd771deba0f9b7e0ffca", + "docs/education/flow_browser.py": "0b5f82dfbd2b7665a4968980d9ff6c4c36bd12fcbaec032fcbd0b9efb033a81a", + "docs/education/flow_field.js": "18306375a77722be2b7966715d77dcbf9b20c2fcd37f9b83d110b82ac55bcdfa", + "docs/education/flow_field_oracles.py": "496e294bfc189b20cf0fa8895d5177e8ca2328dfbb5bb71a08d97ffd987cb359", + "docs/education/flow_labs.js": "1becef8c6bbce0a3233a223a6a6401565c6985d5191c43591baddc21d7f435a7", + "docs/education/flow_volume.js": "4bea8589c62a4a83687af2269c9cf5bce9755b4deb334632226a1cbbb2736666", + "docs/education/flow_worker.js": "bf6acd31eecd19e9c411154527912bda28635f2ca62b8a6583da19807e448911", + "docs/education/gauge_browser.py": "a8d1f46b4993c234b7a6b04f3705da329d134d828112c7397735ae61ca9e54a1", + "docs/education/gauge_lab.js": "fe505ad93a8db8a72cf07987839a9b61785bf4f7f42b781259d6e0443690658c", + "docs/education/gauge_oracle.py": "f7d35ca6080f9f8c17a655dfab9f95daed6101bfa004be033e5ba07a26172aa2", + "docs/education/gauge_reference.js": "3da0202b04d76dc85088312b37269552211147383c37482b8204469eab69a647", + "docs/education/generate_references.py": "37ceeb8b5cd278aea5880ef396d47cbcaefce0d4f9b03111f4f9302f82744e34", + "docs/education/labs.js": "76cea3ce92b270209cd3e426eef5be996f5bd4d6c01799f6c75c5b2a8259bf9f", + "docs/education/markdown_bundle.py": "315727d9155608f8949ddecf5d96b9b659e4e05a2fa64cc36ae1f517ba680958", + "docs/education/native-sequence.json": "1bd553105b24498e336b96a6961ef5118b6faa11ce8d5033c44b3d04795c88bb", + "docs/education/native_browser.py": "3c5306438a0beb368fa4c1e6f75fb56da1a66e342f8c0aa6ddd270a498fd0546", + "docs/education/native_sequence.py": "87755e1d469ab48e7348e79da4486225c8691bbf86485a549fbe2869ad954cd1", + "docs/education/navigation.js": "cd76bec6a2a3dab8d81c38a3253d9d475ca5ba82f1997c0a083c574e393f1899", + "docs/education/obstacle.js": "8318eb4145196a4cdadb2b3b63b2f785bb62653094713e46a8088c3be61970d2", + "docs/education/obstacle_browser.py": "62f8123d4be34070897d6374ae0bbc2fff991a38a5a4ec52008f42b173673ac5", + "docs/education/obstacle_flow.js": "35bceaa954b2a76cfb19151ea6fb826cb9492d6f8dc8259e152c5862f7ab3590", + "docs/education/obstacle_flow.py": "51cbba0116cb35075317b6681cb3d1ee018b45ab49c409cd485daba462a6c936", + "docs/education/obstacle_flow_browser.py": "d483b5e0b89e59ddf7fb277e8a8c2362f926d99ea212490f3aa679f4116a0982", + "docs/education/package-lock.json": "58883fc3bd9dc3cc343090486038c6a46719c5839cb9dac7d58e35f6656f5659", + "docs/education/package.json": "39ebad8ca13e58de7800d602f58b8c265c2783294d31aad88406b6825abe7dd8", + "docs/education/pdf_freshness.py": "059e5288355655c2310dcf02c682499adba0622869a96454cfc152661b2787c6", + "docs/education/practical_browser.py": "4ff5f0d9f29e96c6d4df9010170bf8a15b832b584cb9781f561862186f67be77", + "docs/education/practical_labs.js": "4a68585fe5f8f45f8aa7a1ac2fff403a9f4e692144d609d5d8d8c3e03309d185", + "docs/education/practical_oracle.py": "aab972094fe6be097d05e70d9e405857409820f6bfd29a5292846896e4d46777", + "docs/education/practical_reference.js": "b191a85ea9404e5dc9e64744cdb44dd783f875fd389f98e633df9a68c2d86467", + "docs/education/qualification/modal-decay.json": "97204b035f9290ba819cc301f20a1df451a77a1dd742d4e22c66bd119c9b1a01", + "docs/education/qualification/volume-flux-browser.json": "964d51ac9cfa5daeea933248497e54821fbc9e163721edd71dfbb60bd612fdbe", + "docs/education/qualification/volume-flux-proof.json": "659fa1f380faca35fa64668d5879e23f9b217db9b0e8d9259df022ae442ab3c5", + "docs/education/reader.css": "4bacbecd14c8650aafa5f662f1119fa916d42b7345897621ac7a9c553d7b666a", + "docs/education/reader.js": "5501cbee985f3352ada11de0e4c3db6766b1247eed81039cd81b08360c785103", + "docs/education/requirements.txt": "85fcdb1ab7e1444cd5a3200037d91b45ceeadb804b9b0e3520dbc26eecb3ea82", + "docs/education/screenshots/README.md": "0ae580bfa6b46034df13444357ae1a95710304d31a2389228829f09fa805462d", + "docs/education/screenshots/research-book-540bdef/desktop-reading.jpg": "c1e31610c7966ca606af4013f4dc6fb3dd8d6f5cb34f5ffcec7ae36d369d35e5", + "docs/education/screenshots/research-book-540bdef/phone-example.jpg": "42a0a57be9ce8b051f4015b9749b335231d0df0ece6ee6842d14eb97510f43a2", + "docs/education/screenshots/research-book-540bdef/phone-split.jpg": "0f7ac288f7689077fb92e86dd0bc797536e14a27174709ef8582d2d7526c1cfd", + "docs/education/screenshots/research-book-540bdef/phone-text.jpg": "b767410611f0e5cd252b7fd7e1856955f56b48361f19f855ead9a1d3b8ba194b", + "docs/education/screenshots/research-book-540bdef/provenance.json": "a5e7b7d315da68fc8abacb487589877e6b5678d87b1ebbc7e564ba19bd7f0cee", + "docs/education/screenshots/research-book-native-flow/desktop-flow-compact.jpg": "f34ac89416e539f7e489c5e4418a02d63022fe4bc3856e537b7d25466a4f63b2", + "docs/education/screenshots/research-book-native-flow/desktop-flow-orbit.jpg": "b0c62fb11412aa98f134a0934583a2b47a6c190fb3698a667414895a822b451f", + "docs/education/screenshots/research-book-native-flow/desktop-flow-reading.jpg": "25fa099fd42d68b81526af768eda107a1155c00707badfcf1d625e55e6ad3116", + "docs/education/screenshots/research-book-native-flow/desktop-timestep.jpg": "547a40b7fccf9c9583851686fde2c8f5eedba59f56637b1720bf6cbb1455b9ec", + "docs/education/screenshots/research-book-native-flow/phone-flow-compact.jpg": "8f3a169c068a486b56b68493d00c2eaf3f93ba1a5b38011bb052c57a3c61b782", + "docs/education/screenshots/research-book-native-flow/phone-flow-example.jpg": "0485ac8309678e44d5a5b92ddb87fa1019310e6b27d81222fcc219eed6482cdb", + "docs/education/screenshots/research-book-native-flow/phone-flow-split.jpg": "1df15a47406a24ea110fda151aae9e36d055e49799e6c2b00c8a036681c762a7", + "docs/education/screenshots/research-book-native-flow/phone-timestep-metrics.jpg": "8714e55714ee84a7f1033651d81e2eed232fc4f9159cdd1cc39e94d827927096", + "docs/education/screenshots/research-book-native-flow/provenance.json": "1b4eff1027e68c499169f353507d01d7f0df1552154a39d9dd5032cf0e99efc2", + "docs/education/screenshots/research-book-transport/desktop-sampler.jpg": "c47d9036acc42eedccea1c028f8d8e057e757dd23a3c30324d53006240be7ec8", + "docs/education/screenshots/research-book-transport/desktop-transport.jpg": "2f53743fe7cabb85df51cd446768bcc51d4d7acba6118cb9dd5904b0681d3311", + "docs/education/screenshots/research-book-transport/phone-example.jpg": "3d5c4c089c92ce260d6659c6c0ca808fdc8396a1fe5c09df505338851c2d19e3", + "docs/education/screenshots/research-book-transport/phone-split.jpg": "b1fb5ed47da8003ef5af431fca3224ea4313ded351dfecf51b98c863ecd7897e", + "docs/education/screenshots/research-book-transport/provenance.json": "06f04d742dce5fcbc4ecb6a3f48b95bb3da42ab4d701a01361689e2dd9929b23", + "docs/education/screenshots/research-book-volume/README.md": "7a4682210c75e3e0faa464158dd93bfef41319d70b57b40cb3d5df5a7be9031a", + "docs/education/static_obstacle.py": "b12454453bbf73ff94900b30b292c6481053644a61d5d59b290b6a1f4496e031", + "docs/education/style.css": "ae5941f905ccd741304fa3e4acddafedc0f9fd36b4045655e2f30ed9ac5e9135", + "docs/education/teaching.py": "853d316a394fd54b55a7aa1edbda18ff4263ee02e4a6c85e74a536f9a4daf070", + "docs/education/teaching_browser.py": "0475fc3c2374fab9b5cfda9ff7f90dc6a36a1fe85a30fcfdac6adeabd3b2670a", + "docs/education/test_aligned_strain_browser.py": "29bf3bfc1eba6715ccbdf7f697afa4728cf7cd5fa2c410deb947e8dd870015d5", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "docs/education/test_browser_runtime.py": "04f66a297eef5d68cff0b7816e4d0d8d8e8f7bcf2f2b7a7727a196dd4b18f51f", + "docs/education/test_build_solver.py": "49d6c35d4f94e04098be923ef43c0e5026a60ccd7a6e2f63ca865ad90933dc5a", + "docs/education/test_completion_reference.py": "7910db8fc845f0d77c370158f53016b6edfa9bed669822dae57499550f334718", + "docs/education/test_compressible_lab.py": "46b8ea5acf4d2825f956ab458fa521b0d9d8a5b956e8ea605faf2c7edf089208", + "docs/education/test_decay_reference.py": "3c7dbd29e8ad983cf11e8e3c3e0d1ec6b4c54a1f48bfd67feac2f20c24d059d9", + "docs/education/test_engineering_reference.py": "0258a603bf82cfe817b561032e32d03e7ef3a2d268cda18608ec1b9278639dab", + "docs/education/test_flow_browser.py": "ec685a16673b020e4f706c7b80004f49730bfe02114cce662ed70297951d1e60", + "docs/education/test_flow_field.py": "9e486e7f679c15276cc9eb5a5436d04486c5a4ed4467b3563640a6151953f226", + "docs/education/test_gauge_reference.py": "edb9f6ee436d575539d5d85280e4059ebcbd213af5011fe9a4cb7150e8e6dd42", + "docs/education/test_native_sequence.py": "df512c25c5ed0b1457b813ddcea24ff6f2e7d8c4231da9194ed4d6420af803e4", + "docs/education/test_obstacle_flow.py": "4262944b4a289f10634cf554420da0c05130cfe383c1e74ee6e135d2203423f0", + "docs/education/test_obstacle_flow_runtime.mjs": "893a8e5ab0e7fe72ea14745d45e3414cc2d82d825e931ab5b183881d0c8ffd5b", + "docs/education/test_pdf_freshness.py": "45c54da7cb41c353886b5b6422820e1c789d355611032e92e7a8cc98eeb552d0", + "docs/education/test_practical_reference.py": "fe2a86e5fa521b7f99fccef8bff7a0ba197caf3fe6ad45045c696b2a97c460a3", + "docs/education/test_publication_gates.py": "fe056ac50ea0b21b199791f8d908957f1048a72f2c6d2c1d33d9f5bc50de1f68", + "docs/education/test_static_obstacle.py": "26d609738f9ec6ea5cf00382b93eb65a6c4b2f9df44fa24bd625414a764c7d10", + "docs/education/test_timestep_browser.py": "b8facda594cd3f0c8115d1836a4cb840f15fc1f9b398617ef88411ce255cbb40", + "docs/education/test_transport_reference.py": "02bbe7033e7bc21aafec8c0a6b1e2bf581fc1716517ca9f3b31221266e393fad", + "docs/education/test_volume_reference.py": "c0dbcaa8e4ae1e115c6a2f9e0af950d89706c334f24de5720f193179aa42ca6c", + "docs/education/timestep_browser.py": "d44190b587fa1f0304f309a859c6b14d59d29b7b54d4aa5e1ad45d52c39e314b", + "docs/education/timestep_labs.js": "b1b7b952e183d41e3bc90fc0648a9919f785644c221368684a4e56f81edc5b07", + "docs/education/timestep_worker.js": "4f9151acc49f50353b37f2939932bd0cd0e465096f81ec88662d0bb83ca1563d", + "docs/education/transport_browser.py": "c47b401b57c720600d416bcbc8aaed6c3990850b21711120f93164cc2695f55a", + "docs/education/transport_labs.js": "8731d208d72d197baf9d8eb7b1875599d50482da8badc7de5807c041b0c0a0b8", + "docs/education/transport_reference.js": "037118f4828368ff1421e54ca677244f21644b76b135d05fda650b3b7960ce9d", + "docs/education/verify_browser.py": "9518d95fd72d6ced8461505f07a3d84df27c1e3ca96b12450c296b22894b1f13", + "docs/education/verify_site.py": "92e7eaaf988838f7b9d17089817d60a6990fb57dcdef848944459a649d6a196d", + "docs/education/volume_browser.py": "6316ce65009d50f9d8b32f9c5fcaa997de2859e3bd97716ef3cbd624640f4f38", + "docs/education/volume_labs.js": "1cdf5de09f5da3c0b7daf2336baed0d29c8af09609eea91db52905b433b11d80", + "docs/education/volume_reference.js": "5b91faf3ef962c501950cddb5be1e82505bf9809c0be9bcdccd6c9f36dfa1184", + "docs/emitter-controls.md": "f60bbe99c5c5b137fd80cd8cc4bfe21ccfb3c88bedd339fa8ed1174c7fab9fa4", + "docs/generated-output-audit.json": "b14598374de9039c69b94d0301d8a62a5814a766d80d9c09a9d280ad101d431f", + "docs/implementation-reference.md": "4b3affc3e034fb455c116a29171692c3fba2c82128637507e1ea17787be255fb", + "docs/implementation/ai-provider/README.md": "4137ea60c9e71ea81671a69b666d00d176444edfd20492b7ae6154601deb3017", + "docs/implementation/ai-provider/plan.md": "0569b706d5df869dbfaef5a2c326f21a4b7196db86f6f9f8594fac61155a6710", + "docs/implementation/cad-obstacle-lab.md": "2901ee9d8c14e7066361d4cde46d61084fd155dde2f10d723909eb7fb0916ab1", + "docs/implementation/dense3d-metadata-followon-plan.md": "c78d55eb693e26b256062d7bd01f7b0730f785ff4ae38c98903b1babcdc45963", + "docs/implementation/dense3d-producer-controls.md": "fe21aeb54647f38001600440b9acb3bf9e7a821c0fd261b06f049f942fbd71eb", + "docs/implementation/dense3d-sequence-design.md": "440585ff717ed937d0b4f62d3ad7702efbbbdfb633576060fb2f2b3a56a96810", + "docs/implementation/dense3d-sequence-review.md": "8c15b76b04ae7040cad93311a234ac3c6e5fcf9458ed6a7fe8afd41513ff6751", + "docs/implementation/dense3d-sequence.md": "ec873d4bdf9e6585d4fea8d854c6d0847d5ed13cb6bd70ded0f1dbc8a2d62a53", + "docs/implementation/quantitative-inspection.md": "cebca3585ba15f7412e0bb13509b493ca5524ad823bed1af60df9ab669190d99", + "docs/material-fluids.md": "fb1c89dd16ce2abcc98045bcada7e05ef1212218bb29ab9a57c9a6c93f010bca", + "docs/native-app-review/material-preview-a552d0a/README.md": "7573625c7ba77ec8077678ae13c28e3b03b78a14fb7a9bd4d1f9eba6a31e6da3", + "docs/native-app-review/material-preview-a552d0a/asset-sha256.json": "a974d2442fb18b1a85d217cea39f0318ad5312c344943fe4c311b3af28ebbf1f", + "docs/native-app-review/material-preview-a552d0a/handoff.json": "1d4efe993eb42bb7521b834edd023499c13adb1d10d8500001b779b133667a1f", + "docs/native-app-review/material-preview-a552d0a/material-accepted-orbit.jpg": "a182b1ead1ec2688c0970c4d954083cd0156656f64b9dfe54fab4a0c5689ea92", + "docs/native-app-review/material-preview-a552d0a/material-accepted.jpg": "9ef02218ed3f4fdd1066d64d567766019e1f6e79a5d84294ca9c5d898820f1ae", + "docs/native-app-review/material-preview-a552d0a/material-results.jpg": "b1cd2314018b4e4e7535a98ff315abc61041c15c861be121e7e83ecae4c0c4f7", + "docs/native-app-review/material-preview-a552d0a/native-source-match-b9d9d87.json": "30e2507604450d06d08c38db54a5a1fd49a509340a5575c8ca4015a6575e3769", + "docs/native-app-review/material-preview-a552d0a/provenance.json": "fc539497a3106b5241881245e315e5b27ae86119e0c20da73824f7a52954de56", + "docs/plans/accepted-step-recording/execution-ledger.md": "f8861cc702fbb1803aaddca1edcae173fa12b623af8da84c7f6d59da3d1c75cd", + "docs/plans/accepted-step-recording/issues.md": "c24bae39b2f8877d079b4f97d2eb5e754d5eda850542974efb81f9ad151bd005", + "docs/plans/accepted-step-recording/plan.md": "24b6b0e069e0650cb31dd6e95fde509a36d5b9d1b692c00fb05fc6b1fe8ef315", + "docs/plans/accepted-step-recording/reports/design.md": "1bc50b213d62b871b407b5af953eae0f1fd1f7532bed01cd8826a5365da99fbf", + "docs/plans/accepted-step-recording/reports/verification.md": "5e0ae55c69c312e1515fc00a3b50ed1da481a1e571a67803d0fce8e43f4d9c3d", + "docs/plans/cad-live-vtk/execution-ledger.md": "d76f62f451a8680dce6553c608b8f572066bb529e0dd549f40faafa7d86ddd71", + "docs/plans/cad-live-vtk/issues.md": "9cb6702aaa70f53d469e6b6ecba3c1d66d7cb1249c9c04b356b5fae5e06bd452", + "docs/plans/cad-live-vtk/plan.md": "bfe0c2c5461d7a052fe54fe058aca3979be5d742a51e1661432d880ce0f2a94f", + "docs/plans/cad-live-vtk/reports/verification.md": "c3678118cc0cec5b657e12da0d79a05a3c882e5197f9122ef9bcc6f9f5c44b9c", + "docs/plans/configurable-solver-components/execution-ledger.md": "5693e36111f898636e9330002b069bdc98cabc594d28b543d9d30ca6f0c9e78a", + "docs/plans/configurable-solver-components/issues.md": "ba483be3cf4e10350c88bf07ceb10f038a1b850da31174d4c2f56f5139ea183d", + "docs/plans/configurable-solver-components/plan.md": "08168f25b9ef97ae0e80932aa0cbc6c48bccc1fb6ccf73e4686d9ba95376e707", + "docs/plans/configurable-solver-components/reports/accepted-cpu-context-review.md": "e8b1e665e0dfc04765941bc09aa7360a1d8be67b1d1f87912c2969dd10e5493b", + "docs/plans/configurable-solver-components/reports/accepted-provider-bridge-review.md": "de116683d3a2a071530ee0ba08c0484e1f132a29ea4c572646bb1f1847654708", + "docs/plans/configurable-solver-components/reports/accepted-recording-cross-review.md": "b3cb5a656b15e7d1cc87d2e51eade68e66230951cfc9cdbcf1af02a588547057", + "docs/plans/configurable-solver-components/reports/accepted-session-review.md": "5eb484d371170c7457f48c26f7cf2dfe1508046b1a84c1eb15799e0dc03d6ce9", + "docs/plans/configurable-solver-components/reports/bounded-acceptance-review.md": "511384327875439a0c2bf5fdac0c359219702dd0ef5528911e9e374213861726", + "docs/plans/configurable-solver-components/reports/bounded-acceptance.md": "f22cf1bf9be59b8498a13d32df8880bf4dc8011505be578576e170d1bcbfea75", + "docs/plans/configurable-solver-components/reports/configured-archive-review.md": "bd3091f983a23ff52d80144e2c70e53db44bb4df11810e0ae6918b8bd399616e", + "docs/plans/configurable-solver-components/reports/configured-comparison-consumer-final-review.md": "e9d7d7889d38e1a1e1723e33520a34dbf8d4bc50d52f04bf0b025b3d8fced1b7", + "docs/plans/configurable-solver-components/reports/configured-comparison-working-pins.json": "138cc9a759b7dee78da63b83960c9df1a2b7313eef1829c574de2217957b99e4", + "docs/plans/configurable-solver-components/reports/configured-comparison-working-validation.md": "4bc8fa66d79545f50bc757dbf7b4951028b8d82c70f419cbb9d15d2e9d6b4ba4", + "docs/plans/configurable-solver-components/reports/configured-desktop-composed-review.md": "7c398c41abcc9d33e234399ff82616c922a97384b53c585ba95e8cd0389ddf31", + "docs/plans/configurable-solver-components/reports/configured-intent-review.md": "0c5359647445d65d3850868396563baa954512e6a8c5a37ee8b5516ac197156c", + "docs/plans/configurable-solver-components/reports/configured-live-window-bc6.md": "0b7bed24b2345ee6ab4af5c1a3d21658935f1d24c0c520c4b4149093aef1792d", + "docs/plans/configurable-solver-components/reports/configured-live-window-independent-review.md": "ac9fee999883ff55d23bbc694325747434272bc236526e2ed73eb862be6b038e", + "docs/plans/configurable-solver-components/reports/configured-native-refusal-review.md": "41a7970661042052c7baa02bd2865770f5230c294c5f5d64222377921423ef4d", + "docs/plans/configurable-solver-components/reports/configured-native-window-bc6.md": "19eab9d5341e66f6d5c28eab64d8107f491b9002282aae9fabf487682bbeeeff", + "docs/plans/configurable-solver-components/reports/configured-producer-final-validation.md": "c836e13045b4a5cee507576b67ca0882b583294917109d3c7e4fec0e3e115db5", + "docs/plans/configurable-solver-components/reports/configured-recording-comparison-review.md": "26ae9a5b77f8d54d750bc0b659e974b1dc6c07e6166ca369251dde77ec8fde50", + "docs/plans/configurable-solver-components/reports/configured-recording-review.md": "be12b74392b426294b045b29d7f00d6929c8742715baf8fa9627c7134a0123be", + "docs/plans/configurable-solver-components/reports/configured-recording-stage-review.md": "e0331f259d388f33b8c7f3eefd330a85203b41ba1a53af3b196ba29a1bb859c4", + "docs/plans/configurable-solver-components/reports/configured-runtime-cold-final-review.md": "185a8c97bd7493400381a0aca87dec965489eb1a903f6d9a26ad7920eb59949d", + "docs/plans/configurable-solver-components/reports/configured-runtime-recording-review.md": "1228bc66e7afa1892fd337660d636d610b22cdb53fe18e06e98c68661c6fec31", + "docs/plans/configurable-solver-components/reports/configured-saved-window-independent-review.md": "1f255d70db037ebeb0a7ab0e7daa6c9be4dfeea4103b24136887595f7b1c3efa", + "docs/plans/configurable-solver-components/reports/configured-storage-producer-exit-review.md": "7980a3c5db8c29cc44d9f94c0a2ec05564d42453d27170829045c3c0f3a2e9fe", + "docs/plans/configurable-solver-components/reports/configured-tail-summary-review.md": "d3a58c7b0e4717bb319d16590c801bc6bce522bf6cf3759b577323a80e5c44ca", + "docs/plans/configurable-solver-components/reports/configured-track-review.md": "fc739c6388fb044b7218de8f6668224bb076a1a6e570c86a6ebcbdaf34d1d644", + "docs/plans/configurable-solver-components/reports/contracts.md": "cda8988ed1cc2d4eccff5226ab8bbe91cebbd3cc21799bfad0aa7576d54025b9", + "docs/plans/configurable-solver-components/reports/desktop-build-stamp-review.md": "5c2de326a19d42b8e7ce477fd9597b7a84d67b2016ecfaa2d46b2d63a6afef8a", + "docs/plans/configurable-solver-components/reports/final-configured-consumer-combined-review.md": "f61ce2b124b534383deae5aeda0dde6e7dc94c7034a80e147f9150e4f87ccc6c", + "docs/plans/configurable-solver-components/reports/isolated-ci-budget-guard-review.md": "f991b018b4a2228e5163aaa6e02a95e04d32464251eafb656c9f4b8a8ae0c90a", + "docs/plans/configurable-solver-components/reports/isolated-ci-toolchain-review.md": "18a6511795161711dcd6766f280109566e252744076057b58785a3dc7c7d2457", + "docs/plans/configurable-solver-components/reports/m0-reconciliation.md": "c29a76dbddcdaca2d3bc07199c21b4e5f0e7f8ecb4cfeee59821e0b86c24040e", + "docs/plans/configurable-solver-components/reports/m1-handoff.md": "6eefaff012a4c2beea2f234baad8ec4a39d29c5cffb769caf212a936166aa5d9", + "docs/plans/configurable-solver-components/reports/m2-native-contracts.md": "95874df48eec53462a2f7d01c6cab57017f47f434b315e9bb269a50beacad467", + "docs/plans/configurable-solver-components/reports/measured-a1-owner-inputs-sources.json": "d0f68847eddec8d3d2e2afd03f8d86c9751815e1d73d4436879dc3349526dc31", + "docs/plans/configurable-solver-components/reports/measured-a1-owner-inputs.json": "a2c5ef8241ffac7b212698e03ee95408b7d0ae98ffb779e5100b2effe92ef10b", + "docs/plans/configurable-solver-components/reports/measured-a1-owner-inputs.md": "35e6af65ca50a493465e4dd7e69cabbe6734ae844039ab9c9e1c8c09bba91f78", + "docs/plans/configurable-solver-components/reports/measured-package-availability.json": "88d9da61f01c592e3e8065477b48cbbc8f361fcb8d6c022ac80b2a555cb6f04b", + "docs/plans/configurable-solver-components/reports/measured-package-availability.md": "9ec90ce104a691c49a93f3ed4272e72c94b8f1cd7a610bb88bfa1bddbce02b17", + "docs/plans/configurable-solver-components/reports/portable-session-hash-review.md": "c746dcec97da9f554ec6045653e28338fa1e27b8aca23026ec4b2cdf15c9d622", + "docs/plans/configurable-solver-components/reports/qualified-desktop-build-evidence-review.md": "e5d483f5c7a787a41c89396c30660e117b58cc30004179f2ebb1b912459f3bca", + "docs/plans/configurable-solver-components/reports/qualified-desktop-build-sidecar.json": "867394d410b8e24f4af20de9c80c7b6b8ab5efa55bc0944421667f68c74adb4f", + "docs/plans/configurable-solver-components/reports/qualified-desktop-consumers.json": "300e82910bd90e554d75e6574d2feaea1ae68567f155841dca04b31eeb2ef994", + "docs/plans/configurable-solver-components/reports/qualified-desktop-wrapper-review.md": "c1644bfae4b4b965ea377f2339afe584ae1bd1bb9aa59ba211ca8ea5cd7b23be", + "docs/plans/configurable-solver-components/reports/research.md": "180bf4fc552d8481c102830ab656eb83a3eb408a059f74d2794e958fa7f5df05", + "docs/plans/configurable-solver-components/reports/review.md": "2073de9e3431879334f8f6be927b7ccf850dcb29c25f26b108cbb21ac6447c18", + "docs/plans/configurable-solver-components/reports/saved-source-commit-binding-review.md": "02ff287acb73c84f4a843aff831514522ed449edec79943d03a09be0777e607d", + "docs/plans/configurable-solver-components/reports/saved-source-review.md": "dda8eebcc9a04a772570fbb9324357f268ea3858155af88913b72e0320a9eb2a", + "docs/plans/configurable-solver-components/reports/session-configuration-review.md": "399ca141b1a66380915f6c84f72d7461f3eaaf8180e0b4de19afaad77412d3d8", + "docs/plans/configurable-solver-components/reports/session-interval-review.md": "89e493ca010c9b109aab53e391d2c1dd979cd929dca319ab69e6024da897a952", + "docs/plans/configurable-solver-components/reports/standards-and-design.md": "ba5c979335563b752027c5214257a2e2016661202f6cc58894b49ede0c85ada5", + "docs/plans/cpu-cfd-validation/execution-ledger.md": "651ce35ec2de352eb2d5c9d05f6e1629327b2c92e4868f20a8cfa0d87ab1aaff", + "docs/plans/cpu-cfd-validation/issues.md": "0d9846f0f899fc8351c0681368e9551e61fb03415a26df598aaa3594f8b2d415", + "docs/plans/cpu-cfd-validation/plan.md": "269d2d900870a0bc43ed38b213e6e8dafbacb502329cf8d1f4ab57919166f3a0", + "docs/plans/cpu-cfd-validation/reports/dependency-licenses.json": "c9b82c06f77ed1b9abf0f7f5dac53e06695ca472abdc3ff0067fc09569b61e67", + "docs/plans/cpu-cfd-validation/reports/independent-review.md": "0d53ded5a7f10a0d8feca8cc0121448bb63ca4aadf13ac4a7f76545bbc83e804", + "docs/plans/cpu-cfd-validation/reports/native-prospective-results.md": "a09ddf70b6c62e55001cde581156318c6a4837f9ec26c2ea183cb6df26eb9cb6", + "docs/plans/cpu-cfd-validation/reports/native-s1-diagnosis.md": "78e71d04c36bc0e2e7969301c55ff2097170bf4bc88a5d5e36f4f28ff33b3f8a", + "docs/plans/cpu-cfd-validation/reports/prospective-study.md": "75739055b76262d8735956823ae75ef97e33fdd0e961cdf1c847cea93ec8c52c", + "docs/plans/cpu-cfd-validation/reports/s1-export-proposal.md": "f951c530b91783e52cfe1f5e70c0cdea6a580268991c303d99404064c90fc32c", + "docs/plans/cpu-cfd-validation/reports/staged-validation.md": "a3a7db9636ea41f3fb3cf82b67af8587c14cd9ffb2d11eab49f2ec3e8af05834", + "docs/plans/cpu-cfd-validation/reports/validation-results.md": "09de46d8485ab10f6af79b43b983aef4491033b2106ef5ecc802070c010df0a5", + "docs/plans/cpu-compressible-solver/execution-ledger.md": "9f72c917bdc95e83fa117c7670075bf4d962e591d8ef50b565a7e19bb30f7e63", + "docs/plans/cpu-compressible-solver/issues.md": "46a062350e06fb5c130e87b2830cf8ae8d42d189a27624f886a7295d0ba38fa4", + "docs/plans/cpu-compressible-solver/plan.md": "b52e389147e6fa5613031e261ab96f5687a9c847b4b17a06581f87a5a85aaad7", + "docs/plans/cpu-compressible-solver/reports/acoustic-resolution-revision.md": "175a30f00c4c4546806f2743d584dbcdde928a932e6993fba2245144d56dd096", + "docs/plans/cpu-compressible-solver/reports/design.md": "3b15a6a31fcc4a0bbb4d278aea26399aa59b1dea0ab3132db537d36db459a59d", + "docs/plans/cpu-compressible-solver/reports/first-slice.md": "e024acac19ca6c5e02ababc1655a079d3aca7f82c23a4c906a249bc1c7fbff5c", + "docs/plans/cpu-compressible-solver/reports/implementation.md": "97366ad471f8d393c58b706c7fb82117d202c2ecc32ae7d60cdaa1293ef8e36c", + "docs/plans/cpu-compressible-solver/reports/release-baseline.md": "bc4fca214fff8f42269e5bec1d4392e77a279c8b692c4473d88433e15b181f99", + "docs/plans/cpu-compressible-solver/reports/verification.md": "31ce758612af06f7cb4c799f7fe96007249af9421c6a98a1d8b2a2b38e0be218", + "docs/plans/cpu-pressure/execution-ledger.md": "ee8d27431280de0c2042c494ea3ed4a8b60535bd6db437db4e6d6d68d113eaa9", + "docs/plans/cpu-pressure/issues.md": "3a7b0c282c19dc6d22aadea9b46a5b8174ac9b792a1287127c57fde996841263", + "docs/plans/cpu-pressure/plan.md": "6bc36d8a5b528c6a2e74f1078824d1fbc224dd8c51e402adbe3b7d16547a07ea", + "docs/plans/cpu-pressure/reports/artifact-hashes.txt": "1d273897fa11d85910616588c958376286c61269efe181cd4f9b946ad06c7673", + "docs/plans/cpu-pressure/reports/checks.json": "c27b8e6e82baa4cc138e5d370923f14737f324e5302ea42379ec440ebe37c689", + "docs/plans/cpu-pressure/reports/ci-baseline.json": "e17c7f71f385fdbacf176903c50380d119cb0799777db3651ad83fba49b4b7e3", + "docs/plans/cpu-pressure/reports/compensation-experiment.json": "6fafea90ce959a88339ba84dc5cd5aae85206d1ef55867fcb46ea16a5ad0c012", + "docs/plans/cpu-pressure/reports/debug-attempt.json": "e89d5ebb9819f925181e7a08ac2b8e6ada05bbc3e635008a15d984c28a7a75de", + "docs/plans/cpu-pressure/reports/environment.txt": "c932ace2a3c23aae158647df7368a7e1970a246861a3f188887eb84bbbd35b13", + "docs/plans/cpu-pressure/reports/frame-samples.json": "2addc491ac5fb607cd0d19ab9129c853e5eaaa0611d7368ac4bca6701b1b8895", + "docs/plans/cpu-pressure/reports/fusion-experiment.json": "50a5a88aac3343130c530cfebf6b8a3f1c4b20bae2fe607846d0df351114941b", + "docs/plans/cpu-pressure/reports/measure.py": "ae334385d0c8cba124d8b32df910c5bf6a6978518305a10456e48969c395d3be", + "docs/plans/cpu-pressure/reports/measure_particles.py": "8d84081594c017ded5e78aa820ced7df8338cf27dc4c34d65247a6d537f7d207", + "docs/plans/cpu-pressure/reports/observed-final.json": "ab25278d451dff0d1ece1bba368afd3064067ff2e7bd3449b593fc42bde45e38", + "docs/plans/cpu-pressure/reports/observed-fusion-experiment.json": "b9ec4565e512039ab12a03d5134e8724616674506ad9ce527f98328a6a19c4f1", + "docs/plans/cpu-pressure/reports/observed-wrapper-experiment.json": "cc4275538ae761fba62e020e39cf398655e1bf8965e5c3922f1354287e6e3a60", + "docs/plans/cpu-pressure/reports/particle-causality.json": "23ca51b08c997c0c148262a3a599613b73cbcb46bcb54e91b3903be2b1b0faa9", + "docs/plans/cpu-pressure/reports/particle-controls.json": "4ed35991be8374100f8bbde0e8f3bb443bf8e7716662502774ed15f3763ba9e0", + "docs/plans/cpu-pressure/reports/particle-final.json": "22d3994f93319bedc27c5c3004018467af25f9b783a408c5d800a8a8b5cc3d82", + "docs/plans/cpu-pressure/reports/particle-follow-up.md": "b552c2f916c1afb7a5ab63f710517dcc1cdbc6b02096fa217054763d3c8666d2", + "docs/plans/cpu-pressure/reports/particle_causality.py": "17d04b6a9b970c8b836385da512e74d73d15b7ecb923f54d23c1d5c21c4661ed", + "docs/plans/cpu-pressure/reports/particle_controls.py": "6d9b7841dd04bbf3ba551aec8f42254c5ae8f25aca2decc4cad4e73ca2d33d84", + "docs/plans/cpu-pressure/reports/results.md": "4ab99e85050938403c82ee7c38d711f8b1059bb8a20f088148d3d65e134339e2", + "docs/plans/cpu-pressure/reports/revert-checks.json": "8acb739c6f7eb170f86f3cfb9090ae751cf552fa858170a785045916b98f1912", + "docs/plans/cpu-pressure/reports/review.md": "111bbbf04f41f6ee974ccaca4abe4888a9d3caae2dfc0ab92353fe606a6fdef8", + "docs/plans/cpu-pressure/reports/sustained-final.json": "c506dc07d8dc9db791604e2fa1ccb78043ce23a3f7ae4703e700c97d11f3675c", + "docs/plans/cpu-pressure/reports/two-worker-control.json": "21ea64d72d46a322feaee46baffd719bddadcca99043ab1a36fc080ed96b26dd", + "docs/plans/cpu-pressure/reports/unobserved-final.json": "a6e30b390c2cacb8ff5d724d77d22e1767e8b7cbf72cf9b694a7e4e7d04da10c", + "docs/plans/domain-density/admission-review.md": "2fbb7825fa87e83ede74917129d13b1456b6a1b0dd23c116331fdae744022d1b", + "docs/plans/domain-density/approved-pins.json": "acfa13750b0559fd6a0bec80c5bc2e94cc906fdac3e8368971da52834975f276", + "docs/plans/domain-density/execution-ledger.md": "0465d5277ddeab155cc6ab9278add5022eaed06e5f9187b6b28472102af8e982", + "docs/plans/domain-density/issues.md": "9fecb86b42a39f9588a67005a32a1f20c8cabb89ebf494e0db97bec2fe2337fa", + "docs/plans/domain-density/plan.md": "7e79f54919b4e6de065d08911877b4224774f9e64dd7a4e307a1fc4f97c8da16", + "docs/plans/domain-density/preflight-admission-review.md": "ef7bd5fc9756e0a6bbb58ea51f60995cbe18ea3b18157f14146998c6aecd5a18", + "docs/plans/domain-density/preflight-approved-pins.json": "4b36340a69d1a02b7a22fd74df121c83cd34eb3b5f6452f276cc718e3d50c6ee", + "docs/plans/domain-density/preflight-followup.md": "ff9648b5a8d79f2920ee06fa0be644598c5aefc10ef39306d94022fc0fde72bc", + "docs/plans/domain-density/review.md": "95bb99b74f84265677dbb36ab212effb6110c62a4415907a54cdabe44dc2107f", + "docs/plans/emitter-controls/execution-ledger.md": "1bace9dd7a7a455f3efe8791919deefc3fba7f364536527c0e54ad48c4c5d522", + "docs/plans/emitter-controls/issues.md": "19ee6cf0285324a21fb1cbd155347d1a985e673dae2e949587ee35ddc09b35e0", + "docs/plans/emitter-controls/plan.md": "74b60b06320e2d6d78e67b0e354700648b2ca535715aa70e5ab260ca0dd0c504", + "docs/plans/emitter-controls/reports/default-baseline-probe.rs": "89720995df134c8fcaf4ee15cb8a3fd8954d7eb019397ca32e55eadb0751393c", + "docs/plans/emitter-controls/reports/design.md": "7d8778e072c02679494cfd4c1d60857fa96616d90a872ba14e8366aea1b1bbe6", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/README.md": "239420e0311e84bc63ed219ab09509714ea0c073b4e1fe179aa79aa915c911dd", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/check_guard_coverage.py": "e382b60a9450457559298a5e6f05544b129102ee745322c239fe32acf2853dee", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/evaluator-hashes.json": "40eb86c3d7f321a58803424430c4bb1054f25c09898c950a519a8b76993d4066", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/p1-adjoint.py": "c7ca75747b21d5e85d8f3efdfc116940cf5c95b3f26fd607f86842f3a75f75df", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/p1-material.py": "b62ae1a482998e4aef35e1343fc2ac006649142920d0f2911e60c66a1e0f9901", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/q1.py": "c41f7404e06e7171bd9b4e1623f0b175de56b98b0639e1e013603b826f28f5fb", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/frozen/q2.py": "025fb18a265b29b38d2ae0d7d8b0c67b9877562fbef1ad5dc65168814e351634", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/manifest.json": "94fd24f44a7c480b11238d2826a026a13d2651d3482f387dcc3b09aadf4231bd", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/review.md": "c028dd658006d24e8b1393c684a28c6eb481fd7aa1702094398ad138f509ea66", + "docs/plans/fluid-accuracy-composition/evaluator-tooling/test_contract.py": "5135eb03e6fa58cc3fa558fa2e57cf7007489a37c6c5c95fee38e4d578e1c2e3", + "docs/plans/fluid-accuracy-composition/execution-ledger.md": "58e0f6f5d3b36702e58dc5495e46724ee7cf3ae11c343e5b7c67955798851c0c", + "docs/plans/fluid-accuracy-composition/issues.md": "17a74e208bd9ba28ba7cc07e952b73aaa5028069637f3a2f7639fe6c3170ccaa", + "docs/plans/fluid-accuracy-composition/manifest.json": "9abaf12bdb443e1270f51f782827e9c88958a93965d2b696df0e6ebf90b82434", + "docs/plans/fluid-accuracy-composition/p1-adjoint/admission.md": "b465e65e8f3b786a133dab7db2038d1d7ac6178b3c17bfaf52fcc671b3aaee5c", + "docs/plans/fluid-accuracy-composition/p1-adjoint/analyze.py": "aadb95d77aed509b45f01690e9c569b70f65ce45559398115db8bc86aa56193d", + "docs/plans/fluid-accuracy-composition/p1-adjoint/issues.md": "61ec5ed09fca84e80b68abca7f5d16c482f50aacaa4e87a34b5761f68bb804aa", + "docs/plans/fluid-accuracy-composition/p1-adjoint/ledger.md": "b282e5712983702f436e7675915e3084aa9143772f4f2d495a58bd3e18dd1907", + "docs/plans/fluid-accuracy-composition/p1-adjoint/manifest.json": "dcf8c013e906e8118949e3d6ebf017cba473836835b3352bf332f2659e914838", + "docs/plans/fluid-accuracy-composition/p1-adjoint/mathematics.md": "87498bdc5c813c19a62c1b19fd3e57313d5f16f00ca57b4ecfc175ed4a042388", + "docs/plans/fluid-accuracy-composition/p1-adjoint/protocol.md": "f3a2eb916796675700e0c1df4de1c7d9ce73bda2e49cf4a8459e7373b1e69995", + "docs/plans/fluid-accuracy-composition/p1-adjoint/qualification.md": "331514768b6a06fb2792ff92f7d0fcd7fb20461e45d83f2e73b0869da0cb00cd", + "docs/plans/fluid-accuracy-composition/p1-adjoint/results.md": "9ab83adfd2ac7c2b363a27d70142abbc661683efdfe35077bbe189634f0ac9cd", + "docs/plans/fluid-accuracy-composition/p1-adjoint/review.md": "92bb681d65d390c3e76159fb55754fb37ad5be565ed03c195ec9f8c55336ba69", + "docs/plans/fluid-accuracy-composition/p1-material/admission.md": "4a01a64c175587a2512825e6244c02cf25e081c7718f2577217c19d1d8d000d1", + "docs/plans/fluid-accuracy-composition/p1-material/analyze.py": "06eb2ab3fbbe481ec32592a91be8f09c12b34d90813d8af7522c45d7659cb1a1", + "docs/plans/fluid-accuracy-composition/p1-material/ledger.md": "25f92f95aa7328e465837f5d9c436dc53fd8e29dafdc89306a10d9a8359e3a21", + "docs/plans/fluid-accuracy-composition/p1-material/manifest.json": "e332213ceeebe5648aad7727cb29aa914df44f4f52a056aab4092c0b01655234", + "docs/plans/fluid-accuracy-composition/p1-material/mathematics.md": "81bac6058514e33cbf846ffa00669b186bbcd480055b3b7bbcc921d16d486155", + "docs/plans/fluid-accuracy-composition/p1-material/protocol.md": "afe4803db04cae8d1a40d867fe1739a1dab717756672fc767ed4293f9d0ba2de", + "docs/plans/fluid-accuracy-composition/p1-material/qualification.md": "c69c8b5432b948f31b0fa3cab86753fed7d692e0a157f85c481d5406b78602a1", + "docs/plans/fluid-accuracy-composition/p1-material/results.md": "1bec063ad9691b3f5b2326ccb093452f677240cd53889185e61726e4dd713ae9", + "docs/plans/fluid-accuracy-composition/p1-material/review.md": "770416a04e5f797e5f70b0f82c11d0426d2885be85a4f84bdf084726ce561c5e", + "docs/plans/fluid-accuracy-composition/p1-material/route-decision.md": "d131ca40367c1f5a3e044aa645656e383d7a88f007efee63e304394640a59b72", + "docs/plans/fluid-accuracy-composition/p1/admission.md": "5d0f60d3dc39ec02db786fbe840c70008799d9c2a1407cb16f59535f069661bb", + "docs/plans/fluid-accuracy-composition/p1/execution-ledger.md": "77f845f63f544afb84a59e285043cfc691a77070468cc1cadf4b59e5dd3a0057", + "docs/plans/fluid-accuracy-composition/p1/issues.md": "23a1debc6a6896c5e4c8a7ebdad0da7e80463064ef82e8fc67223c0034076e7b", + "docs/plans/fluid-accuracy-composition/p1/manifest.json": "e40c7f8a5b569d8c228c58d7a3e6784b6f1945b99e6a2a8525d73facd8c87797", + "docs/plans/fluid-accuracy-composition/p1/protocol.md": "53ea889a1f64a2b34a007e658dc8a5d19f41bf90cdf03b30cdcaf0231ff105ee", + "docs/plans/fluid-accuracy-composition/p1/qualification.md": "78ed67c4efc564483c7ca52de2d97471046394e06edcdb99f5ec914cdd335104", + "docs/plans/fluid-accuracy-composition/p1/results.md": "bac605a228508a0d9abfde12326975a8e5bd8a93a3641e3cc7d65ff7c3349b40", + "docs/plans/fluid-accuracy-composition/p1/review.md": "fe45faebe6f3b50c7bb08fcba76b5d4cd85eb524d300816c8bb4fcb4109708aa", + "docs/plans/fluid-accuracy-composition/plan.md": "3648da756a575b32785b0d296ba3869a4b07559b744802296b985557d1e26e6b", + "docs/plans/fluid-accuracy-composition/proofs/AxiomAudit.lean": "34c181e188f90675f63a36007d62bb22d3b97f58dd51c4a42f112df1067ba96f", + "docs/plans/fluid-accuracy-composition/proofs/Publication.lean": "aa42e9da0517bf36b9cd8660511939f1f21f3669a9e998398a9995df830370f7", + "docs/plans/fluid-accuracy-composition/proofs/README.md": "49cc25b6a75a4ba7024b2fe82067528995c20e355fb5b9c2eb810dd52255eb62", + "docs/plans/fluid-accuracy-composition/proofs/StokesWork.lean": "25c7c92eb4df604276cc349da03cdc35c9d17069dbb9af7d023c0637aee24fa5", + "docs/plans/fluid-accuracy-composition/proofs/check.py": "48ca2f98bc19133af47356b1da2e3ef181f8761cbdce8075a0c40c066a224460", + "docs/plans/fluid-accuracy-composition/q1/admission.md": "dd0eccc7cc274a41abf0ce7496b1849ff62c4f9f1a1745bd671f95501f290c77", + "docs/plans/fluid-accuracy-composition/q1/analyze.py": "6af6b5b426139863522f311a869361f266f2ed222960486be89d343c64fa4a6b", + "docs/plans/fluid-accuracy-composition/q1/discovery.md": "95e4cebe40fbcb199f13444888e7a3308958fae6da23db888b80a3fc10e540ca", + "docs/plans/fluid-accuracy-composition/q1/manifest.json": "10e6be4bf5995e1ee18a3be5bc6ad565eb7a8b29090ab293976628f34e711430", + "docs/plans/fluid-accuracy-composition/q1/pre-run-review.md": "ce9ef555d15d761b783cdb9ae1136bd3be0cac75c8d086bdc8df17730998f310", + "docs/plans/fluid-accuracy-composition/q1/protocol.md": "87b2db262408910d140c869eeadaa92a2535df85c474c2803cf9ba77fcd87b50", + "docs/plans/fluid-accuracy-composition/q1/qualification.md": "534f991343a816f3e05c317bfb5188b02a42953d50ff480ec1dbc0a259ca5665", + "docs/plans/fluid-accuracy-composition/q1/results.md": "471298f44ed9a9e82af459ef59fe3bb39d54db7700d31d787f0a50a8aae8519b", + "docs/plans/fluid-accuracy-composition/q1/review.md": "f60cb0506ebb45aea2f2889e83511f2e08a36d48d27a6e43cfd711fc2a3dee51", + "docs/plans/fluid-accuracy-composition/q1/route-handoff.md": "3b2946a11580093de1d4b365060a679f3f84be4879b9316108ecf63f1d53cb50", + "docs/plans/fluid-accuracy-composition/q2/admission.md": "48edd1e83bf329cf18ed38231ba9d6b97dff8ca10bd7377743e887f980ef3bda", + "docs/plans/fluid-accuracy-composition/q2/analyze.py": "f41da58439fe5da8218c3be917476d101f0894268cf9629ef217d9e4b79367fd", + "docs/plans/fluid-accuracy-composition/q2/c1b1-interface-note.md": "cf2ee4fa5bcb6e8e301aa6daef25c65f97bdf03420ccdb726b7074e1bf2900fb", + "docs/plans/fluid-accuracy-composition/q2/issues.md": "4cd4e1e543e0e97c2eff177c6f57a55eaeedfb9517c38121fc5eee7baa8af447", + "docs/plans/fluid-accuracy-composition/q2/manifest.json": "129feda7b9728d3854b8b43fe57d446c97688ba6251e458e42a677af4dbcc4f9", + "docs/plans/fluid-accuracy-composition/q2/pre-run-review.md": "f5838a52c649a390c8eb11cb7b9cb29dd59fed0f2e5f4912a91a25a97e505ae4", + "docs/plans/fluid-accuracy-composition/q2/protocol-v1.md": "93d5bfd2d879baeed1e1aed7a522eb7f5136f12413edfa186f903a7e30f30346", + "docs/plans/fluid-accuracy-composition/q2/protocol.md": "ac07d8b38e9ed436641e71c9471eb76fd1b280127fa8f4b122e1244880e694e0", + "docs/plans/fluid-accuracy-composition/q2/qualification.md": "92a5c5d406a2639d5553f125ddb3bcc3f0c436f8a9adc32c6abf38daa1b3712f", + "docs/plans/fluid-accuracy-composition/q2/results.md": "25ccec642a757bbc494f7bd882a9b297a66e98943148bb827bf077b0c0d79c28", + "docs/plans/fluid-accuracy-composition/q2/review.md": "9e9a746577a758a5466ba427c719666c332c7447abc90eeaf16623232e5c35dc", + "docs/plans/fluid-accuracy-composition/q2/route-handoff.md": "1f48a670c650bd3154bfd71456630482d745f73ddfbb32b23d20a0cbe9dc306e", + "docs/plans/fluid-accuracy-composition/q2/version1-result.md": "1c5f4fefce0bfa9a667b5f8b4345741b5bdd7578e89d62beda9805428865d384", + "docs/plans/fluid-accuracy-composition/reports/architecture.md": "28695e2ed6ed49d9609e4d2d4dca5fdea1e7a4dee1e47ac6b65ca65d7cf71b7f", + "docs/plans/fluid-accuracy-composition/reports/c1-readiness.md": "f085b4334d600917f79b24e4a5f8ea866d2b35883f7965f258600b406187e9a9", + "docs/plans/fluid-accuracy-composition/reports/c1a-manifest.json": "064c2fbefbc19f226f155aea77cd58bf2883c973be249071c5f2cf992eee3f93", + "docs/plans/fluid-accuracy-composition/reports/c1a-protocol.md": "d101561280391aeafc945ce2fb7397a1b101da1942605096401cb6e7d49e1d8e", + "docs/plans/fluid-accuracy-composition/reports/c1a-qualification.md": "8bbf39b166e261c3610991011c7d59b187f1113227b89df1177f2982997ced0c", + "docs/plans/fluid-accuracy-composition/reports/c1a-review.md": "aa059e557e10ba84db53624dad08a691a84d69b2737acd7bc91945ceb082cbab", + "docs/plans/fluid-accuracy-composition/reports/c1b1-manifest.json": "1e1336651477391fbe7ef6ba6ab05225226fea82cb8781c62fc8d13d50f3997f", + "docs/plans/fluid-accuracy-composition/reports/c1b1-protocol.md": "2847dc9490824ee21f0959ba5a0ce5d2b374d599769653e301b18cbba1b7c26b", + "docs/plans/fluid-accuracy-composition/reports/c1b1-qualification.md": "6f61479758eae3b04e672c419c96007ee8ba2e2256baba99cafe16c8f3ab8387", + "docs/plans/fluid-accuracy-composition/reports/c1b1-review.md": "50212c8725caaeb215329040c93a41bc44d9e414bb8edce8e001268b31a17a26", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.json": "51196f9321e5de4f20298a21acb7edb038485ea5da0e9c4592eac3a88ce2a54f", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/final-admission-review.md": "1b397ce3117a434782c1f432f2a92df74d12ee53187cf4cfe32c33532976058b", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/later-owner-status-review/review.json": "51874b1cc65a070e27e56db0cbc864460a186b28571591b2e7a3f216c8db2287", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/later-owner-status-review/review.md": "9ea9ee2919ff0d9bc31d6423a26c3897b526467cf25ad3f595a928ad2f332de0", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/protocol.md": "212456439c1f52bd340d85b27d52f176efd126d2bd81f8c5fbd82a665d0d55d1", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.json": "e69a689a2fb30ad3dcdd237cc8c3d34edd5161796b41d5d76c7adec3eaeabf58", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification-186dc0a-review.md": "41c0cd342a9a8e6a5d47708354c17eeec9d20b378db2ae4c92ebe937d9b46deb", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.json": "26720302347683f19614ceba4ad3af2a033e7b7ac864b6d14a43080c3e6acae9", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/qualification.md": "f6a8032808693936504bcb2818835754261a2f3293c6beca9d42e6fb1b988347", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/result-document-review/review.json": "d73fb2b4533e716a1d007c9a01e36d8e935cabd68f3097f8c2c47719277b74fd", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/result-document-review/review.md": "b2a4a7b838b91d43e3bcbfc7e01ccbf56affd61bb946658e1b80c26bcdfc7d65", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.json": "59b5d1e63c82386320cc1b45a7ee6b383fa6ae51d5ba50ddfd805552ac1ad867", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/g1-cancel-followup.md": "0cf3d8106faac94f4fb280f254afe9aaac3beecd39216a807ba2500e097f7823", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.json": "aa789ea2b34a51fc38292f15c8cc3147d2a3e6ec2ed952c0130031e7f2908f21", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/readiness-review.md": "ecc88ca5532256e4c49ad1d5ba7c55558550f72fb2c2474154cbe493423880d6", + "docs/plans/fluid-accuracy-composition/reports/c1b2-admission-20261020/source-review/source-map-review-input.json": "46ecf09aa2b44f444fb03e15b5ec429bd4a2b63f82e9af9de749c538bf1100e2", + "docs/plans/fluid-accuracy-composition/reports/c1b2-manifest.json": "e9cd9c506b18b0dc2369bdbc57272c467753d162fe887a7f584473a188bf3b59", + "docs/plans/fluid-accuracy-composition/reports/c1b2-protocol.md": "d869f1dbd91be9959eea80c21c296569832039a6b4030e42aa4e8fe984545222", + "docs/plans/fluid-accuracy-composition/reports/c1b2-qualification.md": "0ef398ed536233c772d34976b7eb7ca977fcf7817cc7d7b3777e58f3a73aa8a9", + "docs/plans/fluid-accuracy-composition/reports/c1b2-review.md": "62fab7615d0e032cbca0a323f0662b186bbca69e164eea226444d917ecbcfd9e", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.json": "c55e52878f4f357494e75609f5055b8e94063b3d5b7ef6fa027a17d7bfbc5643", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/final-admission-review.md": "8101644a9391537be9ce18fc7b8b8af1c400ebec5de8bc1b4be7ee09b63df3e9", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/protocol.md": "1a0191d997fceb54002f647996c609a46387e003dd524c12090a8faeef74c16c", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.json": "5b8e13f7e6f584afa38d6fbaf5a396d0d11c23ac4cfe99cdd60a46df9b289738", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification-3b3b667-review.md": "ca9380253f27cd236796889383795a8e33cc63b443b480681a6b0b8ccd282463", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.json": "68393fd154282259d79e42923088bf5354f795fca36a4f888b7954c40082aa2a", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/qualification.md": "ee5ecf9c83d71e2d055dd4c5098b35eb0e5a07a4f95c1b3e50c8452f09f25286", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/result-document-review/result-document-review.json": "2f8b051394a1c8788767511c5b3a3402406c1241994572d2d73b24971ec1ee30", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/result-document-review/result-document-review.md": "20115108b0a919153fe0a5edfaf9f1b8f0b5650ba227f2838c68889a0eb06b43", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.json": "6463884e5a2ed9fd079ea72d77d5790dba951efcb08f495330ba0bfcf997b3ab", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/readiness-review.md": "989a54f511e7b9ba69d33bcfbfaa76b93d348c5c3bbff6ee7ab31bed2ae1c7ea", + "docs/plans/fluid-accuracy-composition/reports/c1b3-admission-20261020/source-review/source-map-review-input.json": "7fa2845366100c768049a482f33d496b2f19c25c4ceed50691cb5ccdbfd9fa2d", + "docs/plans/fluid-accuracy-composition/reports/c1b3-manifest.json": "d87ec1488a8fb1f1b00e469d8b348207a2fb11dc57d833bfd04e2ed080dfe7f4", + "docs/plans/fluid-accuracy-composition/reports/c1b3-protocol.md": "02c29af1a7ba5b8f18f1414422fdf696f8d022b9b912376ee620fa4bca3c30c6", + "docs/plans/fluid-accuracy-composition/reports/c1b3-qualification.md": "4c8ee0a4c2e1b4e36444cf8fa3872afbfe2ba17addde8ffc339d1b595000aba1", + "docs/plans/fluid-accuracy-composition/reports/c1b3-review.md": "7b434a1272dd7ec953bdbacc6b3c4176e71ebe3e4118564436b9e7a3428b885e", + "docs/plans/fluid-accuracy-composition/reports/cv3a-admission.md": "8d2a8393c8af2dd3f7489f2c29076da3050c4616543d549fd88b8d1fd4cb8208", + "docs/plans/fluid-accuracy-composition/reports/cv3a-review/audit.json": "e73f75d1c47686d3a04bfe4ec99fade647dcc22b43159654553c231b0b8005a9", + "docs/plans/fluid-accuracy-composition/reports/cv3a-review/recommendation.md": "d54d52efd222b9defc7a37ec2efb43daaef7f31c7ff97c607c6d267e9187f69a", + "docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.json": "bae035dd892066fb6cfcc580d75a6cfe07c797b9fa007a092b18d4bf4ed1a38c", + "docs/plans/fluid-accuracy-composition/reports/cv3a-review/review.md": "2161bb6e08fd24dcd6e328b78d1842aca07a64709c2537951522e22812d097ee", + "docs/plans/fluid-accuracy-composition/reports/g1-admission-iteration-protocol.md": "dc7c0377c546d1138fd12f59e640137fefb28afce00f2223395a35fa9b97f648", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-manifest.json": "700f9eff47e2d0fb5357332b8f0c557c074db386b029c5741635e0230876b38b", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-next-readiness.md": "e837ebd329d55a5ddc4af02a3b9f0b3483a7db950c7306ed1a8beea391d09ab0", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-protocol.md": "720dae43fbcbd6d80f972383bfc901988e5c6b1fdd319a62346a91eef3d78536", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-qualification.md": "ca1ba75282fefd663bf978d64473fb1b07b53310043d77679ba9de31ac45894b", + "docs/plans/fluid-accuracy-composition/reports/g1-advection-cancel-review.md": "403425b8de477b2eb078eb709e2e5a306d7797a875e511bb74a50665dbd65f8c", + "docs/plans/fluid-accuracy-composition/reports/g1-contract.md": "88b037868a1256ae93d773d580cdd455b18daff0a673d964153e3d22284c9719", + "docs/plans/fluid-accuracy-composition/reports/g1-iteration-manifest.json": "b58dbeb2c4da9cf84833c793b7c63c97bccc02fbb8de25aa022c7223d778489f", + "docs/plans/fluid-accuracy-composition/reports/g1-iteration-qualification.md": "d9c13dd114dccfeb9ef6d7dbdb9e90b6e6b34946f56f40bb2d2e1fdc9c2552d9", + "docs/plans/fluid-accuracy-composition/reports/g1-iteration-review.md": "f110395be682167d75fac7bde8735d721c455f445aae21d8362b7241320959e0", + "docs/plans/fluid-accuracy-composition/reports/g1-manifest.json": "67ad6bcc6e33ec18b0c450906668958b59e534bcc1c5e9c4cf3cd21d9cfe9bfa", + "docs/plans/fluid-accuracy-composition/reports/g1-protocol.md": "ebc1547aa85ef7000872ef7ad4da0907918252b450e60496d31eb729a8c6d442", + "docs/plans/fluid-accuracy-composition/reports/g1-qualification.md": "b4507bacfb71de8971dc1e03a70f994f968da8b0af140424d54cb3ecad3aa3d5", + "docs/plans/fluid-accuracy-composition/reports/g1-review.md": "2beb35403fb97f3149a169c6870bd42d947603c5498a534d057fde0a8ab80797", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md": "1fe3a8664d028135552340478b1c91d19a1219eb4b52b3a1c3a0f5e92cb32a33", + "docs/plans/fluid-accuracy-composition/reports/mathematics.md": "8bfae2ab5ad80553b2e8243ce597e0ec77dce87fe0833d7ce02cb2e6807e8aff", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/final-metadata-review.json": "0d66e1f0279c0bbd664ab94d3f58f15282581674e71c5d5acd0ab4a64ac80ce4", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/final-metadata-review.md": "95342d50ea2bc1ec79e85f8f752f6832e4e6911ab32b9efd52c9c17f0107a0dd", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.json": "6d077af79ed944b6530bc8ebad0ca9aae938c2ef1881e29f09ecd8ded2e42dd5", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md": "525fbb4d62e7e9f5c9026d96b59f8b563deabb65ca7b3a2af1b6f058b3d54da0", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json": "9575a47fc5de49e23b56c7dd0a012716a775c15c07a27cbc785d6c2da2676b1a", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md": "d39582d2b8fd3720b0b8133c55703270312e1f13d45e05db3704afc0a0c5f91a", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification-9c04278-review.json": "d357cb15c0a57b769b9c643c691067a4e88086db8fbb411a535d314df0faf297", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification-9c04278-review.md": "623e52d00e118c88f00542f6f462b5d79bd4cd031ab2d956710918c5b7485a6b", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification.json": "dc028788768c8a2035e85ce1f956d185fdd699ff7657ba2d757213c995369939", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/qualification.md": "7f42cde613db7c44be0d6dc77d8820d523b9f87a480c4642334a406f54fe87ee", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.json": "5d8b7dfc68badb47fd81831b20ec3df6398bd9d8b37448f76f832dc58f8bdd9d", + "docs/plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md": "8b5deedb9f54700bda6efd0f75f6a08784e300d1d96892cc048391fea0548961", + "docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/protocol.md": "bce8489f4890076bc4ec4534f809a88972ce82bb31cb43aa67d6b04477fb68ec", + "docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/final-admission-review.md": "78b765571b39351fd648338addfd5a342c91151bfa6e5ba82ea212f0f0d3077b", + "docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/per-path-review.md": "4b3800ed639476d981f0aca141c7fa8d2b59a777c6c4bbb6f4c1620e12ab144f", + "docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/protocol-review.md": "f3c87a4bb37a1d2c18f0bbe91e1f7cb1130fa780e1d90bef17b71f523aa415ab", + "docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/review.md": "b032360be6ad68736cc5aa91a95a124b60913c1489fef911a5ae9a35637f90e7", + "docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source-map.json": "ae828885a18fbf5c986b73d65353197a85194f7496337080e88e6198e5558421", + "docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source.sha256": "a35485c155d472ac5bc2b6287c645cd05d9821b28792d45bddcbe8e258e08bc1", + "docs/plans/fluid-accuracy-composition/reports/qualification.md": "d382aa2a6efc15ef0421e93c09265f9458caf3c484b09b64a098105aa7201eef", + "docs/plans/fluid-accuracy-composition/reports/reviews.md": "3eb980aa2a3aacff44e712338bd4127f505d73b4f239be80930bf27e7ad95d6a", + "docs/plans/fluid-accuracy-composition/reports/verification.md": "f3f006caed0d48f41c17b58ce3da47e0c34375693b86dd727f6a190d8d6ca7fb", + "docs/plans/fluid-accuracy-composition/reports/workflow-preview.html": "b729ea0da75cbde9a322a0760fb962347b561d0cd6dced4d279ce3a13818ebfe", + "docs/plans/fluid-portals-open-boundaries/execution-ledger.md": "684a38c6cfa03a886aee7125c4eec6848b99014d03a91e25428b3f50858cc41f", + "docs/plans/fluid-portals-open-boundaries/issues.md": "c02c61817b0f0947e412a4530b19d74921f93c306e38b6a126b5bf00fbf4915c", + "docs/plans/fluid-portals-open-boundaries/plan.md": "02a680e901ebd9f058432b20e45d8402d5713f2bc9022ed69b63e6387c0a43df", + "docs/plans/fluid-portals-open-boundaries/reports/independent-review.md": "099be52975e6d7e9887495ffbbd7a8e8a86ac00767569117def68cebb0d5d5b3", + "docs/plans/fluid-portals-open-boundaries/reports/standards-and-design.md": "c30deb44fe51553259a65e3c47d1ac807c41c77be5b6a90f8eaad6f207d539cd", + "docs/plans/fluid-portals-open-boundaries/reports/verification.md": "f59cd2dde9fdbbcb72537dc19d8e376a5546c1ccb6716e4b0f932372589f953d", + "docs/plans/force-authoring/contract.md": "f16ab84e754f5771202d15bed87ade263589563ad726ae19c5bc8e98bef8dc88", + "docs/plans/force-authoring/custody.md": "66063415d544b4e6041c0bab37c599d1ca3cc6f44a7a94141078fc40cc82c54a", + "docs/plans/force-authoring/evidence/.gitattributes": "cb9bbdba753283f7ac7b74ac7c51ba49d38e141bc0e0d0ba4621e475b5bc63b3", + "docs/plans/force-authoring/evidence/custody-source.sha256": "d873dd98d5d59d1f1aac2221cb5f1f30ae574bd6dff91c95d95d82a0c927a9ca", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapter_tests-build-features.json": "d98cacdcab91372e7102e3462631d1e163f466f8059a10d15d6b358f6ac8cc7b", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/authored_mac_cancellation_retains_accepted_state_and_retry.json": "3c20f46a6099cc13df03ad6841f200d05a5dd5b617adcb7572079d49a5403ce7", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/authored_mac_cancellation_retains_accepted_state_and_retry.log": "afacaf787c62bce2c0b3d899cc8f6a8cc90603b6061a8d09ae43f3f6f62967ba", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/authored_mac_matches_legacy_bounded_directional_force.json": "25d73fae59f7ff0602be65d7b991c54165fd7e0a7de00c49a9ca50d72cd0ee4e", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/authored_mac_matches_legacy_bounded_directional_force.log": "88f61a43755daae4b113baff6e001c8a7ed5c0fcc35238104adae17d5775ae05", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/authored_particle_cancel_retains_state_and_retry.json": "a1065cd11ff489d6aa043582d2009ab7ab5adf088d4793092c7ae3a954acd011", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/authored_particle_cancel_retains_state_and_retry.log": "ce53f41065888d0e29d6c41412f7a969b7f3f0f6ed8ec8c1e1007ada3c53b8c8", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/authored_particle_density_conversion_adds_to_existing_acceleration.json": "13d5993a24018ca50bac2ac2cfeef766e5cc961514b56e56361f09f4fccc4bea", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/authored_particle_density_conversion_adds_to_existing_acceleration.log": "233b50b8d9be352930ae7bb3cb8c3a38b27951468dbf5d2114d5f087ebd7d26e", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/empty_snapshot_preserves_both_legacy_paths.json": "01bfa620f491a0980cc36b5ff9bb4801ea38e465d889739ee711141763d8947d", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/empty_snapshot_preserves_both_legacy_paths.log": "31b9cdd2dd7435206b3c379717e23d5ad99b3c269bc53ea182b19ea0181be917", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/enumeration.json": "d2b5315153badd44c4f07ffd915e683ad0a3c5ac7547e2e920ef7a4ac0d4b3dc", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/enumeration.log": "95c1ecca9477fc2f362c688db8122e321d78f516dcbb7bf222f6af6a1da26964", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/adapters/run_bounded.py": "d0f2ecdb3199a6f38f16745322ef167d8957e89e61d44949e366af0fbbc35c87", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/binary-seals.sha256": "5a1e52cc9d254e6f7d5885d0c851f6b4d0058db1d84882260568c7d7b65bcdbc", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/recording_tests-build-features.json": "849998965587cea56abe53c7ef708b4689fc0bfaf83d0e7b6db5c300634fc7a1", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/recordings/carrier_force_archive_round_trip_and_failed_attempt_invalidation.json": "e0c896c83724d814e7eed244e20ce9d261ad7e7acdeec74ad327ffe14cea0a7e", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/recordings/carrier_force_archive_round_trip_and_failed_attempt_invalidation.log": "6ca285401870fd486829d2944e68c0b1006ebcb0abd49224f8b731acb0692bde", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/recordings/enumeration.json": "1c5618626d1609e03e38a0e4a0167ac631a4de8e30ee00f4ade84ace1ecbe2ed", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/recordings/enumeration.log": "6f93a64aa09ed72267da9a802da363485d0cf4072182133304003b2c811f89c2", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/recordings/particle_force_archive_round_trip_and_rejected_control_custody.json": "f718883ea0fab4b0fe7429fb16044b2cdc5dcf24aa98740f43c5c49fc987067e", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/recordings/particle_force_archive_round_trip_and_rejected_control_custody.log": "f32aa9002de05a1d169d6c8e4a7975df43303f2c70710e7566c7159e0a0212d3", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/recordings/run_bounded.py": "2a6ba63667100cc69ea15c267d1cbad660690c2e5effd048999675576f04304f", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/source-head.txt": "e330a236dd6743d120298e89dfc2966b9dfb74a63357ce72b673f6539de178be", + "docs/plans/force-authoring/evidence/post-custody-7970a5d/source.sha256": "26cce65fa43bab619cd0951dbc523945c37fd0bc955c06b3451448ca82cc5277", + "docs/plans/force-authoring/evidence/pre-custody-adapters/authored_mac_cancellation_retains_accepted_state_and_retry.json": "ce2fc260c52a771dbbbeec529f72842980031f3d9848b2689016b5e74e0e35e6", + "docs/plans/force-authoring/evidence/pre-custody-adapters/authored_mac_cancellation_retains_accepted_state_and_retry.log": "afacaf787c62bce2c0b3d899cc8f6a8cc90603b6061a8d09ae43f3f6f62967ba", + "docs/plans/force-authoring/evidence/pre-custody-adapters/authored_mac_matches_legacy_bounded_directional_force.json": "b883fbe3c5e859df1068b608388191077344c2f89df0a41726163ae0749dd9c3", + "docs/plans/force-authoring/evidence/pre-custody-adapters/authored_mac_matches_legacy_bounded_directional_force.log": "88f61a43755daae4b113baff6e001c8a7ed5c0fcc35238104adae17d5775ae05", + "docs/plans/force-authoring/evidence/pre-custody-adapters/authored_particle_cancel_retains_state_and_retry.json": "76bed06d6a10bd16a6f3d8ade3b248404ad921a064f4e1536d563889b4d7a609", + "docs/plans/force-authoring/evidence/pre-custody-adapters/authored_particle_cancel_retains_state_and_retry.log": "b4e51b96b649205def3c0fd7311c3c5bc89aaf6252812eb1b44f86ab9f873c7b", + "docs/plans/force-authoring/evidence/pre-custody-adapters/authored_particle_density_conversion_adds_to_existing_acceleration.json": "07779ee43767c6c3c616c1a7961ee75e5f511daf3c0ae5907fae59970b497d87", + "docs/plans/force-authoring/evidence/pre-custody-adapters/authored_particle_density_conversion_adds_to_existing_acceleration.log": "233b50b8d9be352930ae7bb3cb8c3a38b27951468dbf5d2114d5f087ebd7d26e", + "docs/plans/force-authoring/evidence/pre-custody-adapters/build-features.json": "d98cacdcab91372e7102e3462631d1e163f466f8059a10d15d6b358f6ac8cc7b", + "docs/plans/force-authoring/evidence/pre-custody-adapters/empty_snapshot_preserves_both_legacy_paths.json": "0d0c327058fd88e5d754e110a95f2acf5671b3564e5b3bf86ea9e1cd4380609b", + "docs/plans/force-authoring/evidence/pre-custody-adapters/empty_snapshot_preserves_both_legacy_paths.log": "31b9cdd2dd7435206b3c379717e23d5ad99b3c269bc53ea182b19ea0181be917", + "docs/plans/force-authoring/evidence/pre-custody-adapters/enumeration.json": "6a4e9e396daaf5386cbe4e63625d1ac1b7c13fa6e2e1aa1a29692d2bb4592dd6", + "docs/plans/force-authoring/evidence/pre-custody-adapters/enumeration.log": "95c1ecca9477fc2f362c688db8122e321d78f516dcbb7bf222f6af6a1da26964", + "docs/plans/force-authoring/evidence/pre-custody-adapters/run_bounded.py": "bf0c3b3faa013b2a0bbb536b67e1bfdac3e98012ca0d8774f27dec7e81ac0b9e", + "docs/plans/force-authoring/evidence/pre-custody-adapters/seal.sha256": "648cc59bdd839ab878295611a6da4766c093020f38e870457698ed33a3fcbb12", + "docs/plans/force-authoring/evidence/pre-custody-adapters/source.sha256": "29179208bf0def784bf22404d0cef6f8333e2481f5727a424cd372ba24d530d8", + "docs/plans/force-authoring/evidence/rheon-custody-pure.log": "9a50d8d94366eeb42701beb58d289c62ef29c83c760ca8676a39034186256e31", + "docs/plans/force-authoring/evidence/rheon-custody-pure.sh": "8a936922d87b2d584cfc87537a97d588cb5d56ef1dc346ba3a56e471bdca0954", + "docs/plans/force-authoring/recording-integration-plan.md": "90da14985853c4395d87ab4319eef4cddd019bd51e73403b6260242dbdd969f2", + "docs/plans/force-authoring/validation.md": "580ed27f5166cf18a07a4eed1ad5d4035f71d0ec303fd761ce0a4e12af44ca31", + "docs/plans/lagrangian-fem-book/execution-ledger.md": "23174e0142e8c06bc81466c00b3fa7bceb42ddc3e7cc1a4d67142b0b0d3647de", + "docs/plans/lagrangian-fem-book/issues.md": "5ee38ffb8fbf38669b14a2ce541b4822681beede4286f400bf4f83bfbc9e86f2", + "docs/plans/lagrangian-fem-book/plan.md": "e70e90989977f9ec01a7d3ad1fae9b77f44dcd75d5794b6bc0739449b90a0f0f", + "docs/plans/lagrangian-fem-book/reports/independent-review.md": "0f1ad4538acb1f458c16ef7a9e6b17010cc8284df596fafe3fd894d7b7c28ab4", + "docs/plans/lagrangian-fem-book/reports/publication-review.md": "7bd23a0bc375bbb93c0b4530903982c6c9ef93a84da94b316dd2a1b2361941cb", + "docs/plans/lagrangian-fem-book/reports/verification.md": "effda56e13264b445e261b6607ce04ab4b401f56c3eeff9a01ff28c1a8263152", + "docs/plans/moving-plate-coupling/execution-ledger.md": "152e8c0d8623ca390c10d851fcc46baf405717f227e4f938fe734cf2b4e9ef00", + "docs/plans/moving-plate-coupling/issues.md": "40b17cd74c93346faae035161bc8abd7dc4071ec2c42bee8f9e00e2e95348ca4", + "docs/plans/moving-plate-coupling/plan.md": "a3a9319f2ca27adad9954239730ff13e2de637f8d96c73a93e2de4b9121fec03", + "docs/plans/moving-plate-coupling/reports/contract.md": "10fc58e0cb01a081106652029e014d197c8115d89cd5f02f6e7e6ea1c6e6b202", + "docs/plans/public-simulation-api/execution-ledger.md": "f055694d0d21247d001b23d8e840d84bc63b158691f4afb304cacfc1e0126920", + "docs/plans/public-simulation-api/issues.md": "dd548de48da5b876d202d42b00acaec697e115aafd700c0a2d5376333d0d089a", + "docs/plans/public-simulation-api/plan.md": "d194c3bca5face73f78c543a41659f81445f7b387afe187c758c69f6d5c0502e", + "docs/plans/public-simulation-api/reports/design.md": "2def202c913ecf916c8fcf8d9824a0af50c59a2dee93329bbdbdb732b19ced0b", + "docs/plans/public-simulation-api/reports/full-step-provider-integration.md": "61e2bbd2a92257cef362ec38ce9f457592c31a7f8e4c51635e31bb03134a0291", + "docs/plans/public-simulation-api/reports/moving-plate-integration.md": "7d1307f2a6ff9c57b6c5c1b4f344a5b5bc6bff10be0a94bfbd27aa8319eb604b", + "docs/plans/recorded-carrier-inspection/execution-ledger.md": "6fa5bb4b41a6be5bb2c1fd905f8e0611bac3a55f8c77ec4beac75d1ef47f88e6", + "docs/plans/recorded-carrier-inspection/issues.md": "a34f8f9d4badb4d78e5302ee32c2436119775fe0ce10873a89c30a8b9aeacc87", + "docs/plans/recorded-carrier-inspection/plan.md": "a0984fb324e8a266161ee3c76475679641abebecf124eab36f45ee368115352d", + "docs/plans/recorded-carrier-inspection/reports/storage-decision.md": "488786e15e59e2c34dbe9e13f4f5f91a879b703dc4b73686767addd8e881b0df", + "docs/plans/recorded-carrier-inspection/reports/verification.md": "3d64a88f7b458958917f61269027d72b907e9e5d4ea0e6f1c38536fa9baa370a", + "docs/plans/recording-compressible-integration/execution-ledger.md": "14db39a3c11b8fc650e3740cc928b276138660e1dd8d7d4a01c206989cf1901d", + "docs/plans/recording-compressible-integration/issues.md": "45a8e6f2775f408c588d30d6d3d83d1802d54ca647dcf19a2190a994d206d8d9", + "docs/plans/recording-compressible-integration/plan.md": "f12302ac291f0e58964679bd4b922d7b525b4222bb09fa5dc2b376920ba7139c", + "docs/plans/recording-compressible-integration/reports/dependency-licenses.json": "d0f330f0d30e3bbcf16f4f90e3452a8b19d2e19e912aa801179bbad074d5257f", + "docs/plans/recording-compressible-integration/reports/native-display.md": "29d2ffc44358e8d3374a49e797359e47e1be3562935c3322e6f455bbbe26458e", + "docs/plans/recording-compressible-integration/reports/verification.md": "4dffac4c1da0380cbc075403d83a467b2e85546c626d9bbfcea6d55cc64d7811", + "docs/plans/static-collision-mesh/execution-ledger.md": "7ecc057ce92a02b5b2139e68f790da1361355ac32c0e36ee4143e9b32c297ec0", + "docs/plans/static-collision-mesh/issues.md": "40dc769bd546c2aea28e13254a39f119a1e8fd2ef398afb69a3b4760023114a4", + "docs/plans/static-collision-mesh/plan.md": "005c5a5398e4decc2cd119bad6bedaae716a534626f3a2f18df300aa15b251e2", + "docs/plans/static-collision-mesh/reports/verification.md": "2827ce29e7654a0a4089987c383c08e5ce6741f94119d5d8219480e43d833147", + "docs/plans/submarine-incompressible-cpu/execution-ledger.md": "5a869a3f674027ce67124afaa20624c9710eee0fbe71be3c9b241ad3b3ebc5aa", + "docs/plans/submarine-incompressible-cpu/issues.md": "40d82bb0ad7cf01ad24320e66fe41a6a4a3ada356bdc6ad8e4b5f31fad18bc66", + "docs/plans/submarine-incompressible-cpu/plan.md": "1640ff94514d92dd20d59dceb6124c93dfa131712265a07ed331d7bf128f8556", + "docs/plans/submarine-incompressible-cpu/reports/api-gap-audit.md": "a90427a399242dbaadf5a16275ef933ed9609dfc086074d7c92ee53dfa6b433d", + "docs/plans/submarine-incompressible-cpu/reports/first-slice.md": "9233fd3c9bae5aaac9b1cb714cd99bc1abf0119054304ca38bdf02a61b1c676d", + "docs/plans/submarine-incompressible-cpu/reports/i1-admission-review.md": "410c605254947a98a8888fe80c990f14f99fa773b7c9e80ba22e9a5adeeb1778", + "docs/plans/submarine-incompressible-cpu/reports/i1-implementation.md": "8e2078514713fd6a33f2eb2e3e217cc6b46dd2515c0b87e4582d25efcd30832f", + "docs/plans/submarine-incompressible-cpu/reports/i1-validation.md": "5bad40bb84d438e94c808d3a454703b354b05dd12d47639a0837d72fde4fb5d6", + "docs/plans/submarine-incompressible-cpu/reports/independent-review.md": "aeb629abf1f18d33dcb39fcc9e9fdabf6ecf1ecbd683676e627047888a5ba5fc", + "docs/plans/submarine-incompressible-cpu/reports/n3-directional.md": "54d02f07392672b77249a97564ee61b4acf14d0ea285e12884e50e5a5adbc48b", + "docs/plans/submarine-incompressible-cpu/reports/standards-and-design.md": "447549e56c45a41b0aa838ceee90440b0f4e397ad6e926faa7791a11493045a9", + "docs/plans/submarine-incompressible-cpu/reports/storage-contracts.md": "ded7ad5ac6a14602f599952e32bf6af00d99ef820ee18a90b3b1d08b8305afec", + "docs/plans/submarine-incompressible-cpu/reports/validation-design.md": "94b2a41405b2206f9da7ce21f30a220b338fe640619a8471ce2b925c7ce9b9a5", + "docs/plans/thermodynamics-book/execution-ledger.md": "06f62d9198846a67132336092feb8bdf76e5c2d644beb053ee6bd017682075d4", + "docs/plans/thermodynamics-book/issues.md": "d80e03b637d009fd363828d349d9b538ace4c87f5dfedab19e67d16cdcf2ce11", + "docs/plans/thermodynamics-book/plan.md": "3764d640d7f227df70a6ba711027a84904547491e3ead4fa8edbb279bc49e68b", + "docs/plans/thermodynamics-book/reports/independent-review.md": "b6bfc1934468207d36146d5e85a174e1a8af86f4b653bfc789493fcaac0c7db1", + "docs/plans/thermodynamics-book/reports/verification.md": "e068145f6edafa3317a6c28701ee919d95b3226bb9c4248a51e84dbeb45d2113", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/manifest.json": "5b389803b2287779aee5b6ec1a3e31821239edbe52af23bb9bb33ea749cdd674", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/rheon-ui-ci-book-9099b15-annotations.json": "25c4e1d7a31d8d8aee5d04183eb81b897e342e82b3c59ed5b64b3991ec54f2f2", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/rheon-ui-ci-current-jobs.json": "8af77b3671e77847358404b9561b222b3f0d6018f1643ec6042b883d6ddddf1f", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/rheon-ui-ci-desktop-1b37774-annotations.json": "cdc77942d715d2463df966c3a5e38716c68af18cb9579f498f788ffddd4d6e23", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/rheon-ui-ci-inventory-diagnosis.json": "4bb9dc5e05926f90ba1fce3b4ae826bfa6e83d01c965c14655c5eda7852649f1", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/rheon-ui-ci-item-order-clippy-tests.log": "b483aab364793644787ac9d4a26b0f9eba24c3c16592f68e6d0e5925f7d9ee80", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/rheon-ui-ci-item-order-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/rheon-ui-ci-local-admission.log": "dc3454e148e2b9908b5c35158a4b0db5fbee703d55e815f331f089a0e9f091e5", + "docs/plans/ui-refinement/evidence/ci-item-order-20261021/rheon-ui-ci-local-tests-clippy.log": "6bceabdd4d7a6bd58502e964a36f309c181cc00ebc9797492b6d90d04870a3c3", + "docs/plans/ui-refinement/evidence/force-custody-20261021/.gitattributes": "7c6403544137c8fd4917e461a14e79f627886dc39859f1b8fe66906fb8e10014", + "docs/plans/ui-refinement/evidence/force-custody-20261021/manifest.json": "b73005e773cc7c15eb820509104cf3025c7aa2b565169cefc58cc2b774bc1906", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-build1.log": "152118fd1ff777f1c5ea72c5402b3890bc162df01756d1668707a8d525004109", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-check1.log": "57070a858fc15ba2b08995197d0d0e0220f0b800e669c9185b67f3be8b3e2d20", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-check2.log": "c1193412969bf54fc1ffa2f4e46bbf933cafff6d96ed6d6e2b97ef4d4e80c06d", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-check3.log": "3a80f27070236bb0efdf91e3f9f896ff9f515cf026e348610f26e1124ada4a75", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-clippy1.log": "6705a8f70c099ae688d5ee40b888d9e7e43dcda0ff8534a02e06f4a40b126f9a", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-diff1.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-exact1.log": "a06355331dcc77cbdcae6f6da355305ad9861c1dabd62ed0e99448fdb8b6fc69", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-exact2.log": "ba2351a20f74c4cd6bce9446597b7428e8c8e30b489a98ac413239360b633e66", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-exact3.log": "f11fc3eb73e76cf36dbd3c4864465342e1eab385fc1b740d63ddb6c0e5acb265", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-exact4.log": "9b3bc10f5f4e74c0db2a9061ded6552aa8039fb471a985dfb0e72f7dd2fcbccd", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-exact5.log": "827d142c855962ca42c717d180e5d64ca2229b67bf237a28f0fa80fa7b6e2577", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-exact6.log": "519ab2d32c9056783d81ade6cf87b17abd456f47d113d24497abac15dea923ba", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-exact7.log": "5081b4085c8ccfcbc7200bcda773bac25da864f27d2bbeea8e9ee065a66d8367", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-fmt1.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-list1.log": "dd356787f3f1ef6d8cbc74f00293a5fc6fe7a6ae14da5584b67dc20a51b05d3f", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-list2.log": "47b2090db593ec256a1697d37cdc184f9c7cada4c4b9cf8b88c52e9aacafef89", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-list3.log": "82d060948c2234125eee8ae63135c03e3872169aed2f2d46ab02f201901730fd", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-list4.log": "23adbcb420f4dea3b1dc890e7580d9189c6b07dcdc0c38c92435b304ea57d87b", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-plan1.log": "9430eecf97daf0303c2a715878bb41924c41c96eed26b07e21ee0ea44b38dd40", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-plan2.log": "0e551a02a144eae088f3a9130613de9428d602f6f8099cdc7dc7760c4557d9cb", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-regression1.log": "79bcfcb64cf46aefd737b81c3e4270bac322280e688bf718089a07f1004f9293", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-regression2.log": "6b5ca967674c46e623e42781070e0a530b07045122f544623c6fe13af8c9c715", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-regression3.log": "04a5e6db91b7e1f837aad752cba288aca98588c3562680e20ab1821aa9658ec1", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-regression4.log": "e2e0e3c8881b4c353e6bbd39ce453b74f9a8468439017c4cf741fde05f6ecb5e", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-regression5.log": "fccb202e93ab3ff32ecfdb38f9e79047967925fb63885b2b1d5cf214484b406a", + "docs/plans/ui-refinement/evidence/force-custody-20261021/rheon-ui-t5-regression6.log": "463dfe536be01b791969d934dc2b332de4b59d3fc0f3c35b5f5f4590d2b35dca", + "docs/plans/ui-refinement/evidence/force-handles-20261020/.gitattributes": "b4b62d881a4e1535ca0cf2267f5778d2f5742259ba1eb72bb4e4998f1578a4e8", + "docs/plans/ui-refinement/evidence/force-handles-20261020/manifest.json": "ca49f7b8eee55b8ba2e5ecf5745c6f6ad8d763e6893860934254c3a207ccd261", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-check.log": "d3cc552084ac0ffa10df1bc473ea1a7e6c8c97712b638b35e456f494405ad28a", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-clippy.log": "5e64f21eb14f3450713cc83e0b229228137d11d114ca0a469ac5a7183bf89b4c", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-diff.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-list.log": "96666448e86eded2bb540f17e5ad0d8b4841d6ad46f4f1a1968eac2b7979bbe5", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_handles-tests-handles_cancellation_context_focus_pointer_and_camera_loss_never_hands_off.log": "8024fc20505da490b4fddcd579a879872fc41aa80ebf3c9885adff676d55f874", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_handles-tests-handles_geometry_ray_translation_units_and_nonidentity_local_rotation.log": "b0f3d01d5eaf82d675b0109f27cc1ae08578e767a829f57e2acc87e0041779d4", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_handles-tests-handles_named_controls_fit_narrow_without_touching_authoring_values.log": "ba7fe7cb11a96336cef34817947e4c176f603c016c1e473825543d7012583f62", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_handles-tests-handles_pointer_invalid_support_release_restores_base_and_snapshot.log": "bc52281d5767abbfbbb314a1f7015bb44445f0e045fba847dbcc8f666ec88542", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_handles-tests-handles_pointer_release_commits_once_and_escape_consumes_until_release.log": "1929082402ea0627894ad61ef6a36fe8856ca77f7b70dfe5c7f9aa79ca8b8da0", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_handles-tests-handles_transaction_invalid_final_position_never_commits_stale_preview.log": "66cc08d468d751534581f9aa7af93a01daea491158467a6c603743205731d590", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_ui-tests-scene_draft_timeline_roundtrip_preserves_retained_index_without_history.log": "dc9756a7e0ba3436be2294d8301fb0d05218c122d045d4111d8b9fee71f97c42", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_ui-tests-scene_force_refusal_projects_disabled_run_without_dispatch.log": "5214f2c9a7bd387f8bc385a63ccf285e313d334d1adc2b8594d9191a28e0f2a6", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_ui-tests-scene_identity_context_removal_and_exhaustion_preserve_canonical_values.log": "27d50205f5333945f9c5540098d1aa15a5fde547de42cbbd1c902a4a8e2821f1", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_ui-tests-scene_invalid_support_and_rotation_are_visible_without_snapshot_mutation.log": "bab04e3c63dded516a21eb6ea866dcbd8929d210d218f9ea5af9ed035f61affb", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_ui-tests-scene_pointer_add_select_edit_collapse_and_retained_context.log": "ba21f97e233c4b98afe5adb2830f217a88a60afd6ce20d43966daf1edaeafb29", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_view-tests-geometry_depth_near_clip_and_degenerate_hits.log": "2a33e529bd306132506d3fe702c105e5605c39b97cf1b0e1f8ec8f36e9594b00", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_view-tests-geometry_force_glyphs_preserve_zero_direction_sign_and_support.log": "479a02e21f06ca91356ddadcba3692a72775a2fbd0e1940a97c9cfb26bee884f", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_view-tests-geometry_two_sided_outline_welds_exact_seams_and_refuses_nonmanifold.log": "4572efc450d217e8c564217261ffd15c473e7f2c6688e7b3f3311bcaa6edfece", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_view-tests-scene_pick_identity_overlap_retained_and_unavailable_preview.log": "f0fdb67659ed543b3b14d80b8738b450f2bb7286d1958b5021a53a329ff60d33", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-accepted-scene_view-tests-scene_pointer_selects_same_identity_ignores_drag_and_modified_click.log": "5a87824d9ac799c5c551f12838cf33f397a4b07f363ef261b8779d67be1f1fbf", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-final-clippy.log": "e700750e4580978dd53fbbcdb8eab9988cea4b863672a095a31dd5bb5352c23d", + "docs/plans/ui-refinement/evidence/force-handles-20261020/rheon-ui-handles-list4.log": "5073c4bee51148aa7dd3d416128117a4e0115c2cfc497f8c80d1a2e33c73419f", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/manifest.json": "339d5027e6d9f1c1acd3730d59817cd48998ecd5246597a6a49e01d2c28100cc", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/material/combined.log": "822087d8721d2a3da1fe4bb09de5346931338c9011cb0ff291bf1a9609f33d3d", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/material/disposition.json": "4f06fc37a1d1c07b89e6dfe2e674a8e7b098f29ca17081f8bd0f3c7f7c5ef819", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/material/preflight-seals.json": "708130c2b29d3752caaf9c1684565b430c3d144d4489b4f111a1cf01cf8c8ebc", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/material/supervisor.py": "b7f13a3bdee65a6d4345ddbc0a0eaa7ddef7d64e4224633d63e16f8db1046444", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/native/combined.log": "b8effeccefde02cb06b78d4dd1c10814c2e6f05ae778654db8b715557873b00d", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/native/disposition.json": "9bb83d4450934309e912903f6d3a9b0c0493007dcd518cd8f717d732eec2bbb1", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/native/preflight-seals.json": "9522942fc315793a41099554858a400d81d7fef658be01a733631f0912656465", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/native/supervisor.py": "b7f13a3bdee65a6d4345ddbc0a0eaa7ddef7d64e4224633d63e16f8db1046444", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/post-exit-artifact-index.json": "4b9dc8a8188671cb13ce67a1585a589f012ae8cf7e92a7918b067d59caea8a85", + "docs/plans/ui-refinement/evidence/force-worker-execution-20261021/supervisor-review.md": "555442228d3fe9f60916a7de771b73fff9088a2a38e58107656856d48dfbfdd6", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/.gitattributes": "b4b62d881a4e1535ca0cf2267f5778d2f5742259ba1eb72bb4e4998f1578a4e8", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/manifest.json": "7290191d169597dcfe721dc7fda2f839b1f68090f9205d04d2afb2f422d6db2d", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-check.log": "4a0f564ca3f82fb658024102001a34a6aeb304f4a1e1191c0c7b6261bf93639a", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-clippy.log": "9ba41c9e20602bc796c4cd448795b50ce21a662ac08043d9432867337a607780", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-enumeration-check.log": "0b6ea05b3f167d44b00d80a84dfeb993701fb0cc073525e0303f3c10513b0778", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-ignored-list.log": "08e2a6dd88187753f71f4cf09acf8822b62ba4544bdf9ff093451d2185673585", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-list1.log": "8e4b6ec273ba481703441b8890566f4d0418efc8ff58408536503a667cbad2de", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-list2.log": "e4b30714a7b61e095bbc1980ec2ae516d034ee04309029a2e42bbe483a5f9c9f", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-plan-check.log": "e9c82b35d330356eedfb44a275872ea55dc89b934202099f25236e5cd9baa8cd", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/rheon-ui-force-worker-toolchain.log": "ecda74ca828b18debf1624cb36209a5b844fb1e1c1905ffb3d51b56cc275f96f", + "docs/plans/ui-refinement/evidence/force-worker-preparation-20261021/source-files.json": "603a0edf75b255b6ba217aaa6e72632a5e3ab16eb8997fe0013fa7a1175fbafc", + "docs/plans/ui-refinement/evidence/responsive-header-20261020/.gitattributes": "b4b62d881a4e1535ca0cf2267f5778d2f5742259ba1eb72bb4e4998f1578a4e8", + "docs/plans/ui-refinement/evidence/responsive-header-20261020/manifest.json": "dfbe770f6d49ad576b1c73910472530bdda4696e17741ddc66da9f7702757ee8", + "docs/plans/ui-refinement/evidence/responsive-header-20261020/rheon-ui-responsive-isolated-check.log": "bc06d5dfbcf5e2fe7768f0fbfa68a7deeb88fc433cbcfb030c39e784d1cabba1", + "docs/plans/ui-refinement/evidence/responsive-header-20261020/rheon-ui-responsive-isolated-clippy.log": "07573c823e169c26a05658e8988298906e7fe25483512e36d69eb751362e768d", + "docs/plans/ui-refinement/evidence/responsive-header-20261020/rheon-ui-responsive-isolated-diff.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/responsive-header-20261020/rheon-ui-responsive-isolated-exact.log": "5b3d85052bb8b38f8eeab61d001aba984326c843dd862d1d379de14092697f16", + "docs/plans/ui-refinement/evidence/responsive-header-20261020/rheon-ui-responsive-isolated-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/responsive-header-20261020/rheon-ui-responsive-isolated-list2.log": "a884852338452bf14a788c0d8affff9a40f7d258d328846fd807e7d5e5eeae23", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/.gitattributes": "b4b62d881a4e1535ca0cf2267f5778d2f5742259ba1eb72bb4e4998f1578a4e8", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/check.log": "74a7cd182488c042c3d146e06986c705100893aa8f197c1c0e493b11aa5cc5b1", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/clippy.log": "46564fd1dedbb64a09a3b802bfee55ef24c133b74cde342563e57da1a1d4c524", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/context.log": "f788e61f78e06cf66b593de9e4f3b8251f4a25eb2412896453eb2909312e8e05", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/edits.log": "6169ce8fe341d66cd7f3d2b2f06020c2d0a41824128f24a9f09c1066117b99c3", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/enumeration.log": "18ab1a20078e6662d8a64b9f3106b8f115034a00c76e8dff080643f1d3af13a6", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/format.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/ids.log": "0d14716463bb12e599807213cedfc1b54401f90c50f95c7b98228137f6b91411", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/manifest.json": "5b586883c0ecb31124ae8dc4154a4d2302aaa69525bf9a27652b512fb04b6ec6", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/menus.log": "b6b84be6f1ab267bdd9605da885114ac6df523688df677b4147e5741cdcfe58b", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/pointer-before.log": "cb05b62162a22a422856227116b8a0ee16ca57044bf31aadbbe5e17744dbadf0", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/pointer.log": "821921e701e81a883b6d6d050c3b70c7b347f94b39f101d04ef73c4cae6de08d", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/precision.log": "356a777c5a9fa7b542b84a2d39112856bcc00ae8af85f17eaf45f011a66e2fc0", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/refusal.log": "9a97cd70ad8d5a54eec23af8f54216cac9a9c409ea38c9f6197e9d003069c8bf", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/selection.log": "5e5b8709c44f77d0f16aefc66f8da1a7df88adeb00e3ded63e08217d82f7c022", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/thermal.log": "419a69dd6b2943363028f96fa91758c6d937d3b24c40c2ce9b928b5b1943e89f", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/timeline-controls.log": "86d14aa0580ec48466caad6d49a69943bbce8648c4d95948d3f86e82a6780f08", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/timeline-idle.log": "36b73dccd613ba28d16013236e34b8fcbf9cce70bf74356fc33e47d5a44b0977", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/timeline-speed.log": "6173f273cee320d54647b8cb49e47aeff2fbd4ec4060058faa45adcfc17aeb65", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/timeline-track.log": "ebc7c05145ec6185915c6742a2a91748f2052596915f5e3298965b162c0bfa89", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/validation.log": "1ebc6a4e67a968a4340955537b3596a52a87e770244d126fa0ab46684a8aa1f5", + "docs/plans/ui-refinement/evidence/scene-authoring-20261020/whitespace.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/manifest.json": "3159e50b148009afd30187e252faed4fb99d918d54d8089709c37c4678579754", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-gate-readiness-requirements-review.md": "caf279a3cdd779671c3cb800ea9ec3252f0186a116a06bbe6e3bebe71064fc3a", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-authoring-regression.log": "291acbf05100c55ed609432f4874ff88694e68c4eb62469e44653866895f67aa", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-check.log": "5adfe47eb2a9b5b9ef51e4c77d25ade237255a8d7e514d584469a5c7619dee43", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-clippy.log": "8c0e6e0907e6712eabdfcf565baacf868b526e4e3c55103788e4939398bc2251", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-diff.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-disclosure-after.log": "7920e6fcf08b502ba9a6d3ad8730101200a8384da47ed764fda2ab8a3f289f8e", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-disclosure-before.log": "d7782a15a521fbcfbe400e3538d0c1ab6c6d496f9fb8d1583937a28e5dc89d61", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-focus-after.log": "a025239c1e7e2565425f5603b5bd2620af8d9abc0e2193ffd2837b3a5293b2e2", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-focus-before.log": "59c843f1d1298f8f64c8036542d7d5e29d572899c8c6f23bee3cb4f6433af09d", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-list-after.log": "37f111fa1e4e49623b13d3d31943161d2bd4fa15af48c381c47489ca9aeb27b1", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-list-before.log": "9918d22dadd297444ca45eb2b2fbab55ee7a0d8747b64129e1d6374b8db6c877", + "docs/plans/ui-refinement/evidence/scene-properties-stability-20261021/rheon-ui-scene-stability-plan-check.log": "3f347682033eb0d17ff36cc1b37f9fbd2b1d7b4db01a4b9f596a9e499b2594a5", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/.gitattributes": "b4b62d881a4e1535ca0cf2267f5778d2f5742259ba1eb72bb4e4998f1578a4e8", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/guarded-standalone-binary-seal.json": "fd84034c3e0ed1e8895aa0dbbafaaf16571ec1d375d7a2840d218bac5c679d6c", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/manifest.json": "72df6b803271253cdaede05edfcf48cf9b6318a2fc61946a61abdca18b1e09c8", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-check2.log": "b8dd291b69b62c0719c18a5c4ae02c0c692d7e36311fa3a586fa4e4b92662e11", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-clippy2.log": "3856eab6f80feb9a95243e537de6199854ef0a153049ab2b61af84441cb51bc9", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-diff2.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-exact2.log": "e35f03ce95e98aa91a03942256c60f0f6a9d1172b1265ca6a462fbc9e032885a", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-fmt2.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-list1.log": "cbb880f9255700c467f820fdfb0fc6856b3410ce5549fb5d4a90a20b44e313b3", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-list4.log": "1574f9ddcd4c335baf5bb4fa7b5883cc63a4b6d201a6990679590a5dd8016354", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-production-build2.log": "4f144ddc9d69c6d17c7001e9fca8e6d1a70839f4c43a917e436cd3162792c40e", + "docs/plans/ui-refinement/evidence/synthetic-presentation-20261020/rheon-ui-presentation-standalone-build2.log": "45a096a0556c6f9712346da4e1c8b77e2ba19b7dcea77d5196aa6765bd286658", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/.gitattributes": "b4b62d881a4e1535ca0cf2267f5778d2f5742259ba1eb72bb4e4998f1578a4e8", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/manifest.json": "1bbfbc8deeb2c40f149af2d9b073640ac74734bc75647ab44efca54ecd50e0cb", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-after1.log": "6f448a085f5e0583440c572ce89960575e150ac2279ea2b72773c3a62810098b", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-baseline.log": "b79ee82d68c555c82b0af22a969f98f1181c6c0d39dd30a2cdc8d51ac7f83e6b", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-before.log": "7ddb5367499dbbddac573e0cdc0a0a38a44ed272206a7de753bb20956704bbaf", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-check.log": "e05b12393294b621219310fbe0c6f78c2fed1de17b2de9a5dd62ab70a72bd6af", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-clippy.log": "711c3f4cbf3d881bb66a345d5cde56e752c9a8105da188e08b3b0e6a6930aab4", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-final1.log": "f01347d6eefe87fa31050258970697f24af720ad3250860c72c928dc1bf1b997", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-final2.log": "c428d9d1963816f3a1013e594b36913c04baf5904fb7caac75fc88f61b996ac9", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-final3.log": "9ed53949650886d830b08860e1d16dd322df3b472cc0cef332afc44d5a2a062c", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-final4.log": "cf5c8b61d76e58edbb876344086a71b2f8226a6290627d8fd8f8926c2718f04f", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-final5.log": "e7071fb5345d93542b973a8d043aa57ea8d3f406157c933a283d40bd59432846", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-fmt-final.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-list1.log": "539557aebcc07021c8b742b1e90b451c38cea9d8b9f63d3b817cc9ecbc80e151", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-list2.log": "b76db6304dc9bd25e017997ced858db0af8bba086b7dfa23c317aea62b642e38", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-list3.log": "fcc635807972bbb841f1567f491cad05e716df309295103eef073fa19bc2f5f3", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-list4.log": "cca8da2d09bde215c1669ed56a99da8feac810dea9dffce7f840fef86a79d919", + "docs/plans/ui-refinement/evidence/timeline-scaled-20261021/rheon-ui-timeline-scaled-list5.log": "d1f1e2c4eca3333d484fb94b8583261595571af0d03c767bdc1724cc9dc592e8", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/manifest.json": "fd2d794bac1f21eaf90adb0396a2b6d0a1fc3c962d21658b7dea5ecd369ebe02", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/plan-review.md": "e696a247a5f540554d4a658203f9a8f55da4d353b95f9b3701c49e250846a759", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-accessor-exact1.log": "5c2e38fae8927ab6bf15220a3b4f304dd5e276ce7868e467e3f306fecbae9d02", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-accessor-exact2.log": "6871aabb59fe618a18da1ebab8d57dbf0271062f20b96087744fdccb239e2001", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-check.log": "7f16404930fa761a8b36bfb3c35b76a6a168dd10a33e19c6cc0c91039e8fc1a7", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-check2.log": "e05b12393294b621219310fbe0c6f78c2fed1de17b2de9a5dd62ab70a72bd6af", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-clippy.log": "b8b7fc67465e48be267d0e45786cca2cdf331e4bd293f3de241b1cfed9c2afbd", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-clippy2.log": "b8159f92b8c812a57cba795f95263b24287dd97512c3bc9f20270a644e1273f1", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-diffcheck.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-exact1.log": "6ad3a072d9a095e958ec22d7285a230b7c8a38c02288243e34bc2cedd4b6d1cb", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-exact2.log": "643268e6dfb58bcbd5c8641079004c472f796947a02effeb6c3d9ae734196375", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-exact3.log": "fad64dd12767f86d9bb9d9aaa064983a08a4e1b57830dcec173b29e391913780", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-exact4-copy-fixed.log": "286f14a3a666ab52ef68373f575590b06e1f1dd6399a0f83f3615490df1766ac", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-exact4.log": "80c93febaf82092e8cd929709efe081d729be121484d21f92e8f0ea4dfd0a5a6", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-exact5.log": "97cf8733e1154197cb0e8a6ca1a51c014b59b86cbb19f8d116e8090660664e74", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-fmt2.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-list1.log": "8a9792df9022fe6af5e7be0807f56ae5c486b56f03e7b93fed425853fb817ab1", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-list2.log": "1f8f3b9be3b4f6d728568a04623e04bcdb4e2eaf0e59f0bb2e3ac121b1bb449f", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-list3.log": "335e5b0e012eda49da8c4f0189401612d920a007cf04124e90700aec76df5446", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-list4.log": "24dd1ce8a43805122accc63c249c21003f4b1ee9dfe4058b73890bd5f9ac325b", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-list5.log": "3d41dae9c22524cdf44afb74d71799b8ec649ac16cad35d6090cfdcb584f63f1", + "docs/plans/ui-refinement/evidence/typed-force-policy-20261021/rheon-ui-force-policy-plan-check.log": "d3f9de8f8ad7079de6beac331d546d3ec455a8b45f62d754ef856c01149ba378", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/.gitattributes": "b4b62d881a4e1535ca0cf2267f5778d2f5742259ba1eb72bb4e4998f1578a4e8", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/manifest.json": "568ab94d6fd093753b6f213a26b7850f7cdced18db133942cbc4f5c3364747a1", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-context-access-inventory.txt": "289faffc17a1ffbb6c59133032293478638926bea5674901162c734baf2c1dc4", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-check.log": "a2bb21d6ee920a6663de33967befdde3ec5c255b3b4e962ac8f3e3312e204e93", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-clippy.log": "3856eab6f80feb9a95243e537de6199854ef0a153049ab2b61af84441cb51bc9", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-diff.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-exact1.json": "b9b475e5318a5e44557ce8d907a23bfeda1eb1f9fb21110ecc845b22b5b42942", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-exact1.log": "c217aaf18238a99acd151ed30e2e796699fb59caf025d9f76833304f5cc663d2", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-exact2.json": "e48bf4d77ecc881396459c9a36a43df8b18cd2ffbb4da6e3ca29fa6ac58665a6", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-exact2.log": "dac198eef4cdacc9a2dc17b27ae18d43a003343c316600f5dfccef6f2f274343", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-exact3.json": "dd361f1054c6bb144d4f4892ee1ff140cb4cf2f12361eb31791809f7658bb06a", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-exact3.log": "3c0596301ef93b916376aba0f466941f6aefb1cd6fe9fd663d70dffe5ef9fc8d", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon-ui-focus-lock-list1.log": "637b2a6ab2de7a15ba2f5e29f5a5f7d4639acb65a7fc5c3c717351d1672eacf9", + "docs/plans/ui-refinement/evidence/viewport-focus-lock-20261021/rheon_ui_exact_timeout.py": "fac641390156cd82a7554253ca27f300d48473b7c9ab8e986f6a26eef8ae27c1", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/.gitattributes": "b4b62d881a4e1535ca0cf2267f5778d2f5742259ba1eb72bb4e4998f1578a4e8", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/manifest.json": "7dbed249419d616ae97017b3db272d2e1d10a0a3023f46ba1e463b5b536799cd", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-check.log": "b8dd291b69b62c0719c18a5c4ae02c0c692d7e36311fa3a586fa4e4b92662e11", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-clippy.log": "a691eaa7d6c704d296265d3d442ef64f1decc907608bdaed5c59d444129fe754", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-diff.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-fmt.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-geometry_depth_near_clip_and_degenerate_hits.log": "90970cd0c4c61470364a6701fd19a74be9c1e336c52ed5c0f8fe792fe023b992", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-geometry_force_glyphs_preserve_zero_direction_sign_and_support.log": "86486951043707d8bc3e97bb159844ed1a93470a16bad3b815b19515e8285b29", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-geometry_two_sided_outline_welds_exact_seams_and_refuses_nonmanifold.log": "4ab91747e4f8b19664509aaa05fcd30f63927da13a28f92c3b47e9c081949404", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-scene_pick_identity_overlap_retained_and_unavailable_preview.log": "b772c3f70361a8c6a26058c7d25b668aa12c5a5c631a92f4a253cf82c7314c1a", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-accepted-scene_pointer_selects_same_identity_ignores_drag_and_modified_click.log": "c46a4224be5f1b0a47bfb817b1d81a8d5ba5a04c3efe0bd32c3ebfb059e80d3e", + "docs/plans/ui-refinement/evidence/viewport-selection-20261020/rheon-ui-picking-list-final6.log": "ecddbb71371c3fa42c1212379850d8f3290ae0333e3ba4cca011b7affd90b475", + "docs/plans/ui-refinement/execution-ledger.md": "148da7eea330c660c5194ad42260ba931ea43888bb357f99b2c51b7a5b86d4df", + "docs/plans/ui-refinement/issues.md": "e6484885a1381faf2109ecacb4fcada5a4d1fc84b80165cbbd444cf7028567c1", + "docs/plans/ui-refinement/plan.md": "059521feabebfbe9c3e5d88075525f551caadc6dac7f262f96d7b57e88291247", + "docs/plans/ui-refinement/reports/backend-integration-receipt.md": "50757d9aa226d4c083fd73dd398e21ad0cbac1c15c374299cc3093389a9ef382", + "docs/plans/ui-refinement/reports/backend-integration-review.md": "e55864ec42b8dbb7611b48b4f26dd5347ca386cf6c21d65fef7d23c12f29f08e", + "docs/plans/ui-refinement/reports/ci-item-order-checkpoint.md": "aecd6c139e25dd850e3008c95806b52308b53259781bb6df774bff97af003434", + "docs/plans/ui-refinement/reports/ci-item-order-source-review.md": "b83657790b5110a78ed34b8aa41675026f609871ffd786613ba49f4977f627a8", + "docs/plans/ui-refinement/reports/enabled-force-app-validation-contract.md": "80043585fd578cd625d5b2a24b4b66173fd852eed9643a50d82338a0908f0d10", + "docs/plans/ui-refinement/reports/force-gate-next-candidate-requirements.md": "1c19d499cca0fab37e7513f8597446652fb293bdd4bca9de00821ba34825069a", + "docs/plans/ui-refinement/reports/force-handles-admission.md": "f15cbb62e1886d4d2dc04ff2a4321b9cf700a1dc2a034fb06a86ad7e9a260d4b", + "docs/plans/ui-refinement/reports/force-handles-plan-review.md": "a00644e4c16605fd248e8782d555d7df3c781c58e3c03a31466ad9da14add777", + "docs/plans/ui-refinement/reports/force-handles-source-review.md": "f54ae8b3838c4c3e8bfe241e699e6a6644a784ea16a0ec13ca838197414e75c3", + "docs/plans/ui-refinement/reports/force-worker-runtime-results-review.md": "2baa9b063629aed0b0ff68c47293a7a3a4dda7bd3808b77aada6bc302145788c", + "docs/plans/ui-refinement/reports/implementation-review.md": "12f4c55fe4c41a1475d76d4a1dbe148e22fa6e386d703b923ccf95de67f9b631", + "docs/plans/ui-refinement/reports/input-width-review.md": "8a1384d048ffa455298923b88c1e9b4145637f2605640ea30b20feee1bff23ff", + "docs/plans/ui-refinement/reports/m1-cancellation-contract.md": "28cc495dcf5c332bf9c90fe1c6f783509988304aac5e3cadb4453089fb4665b8", + "docs/plans/ui-refinement/reports/m1-cancellation-review.md": "3ad213e7aff160fd772ab3c4d9397cae9e7ecea1debfdc6f44b91fab2318b7f4", + "docs/plans/ui-refinement/reports/m1-fixture-review.md": "6e69789247444322d41a7a88ec1f9f5ad89d51b762d28dd8ab23b0326749085e", + "docs/plans/ui-refinement/reports/m1-native-and-gap-handoff.md": "70fc557419d801cf8cae26bb7b551df8eec79955631a396a26ea93f42fa2a32c", + "docs/plans/ui-refinement/reports/m2a-material-domain.md": "bb576f4720437740af782886bede2a756aa9e363816491bfe6e4c670952668d8", + "docs/plans/ui-refinement/reports/m2a-plan-review.md": "d205c94a5bf81f0193a84e33bdc2a6ddda9df7b938c6d733d5ff4f4507aeaa6c", + "docs/plans/ui-refinement/reports/m2a-source-review.md": "d61b26ad2bbddf8c269f2080368afecaf7e97f27608c3c275ae75eecbb058603", + "docs/plans/ui-refinement/reports/native-force-handles-handoff.md": "59b2d6f15756728be1012b59551341d890d3fae0fa33a3c6a21ff85cd5ac47d0", + "docs/plans/ui-refinement/reports/native-scene-authoring-handoff.md": "42bf146743b9ec7fd5fc3c5a3e86eb798bf88333ac37e9423e3413112357091b", + "docs/plans/ui-refinement/reports/native-synthetic-presentation-handoff.md": "0f0334d42d5379c04b4b3be6379743ecbba9d9981dad8d861c4b06fc99e51404", + "docs/plans/ui-refinement/reports/native-validation-handoff.md": "8f4bc4f5aa31775e555f3e1aa20a16127e33deb96ef43da5fe8cbb4beff120c9", + "docs/plans/ui-refinement/reports/native-viewport-selection-handoff.md": "fc80450d878f38143d5a09df7f788d0bda73940bed24e9c296cfc00fcf2bb2ed", + "docs/plans/ui-refinement/reports/plan-review.md": "7568a031316357c7b4c68b51e7509fbc293685cdc1ffd9ff5307f61786b74c93", + "docs/plans/ui-refinement/reports/responsive-header-checkpoint.md": "16a011cf002ac9f01774bb5d750345b45554109b502aab861d314b1dae59d1f3", + "docs/plans/ui-refinement/reports/responsive-header-source-review.md": "918e1096c22d5c2e2302812c4a784ed5f9e76c629f04aff1b3523db50caba5ca", + "docs/plans/ui-refinement/reports/runtime-force-checkpoint.md": "c93abe367d89f6262d62c12f51b6fe6bd05c21df249868bee3369b6a85a9ca29", + "docs/plans/ui-refinement/reports/runtime-force-integration-admission.md": "9ca7d92e6e78514702838d94e15a70b24d904d8b9e6b70dd5d4e8cf029d36e24", + "docs/plans/ui-refinement/reports/runtime-force-integration-implementation.md": "8869e2509fdf21fdf2318beeb3ed9be2389d026670756cbf746d2a0201c21f9c", + "docs/plans/ui-refinement/reports/runtime-force-integration-plan-review.md": "9efb3904c14bb902bb4b101c8b7eb9247f87329f77f308c6cb8f22dd6dcc11ff", + "docs/plans/ui-refinement/reports/runtime-force-integration-source-review.md": "15b913a89572387f4bf14c71ff814557fd52dce839f968e3f729e39a1cda95fa", + "docs/plans/ui-refinement/reports/runtime-force-validation-contract-review.md": "6e59079d8b58bcc454c858a30ca8d8c82e4cfa635b93348494ae0349820136c9", + "docs/plans/ui-refinement/reports/runtime-force-validation-contract.md": "4e33892df1fd2218649d24094821a1d4d228ca50cedc1f9761056c4b252a22b7", + "docs/plans/ui-refinement/reports/runtime-force-worker-test-checkpoint.md": "ed501520e9e568bb02e7c3c2206a9df010fdade405e0043317cf80d788557748", + "docs/plans/ui-refinement/reports/runtime-force-worker-test-plan-review.md": "1855fff92b3c1d89cd4727b84b6a901d1d3f9227d3766fff0cf7ef14137552ce", + "docs/plans/ui-refinement/reports/runtime-force-worker-test-source-review.md": "bb8dbb93c36ddc4910841550c84f03ddc87b76153b9adcd17fb696fc32653629", + "docs/plans/ui-refinement/reports/scene-authoring-admission.md": "b494a6348a6a98e230d5a435f58eae49d9d44aef9b15030c32eeedb6196fc5f1", + "docs/plans/ui-refinement/reports/scene-authoring-plan-review.md": "9ca9d6e9b8c84aa47b558d1362d765f94927f0089536520fb01afcea75b37478", + "docs/plans/ui-refinement/reports/scene-authoring-source-review.md": "a97d7fc7941a5285611fd83e30b79c6340c3979b987719c11dde3a5a3b449813", + "docs/plans/ui-refinement/reports/scene-integration-contract.md": "9d99dc62496307beb1e29ed89defb39aa443f4e1ef2b513cef5e1b677a8ac394", + "docs/plans/ui-refinement/reports/scene-plan-review.md": "4d1628845fb72c12c20883d3e4465ec848e0dd7fce28735a61dcd493a33a275b", + "docs/plans/ui-refinement/reports/scene-properties-stability-checkpoint.md": "5b210c9be7075e0ff87be2a93c31c8025292255b73eda1dda8646effc189acef", + "docs/plans/ui-refinement/reports/scene-properties-stability-source-review.md": "a3df4594d6d9daaf2167919c48ce0b184b3f2acb4a6e07717c37666600769904", + "docs/plans/ui-refinement/reports/standards-and-design.md": "51b2d6be07a47efc4743c8df363d138d712ae73596f5ace2f495c037d1bb4e38", + "docs/plans/ui-refinement/reports/synthetic-retained-presentation-contract.md": "e6ac890254a93f0ad7d5a21360a19e90a72a43986be2decd367eb9caaefc06d6", + "docs/plans/ui-refinement/reports/synthetic-retained-presentation-plan-review.md": "88ce4cca3cd6349287cec52d6643468ddfada168a27e04ae2aadc5bdcd3a2e32", + "docs/plans/ui-refinement/reports/synthetic-retained-presentation-source-review.md": "de1df814dac6d8a6d50f0a6bfe2a331baf396f4561ebcb53cb5cfd6e5dc48e49", + "docs/plans/ui-refinement/reports/timeline-compact-checkpoint.md": "19b6bd00efbd431f6840c6a0c11af53aa3cdcb961fd0220e296d1785cb9312bd", + "docs/plans/ui-refinement/reports/timeline-scaled-checkpoint.md": "67df37616948aa96f50cb03632614a6d098f0604c2f532fa148215f95b17b8ba", + "docs/plans/ui-refinement/reports/timeline-scaled-source-review.md": "fa56c524bf6ec05fcb0a22fd9f36b158440476d2cba86088d83230abef2dc24e", + "docs/plans/ui-refinement/reports/timeline-source-review.md": "8e62d1becdfbe1df94ab6ac08d7f7514125353fb35f471ca49fd99a1182095be", + "docs/plans/ui-refinement/reports/typed-force-policy-source-review.md": "a4242f495a28f7be564e211262d8f86776f74bdeba5159dc33941dc11ca4132b", + "docs/plans/ui-refinement/reports/ui5-precision-repair.md": "e899cfc8f46bd647bd53e2f45a678f822027d6713ba25c24929cbce1a57d5e3b", + "docs/plans/ui-refinement/reports/ui5-precision-review.md": "07528077e9dd80011f3c9fa3ca3d04020990b19df1372f02aaa573f36f02fff7", + "docs/plans/ui-refinement/reports/verification.md": "3fad3249c379c1983748a89d976e20989fc223786c35945549be3f7633a21ef2", + "docs/plans/ui-refinement/reports/viewport-focus-lock-checkpoint.md": "ff808e6dfff3a0a8ed42dcb14e162cad30e449059a6bdb7e22964d337edac9e3", + "docs/plans/ui-refinement/reports/viewport-focus-lock-source-review.md": "bc2604193ff949234bcc1164c174653dd87098c54b8b45f1c1669171a7984ea9", + "docs/plans/ui-refinement/reports/viewport-selection-admission.md": "e187d6fba4865ff6f13afae4786dba5d480081085c59036164301d5497b348b7", + "docs/plans/ui-refinement/reports/viewport-selection-plan-review.md": "4fddb4cd969e9b7cbe4398a2bd2b15c4edf17817b844904c2e2aa12198f7c513", + "docs/plans/ui-refinement/reports/viewport-selection-source-review.md": "29b0eced662a66da0ce75d4693e6f0deff893196b7a2a3229c67bca30d39efcd", + "docs/plans/ui-refinement/reports/width-repair-review.md": "b8b02bd70ab8af8d1bda16d0ae9d7921770b5447b9f79d51b1d428e752178cd2", + "docs/reconstruction-checkpoint.md": "9a993a6fd6d22bf4bece31d223bf8df7448f27543ad997f9ced11800f18a7237", + "docs/research-book/.gitignore": "c60b253fc0b8eb3fc855c76eba1ccedf39702a081104552eebc95d41de3aab40", + "docs/research-book/README.md": "b7f0dff6dfc5648fb7ece3a54f7a8cf46d64d360bca48c28934ea6ef2210e82a", + "docs/research-book/appendices/A-algorithm-reference.md": "e04502b86be7c759b208e99c8d60abf1775f8880d91a2f75a9b080db088d61db", + "docs/research-book/appendices/B-reproduction.md": "60fdc924d98d053e7c09a0558086f0dcf2897c8a643102414b5f5ac57304644c", + "docs/research-book/appendices/C-bibliography.md": "a178b20ec92dd49aa427e6af7d7cc39ba4556c3a42e2add8b8d690e7531931db", + "docs/research-book/appendices/D-notation-and-provenance.md": "e8406dff51fe143361a05b285831b6243d036c9ccbee5ae9b42d47e76cb9a698", + "docs/research-book/appendices/E-worked-matrix-laboratory.md": "ad4661a1003f4c35f470d33627d657c017ea962c169758a3a2a97cb0b3282284", + "docs/research-book/appendices/F-expansion-contracts-and-sources.md": "8de1019101d184e6d06475ab9cb6dd8979d6e6310c20c0f4438aec94a281c9b5", + "docs/research-book/appendices/G-paper-audit-and-corrections.md": "18eb0ddcc69c32a463355f72c2fbcc20b3c9e43e4e49181eb1dc1347e7bf0c4c", + "docs/research-book/artwork/README.md": "ba90894df2ab8efc27b7e86f02c2f6a0240dee2f3992d7468fec7181779dc156", + "docs/research-book/artwork/back-cover.jpg": "383aa784f0e4bda53f150b16138c7c9f50885cfa1ba781c4af10f83965fc9fff", + "docs/research-book/artwork/front-cover.jpg": "b8e2670d4a2891223914c9ad91586debef6fb46ef500dac77fc4cce46415efe0", + "docs/research-book/artwork/sha256.json": "c33d92665f5a25e716122b69639f3166c92da11381b1cf503d528671c55e4fe5", + "docs/research-book/build_manuscript.py": "4809b5dbd7c4adfebf4c170e9f18ece8acc812468b428095083004cc5f123717", + "docs/research-book/chapters/01-purpose-and-model.md": "58b2754ead6716ae9f95a85bfd34f361fe1b26ff177010e223bbe8ac6b2a3396", + "docs/research-book/chapters/02-continuum-equations.md": "3297ac6c2b2116bb53e380cff0e318f555ad60b4d1e11a58e7a4fa99af8f2a3f", + "docs/research-book/chapters/03-staggered-grids.md": "8c028c8ff5dd4a2ef2fe8e03ed2fd03557125b766203391569aae997c4415bd5", + "docs/research-book/chapters/04-pressure-projection.md": "674e6fbccfc0ad8099dac4f55786f6dec462eb77d57c46c08c95c5fb16f492b7", + "docs/research-book/chapters/05-linear-solvers.md": "77baa679bf7a924dcd92cec604f25a2a4438169387e63c9134208a9a2131af34", + "docs/research-book/chapters/06-transport.md": "64c0d8b6afe40c5810a8dde4b1b2a57879565e56601cdb6c0eb64441f663b178", + "docs/research-book/chapters/07-corrected-advection.md": "88cc36728d2a9eabc6faae48b1a52f68743ff788af0dbe8a4c53376da799b3ab", + "docs/research-book/chapters/08-boundary-geometry.md": "fe413a603be702d28fa7645d38545f207195e246d1b81cddeaf8fe2a51f18df3", + "docs/research-book/chapters/09-liquid-surfaces.md": "5b36406b426f3fae0a0610a55591eefe3818aa77ae563f504cae8a046a0f6540", + "docs/research-book/chapters/10-forces-and-viscosity.md": "782d634616f6c732ae5c302c5b360838a04e951b45f237c49f252ce876f0e395", + "docs/research-book/chapters/11-particle-methods.md": "d0df5596b474638e5fee088e85872157e06058f7cb56101d1a7b2a067a190578", + "docs/research-book/chapters/12-time-and-error.md": "75894a071a698e0c73d277e9256f5257d6f50c6c758a6b8570ffa32ab90ad1e8", + "docs/research-book/chapters/13-memory-and-parallelism.md": "681e08573f4d26aa97f3ac777f092f0ae16fd99a0acc1847f1d0165361cd3571", + "docs/research-book/chapters/14-guidance-rendering.md": "78da79a7d28cdea766364f6e022f465b213a783b118eb73533626b6bbeb438f2", + "docs/research-book/chapters/15-floating-point.md": "5b486020e5c16df61df4710734f13189d1572f524cfe17c90165f2f811efd57d", + "docs/research-book/chapters/16-formal-contracts.md": "0f249860302cbb46c50a51f3019471cfc5556340862a21a36d09bf403ee36a5d", + "docs/research-book/chapters/17-rust-implementation.md": "8e26d7bc81d4ca86080a6e720169326d092d281e8dca4ebdd9d71980a94911d0", + "docs/research-book/chapters/18-validation-program.md": "7218a02b81390cdc8be496dfd129c7f5f91724c3baa76bb1a58c3dacff8c6a76", + "docs/research-book/chapters/19-forces-and-moving-boundaries.md": "480a2a6ac31969f402dda49739aaa3dda7dc0739ddac69a7f81c9e716fa166a7", + "docs/research-book/chapters/20-collision-mesh-pipeline.md": "65020d671f93a611ea1f9e630a1580997fc1bef900c7c1c59a8e8de1efcc7bfa", + "docs/research-book/chapters/21-density-and-liquid-volume.md": "e9c44d0f1e567b892006f6b7888b51e58ed9f51897ef3bdd6e5eb86e08198108", + "docs/research-book/chapters/22-viscosity-and-stress.md": "28160f1749ba5c2b8e8fafba1d009ece9b4d3d50446d7a646624a30caa5e0740", + "docs/research-book/chapters/23-wetting-and-adhesion.md": "a70f8e57eefa8b94c7c589311f08636e2d3406e5ab4767dbb9806c1ec7391df4", + "docs/research-book/chapters/24-slip-and-wall-friction.md": "f615978c24f1bd43ac6b4dd52f23f2e70bc7e5ac563bbdf925635a40bdbe36b1", + "docs/research-book/chapters/25-capillarity-and-integration.md": "0e53828029a721166193b27f45ce8bbe572c8ab407360d1571a3aa0ef48a3778", + "docs/research-book/chapters/26-compressible-state-and-waves.md": "0800ab171d3303b982820ff5639d9a536e4fbba53b992b10bfe2ad9d8c264786", + "docs/research-book/chapters/27-compressible-discretization.md": "abbd42306e71b6a8c7ed1b936a8c73f6db0faf0830fd2603c045b9ef30b8a9e5", + "docs/research-book/chapters/28-compressible-boundaries-and-validation.md": "ce9211c94770feaa1f4bd8f4fd5803b665ee3e838666e69a6e22d9b6fe581f8f", + "docs/research-book/chapters/29-liquid-solid-interaction.md": "9ba63bebcc9dea1e8f550f4a3a8bcaf60279abb73679aa106d36370004442073", + "docs/research-book/chapters/30-material-motion-and-conservation.md": "d97b8d6e5f36502db747fd9a1c260a6d633b55ef4d4dce4a0535447323a77f14", + "docs/research-book/chapters/31-stress-and-weak-forms.md": "422622defa4daa3a9de2dbf9a83448f6fdf6eb953ac2ee3171cdabddc656f2e5", + "docs/research-book/chapters/32-finite-elements-and-operators.md": "63028680378a9aec2b14a12935e37da60b11088ca9b2c64309dd9609cb18996a", + "docs/research-book/chapters/33-time-and-nonlinear-solves.md": "6800d821ae36b90bd6f0219ac76966b3ce7d6a5b1b5b168ca7f4c68f773e034a", + "docs/research-book/chapters/34-incompressibility-and-fluids.md": "5035e1fc4c0183c3afd18b079b5ff57246d92d0def85414fcc085346ab398e11", + "docs/research-book/chapters/35-contact-coupling-and-ale.md": "deae929d6506b196df0daa748f684fae89d37942aec78431340a1afd301fa4f7", + "docs/research-book/chapters/36-reference-fem-solver.md": "196e0ceaa8f27f7d9d933d3aa22d564c40e383a2d862bdd5f02dded8f183f04a", + "docs/research-book/chapters/40-fluid-portals-and-open-boundaries.md": "31478bbd4b27846bed88c9083b40e6353f928bced92adef880293501ef9f09d9", + "docs/research-book/chapters/41-temperature-energy-and-entropy.md": "0a8ff0f9c107357e9955cc67e5097fd65279bc54578a0aeb32a62394633e8d8f", + "docs/research-book/chapters/42-heat-transport-and-boundaries.md": "22587045324e810bd2cbbbcafcb470b8238a23a13b4d71325338f2c236191413", + "docs/research-book/chapters/43-thermal-expansion-and-convection.md": "227bf1837a3d16d107a6ac15a63607c8958dcb2b51ed616c058090e10fb63195", + "docs/research-book/chapters/44-liquid-vapor-equilibrium.md": "15b06e03c2584608cb2390906bdfeb6d12638bbd954031b8d05d557ee2978a33", + "docs/research-book/chapters/45-interfacial-mass-momentum-and-energy.md": "31df58544e55fb9e92d9393ea4cde70ed948648c96fbf15553d4ad763b2bcff0", + "docs/research-book/chapters/46-numerical-methods-and-coupling.md": "00b25e923fde07394f1adac001b042fdc55e1d5b3ae06b8ab32cd6785ee3c0bb", + "docs/research-book/chapters/47-validation-and-research-conclusions.md": "049e6a3bcbed14a635c87b125c07c7bca9076fe8de25737e1653d8f69dcdf534", + "docs/research-book/companion/README.md": "803683909d559cb93dc2a6c61c770b27aa0612821431e7b4fa6e247ce9b4c830", + "docs/research-book/companion/baseline-sources.json": "0ca4b0c8f237958c730622a154c254692891a56cc0b663f3cbdb80e0988bff54", + "docs/research-book/companion/cad-visualization-lessons.json": "cb328c3d243c65e0ecef26e992b3a7aed222dc9a7225b9ced6dbcc3af29171e2", + "docs/research-book/companion/cad_visualization_fixtures.py": "b0590392980f83b127bc3227e1903d28a398cb8103f3d5f5b836f9960a6c5160", + "docs/research-book/companion/depth_experiments.py": "9a5df3e94ba35fed999719a898cc270cccf040101df79eece716f6ac5e69e936", + "docs/research-book/companion/experiments.py": "3522e5c6da46ced7eadcaace0f94e8f13a451e35e850844137667234a6b61413", + "docs/research-book/companion/historical_baselines.py": "ea8df0c172c22a2897176fc20a98520fc91c5cc9f58edae1bfd6d847b3d84766", + "docs/research-book/companion/make_figures.py": "94fc46fd16bd5637135990dd9f71cd2d54cec9d999b25748a5f682c093434a54", + "docs/research-book/companion/requirements.txt": "fad71a2b9faf97517c831491763eae84515621926627f2bff976d01c3cf4521d", + "docs/research-book/companion/test_historical_baselines.py": "dd6ac24371077f6a055bf2ae3f4369833c6617d14cf7d2c49c64b0e10c16cbdb", + "docs/research-book/companion/test_verify_results.py": "2f42d8ee187ba209fed23ef8b989dfeed663bdf237989db307c780bc186b9a6b", + "docs/research-book/companion/verify_results.py": "fae6e02de11e84f4fc745ebc475c2c3164d697b3dc67062f09ab3d42471fd954", + "docs/research-book/compressible/README.md": "96d21cc9f26587f45275f4db7b43eaa5c14e81c9155ccb3d42341798661bd77a", + "docs/research-book/compressible/generate.py": "c950071da3877fb39ee8a714a3d9a4bd328e6602ce51f7ea8fa65cedeece38f9", + "docs/research-book/compressible/oracles.py": "d03142834703cdf41753ed09aa90a921b9f1b17f704923fedf3522a6717851a4", + "docs/research-book/compressible/reference.py": "1d9e334e3af255a2d4dfe802ca5797b140d48c936a5ea16da9e41d3dd5f1e680", + "docs/research-book/compressible/test_reference.py": "866062c13840ebe24d0593208348cbb282a8241059294f9fd0831361de3d6e17", + "docs/research-book/drafts/thermodynamics/41-temperature-energy-and-entropy.md": "8c050d50d1c1cbd8dd762ce64a97976399890fb5144076258804ee10407c8323", + "docs/research-book/drafts/thermodynamics/42-heat-transport-and-boundaries.md": "c2cc984bb2a02ebd4d347aaea6535e217ae8b50f2f4bdb460a0ad2453b7992df", + "docs/research-book/drafts/thermodynamics/43-thermal-expansion-and-convection.md": "7b2e7124a0576452ea39f6fd2c4e4b9f7a52306cbe568b6b5ef8f05faae3ec94", + "docs/research-book/drafts/thermodynamics/44-liquid-vapor-equilibrium.md": "c9bc250803d35ed1bb65d509b78b082d1d82eca25d9a8ba32e9777532982122c", + "docs/research-book/drafts/thermodynamics/45-interfacial-mass-momentum-and-energy.md": "97d2acf42e3738502de89bc5806be6f759632b97b6227b3409349e44c2c40a5d", + "docs/research-book/drafts/thermodynamics/46-numerical-methods-and-coupling.md": "48e6ed135907f34074556f194210203083a06609294276992793cbb841506beb", + "docs/research-book/drafts/thermodynamics/47-validation-and-research-conclusions.md": "a07fa27388689522af148471b4f5340cdea33fe03eadad324991a035731914ec", + "docs/research-book/drafts/thermodynamics/REVIEW.md": "ea49ad149c423fc8bf87f4b2c9dfe29a734c532f6631e04ff8f1d2e87fa964d4", + "docs/research-book/drafts/thermodynamics/bibliography.md": "99f983b18475aedccd60f020de6fe02c8312252606f95ff121bbef1b3f94219e", + "docs/research-book/drafts/thermodynamics/repository-audit.json": "c5240be6d0358236250fc04e1220a0ec3cbe4abe2cfc2f13fe92c5fd3d6400cd", + "docs/research-book/drafts/thermodynamics/review-notes.md": "02329b2f22d7d1413c7f9238eb6478b7f62133739f0830bd3a03318cdf51b4f1", + "docs/research-book/drafts/thermodynamics/solver-gap-map.md": "5121e9aa15e76c2fa579732c04c2dccbb25a3bb32de23ad84dc2f0bf372796aa", + "docs/research-book/drafts/thermodynamics/source-license-audit.json": "94e9faf0f39db7ced140dafaf3579e1e2da95c3c7b5cf092e29a9588f22278e4", + "docs/research-book/engineering/constitutive-validation-research.md": "6e196f1f94f009abe08b14079067c9805be03739d41445584b1b58082d1e1356", + "docs/research-book/engineering/coupling-and-reconstruction.md": "31906e07ecbe8e433ef2ae8da2f89d2b573e39818bce74170aea814acdcdae4e", + "docs/research-book/engineering/dependency-audit.json": "eebe5f75ac5d855803a5f46ff7796e7b4361597f108ca11b1c649af5e122a59b", + "docs/research-book/engineering/mesh-faces-to-collocated-flux.md": "15cf8cae8a70dae9ac8fb39167335efb925f86c263fbb2d09d559722c1ed7e8d", + "docs/research-book/engineering/practical-methods.md": "2abecff1827ec4b850b269ace789a912606f9304fa1372240366ad3ef2c9bf96", + "docs/research-book/engineering/pressure-compatibility-and-gauges.md": "1257fa0a9edd013d90f42021080698ba0a3515b26794e30c2ea4f116fe29b5d4", + "docs/research-book/evidence/cg-reproduction/README.md": "c7fd9b7e5dbf4f07e555ec5ad132ba5bf97838e2e6995208955d89cdf2f5c645", + "docs/research-book/evidence/cg-reproduction/diagnose.py": "38a736f123b5e19c8eee10c590e24bd74a1477145241db902ebd3b1fb512b627", + "docs/research-book/evidence/cg-reproduction/receipt.json": "ee868c7b1f984634fbd6449fd02f2c05dd3a7b126978b16ade7776e1fce02897", + "docs/research-book/evidence/cg-reproduction/verify_diagnosis.py": "a74f5c2f8e699e6ebb1c8c3b47d40bde0dc0dd0ede197b64621b5a1cafc3df91", + "docs/research-book/evidence/manifest-provenance-repair/README.md": "3d5d4bef86408bd0dd10196e1bd6797eff5f5955348874341903d1724f22f3d5", + "docs/research-book/evidence/manifest-provenance-repair/integrity-repair/README.md": "a3a9ae46be2fb4cb2946d6cd66ddcd832325bfb52b5a8b8f427e2ff265eb43d2", + "docs/research-book/evidence/manifest-provenance-repair/integrity-repair/receipt.json": "8d76d05832146f3d28e87448445a18e8e68fbd4b616c0c614593bfba86b590d6", + "docs/research-book/evidence/manifest-provenance-repair/receipt.json": "07c6ad254c0e3b12a944b541c9fc78baa799f28c7d13aff95f681f5ae3b2e43e", + "docs/research-book/evidence/manifest-provenance-repair/test_verify.py": "0ab461b5d965d8b015a1baab08cc587ba82bbfd6d7a73889618b8f3c5b930363", + "docs/research-book/evidence/manifest-provenance-repair/verify.py": "24f8be6891168e4af6ab2f2e310cf96ef87c509a807127e764308301ed030788", + "docs/research-book/evidence/pr1-review-repair/README.md": "4dc8cca9c13118a4a9743c69468b77f3e142778f082eea81280807f7471015e1", + "docs/research-book/evidence/pr1-review-repair/audit_smoke.py": "6a13281dae2c6c27930100f8734ba5b21e0493b744d23a7912dec4ac3c23a94d", + "docs/research-book/evidence/pr1-review-repair/elan-provenance.json": "f8d138989003d4a6c1ae5808aa77bb39d7fde0093adf035f31869f7e2b7d443c", + "docs/research-book/evidence/pr1-review-repair/receipt.json": "ad00d7a10e370a6e323c58992a21230348060d9f4906793d27c691a0893ed163", + "docs/research-book/evidence/pr1-review-repair/verify.py": "ebb21de61102f909b3334afab76aaf29b7f0933662c2384ed8045394ffe011b3", + "docs/research-book/expansion/PLAN.md": "4b7d4b0d6b606c8eeb33e9cfc8a1cf5f7a60ede7956590c7d4147c7d4c8e12c6", + "docs/research-book/expansion/bounded-proof-qualification.json": "1031b5f25007fc73d5c2447002b132a328a158d2b01f82b8251be4bfa1d1c896", + "docs/research-book/expansion/contact/force_balance.py": "4aaefe57db01b194901ab1fea7e9bcb52b8099e3f022c472c09864dc8fbab0e5", + "docs/research-book/expansion/contact/make_figures.py": "8f49393e9834eba75a0e361ee0828f81c44666be50df4188cd85157d67ee8a6d", + "docs/research-book/expansion/contact/sanity_checks.py": "85342e6af09593f4a1bbe0e4a7a0f2c4b65427a6de8737f264fbf4ccc3acd071", + "docs/research-book/expansion/contact/test_force_balance.py": "10b3acaef1a32340f0b0ab3584249b5aa040b183b6841a5bc0791ec1a952d2ae", + "docs/research-book/expansion/proof-qualification.json": "f8745d0e77f8b7eb99a8fe9b015dbf133531dc2f258e62f3550ec7037db8df16", + "docs/research-book/expansion/reference.py": "4dbc01b429f1ad2196d9d417b49aabebb80656d0a681db6397681bb60360468c", + "docs/research-book/expansion/requirements.txt": "b360b8f9036c2b84e7226fd51b5d71b65b1a3574c95921e2076ff2a27b776188", + "docs/research-book/expansion/sources.json": "debbe8fca325c71ca313b5393ee89a78976080946a618bc3fe3a5edad3a11cb9", + "docs/research-book/expansion/test_reference.py": "57297c03ff5a3d39dec36961cdf7bfb72416965b2ca24b1ac6ec6b58eaeef9be", + "docs/research-book/implementation/advancing-viscous-liquid-contract.md": "bc48b33dc9a3cc2641b24a35ae5c96e96ba4693fca2a14d8661120953b5d757b", + "docs/research-book/implementation/aligned-strain-laboratory.md": "f8384fc2907f110a8ba6c80189e3f85246f66df7c3fc17f14f1a3622c9f30034", + "docs/research-book/implementation/box-flux-simulation.md": "42f3634cca1f99aa6f13b2f032456b92d7971d7f3ce5fa018ae5353bc527868b", + "docs/research-book/implementation/cad-visualization-contracts.md": "ed22d65dc1b5dd94158e1ee291439c29c898747b0638681f336ee462e04d164f", + "docs/research-book/implementation/cell-aligned-free-surface.md": "0576df1ad82ece918c6ac9b433ec466e06fee1a7eb7b4e33f04a03d614c77ab6", + "docs/research-book/implementation/column-interface-continuation.md": "5f8297e9fc6923babc9db101e4d97646a5ddd1c767b2b900e8610709f6380cfe", + "docs/research-book/implementation/column-interface-final-artifact-qualification.md": "47248a9d8aa708ca8d6f1255f5bc4b36c41143f21f49bf16e1472ce1f8c396d9", + "docs/research-book/implementation/column-interface-path-ledger-correction.md": "6cf54b9dc589e5e5794f59789d67da8827f40527f7a8b3fd76cf8020045e73f4", + "docs/research-book/implementation/column-momentum-remap.md": "59fe8b95e65e396aa51cfcd688d45aab71c679731c60cbe70d991ea05fe1bf4e", + "docs/research-book/implementation/column-no-slip.md": "62b2cc3f0122e6f3b46d850aaadd90bca922a9a05762862bbc0df00bf0fbf6cc", + "docs/research-book/implementation/column-poiseuille.md": "0fbdfb5ce00a850efc4d86c41b48cd4aac71c8db5157cccbda84cb8b5e0d36e3", + "docs/research-book/implementation/column-shear-quadrature.md": "331b8ae268f63bbe5ae3c71497b9b612a14ae951892f3c00409dd8b7894c6e4b", + "docs/research-book/implementation/column-wall-friction.md": "76bca8888f5315ca070720c0b15eebb11e7f321f1f1e5ab7f0b54587180c24b4", + "docs/research-book/implementation/compressible-flow-roadmap.md": "f2a20c13c306fff7cd74f26b4d9f1c5b3e6cda4670c37b53ccea9dec6881861c", + "docs/research-book/implementation/conservative-liquid-volume.md": "a69466bc4ed9db6bab63e7912eec68201a32d0a2a8ab347bea432b6c8ebecbf1", + "docs/research-book/implementation/coupled-equation-consistency.md": "cd9c85c27f33ea2608f76411d53f27fb1ba071383a0f02a039c8971a1fbe68bc", + "docs/research-book/implementation/coupled-liquid-transport.md": "423565bf4f72f22f73c0ca8457adbf24ee70bd17a6659a4a824a9b3a788493d7", + "docs/research-book/implementation/coupled-qualification-oracle-repair.md": "5059c9afeef4a117ea82ee87870ab1709ff4f480d46671883c0b9380fbb6ca9f", + "docs/research-book/implementation/cpu-scheduling-contracts.md": "92bebb0934335e35347cb230d8666a20e56332e85c71d0128a188fd5807b0cd8", + "docs/research-book/implementation/experimental-aligned-stokes.md": "d68a57bc7646cc441aacab61bef70b4ad5f77dd7ffafd1bd79aebfb88baed230", + "docs/research-book/implementation/explicit-forces.md": "41be5afa89fdd467273745bd856c3371341bdd4168ced8e737017f081af6d13c", + "docs/research-book/implementation/extruded-third-velocity.md": "61bc7a428c4a0607e29ed5e0b5b49901a995f010dbd1d728136bf10a0cb3ca70", + "docs/research-book/implementation/fitted-ale-native-step.md": "3a296653cb12cc78e5e39fc9283bff479736e64fd6cad1730f339a0c05c36a85", + "docs/research-book/implementation/fitted-coupled-temporal-prototype.md": "eae2f68b8f94b162ee91cda4e7e87611450e8c9bef0c70051ee52d20c8dbede7", + "docs/research-book/implementation/fitted-discrete-work-refinement.md": "03f6ea7d60349d3247adeed7791f4e7d4a87cbd52c057e37513601441fe4695b", + "docs/research-book/implementation/fitted-discrete-work-temporal.md": "f015bf4c10711c10de2ce52d5647d83cca356894538b110c4b27d1e341a40917", + "docs/research-book/implementation/fitted-finite-relative-transport.md": "c24f1822984fcf7cd4d5a8ed02b6d06a92922cd499cc2d286eb36b0ea68fdaa2", + "docs/research-book/implementation/fitted-height-liquid-formulation.md": "6f3363f7d2e3e7c59b711aa91e66824820cd0cedd06583caa008654763c1841d", + "docs/research-book/implementation/fitted-height-native-assembly.md": "6bbe9d987bcab8ce62797e0960d22a7ad5cea5285635771d56be83684b0da70b", + "docs/research-book/implementation/fitted-height-periodic-seam-repair.md": "09dafd2691a08743be73ffdacf18f6f70602811aaf5684e65198e3c911a02973", + "docs/research-book/implementation/fitted-nonuniform-pressure-path-gate.md": "a432f647c9c49059dccde7ca680f120e78216450366430b10e22514fb16d2654", + "docs/research-book/implementation/flat-column-mac-bridge.md": "210eb4e14bd77c626a0888002fa374058c019bf3968283f5d2e9b36dcb95fee3", + "docs/research-book/implementation/fluid-portals-sources-and-scope.md": "450596632138d0fc06c739a23f73ea1ed28fab1aaccc40c4b6bc6583459d91a5", + "docs/research-book/implementation/generic-terminal-validation.md": "be5a643a44a352ff35c6e8dc1b2b8e4478996eccfbc7c2574c31c234e1a61e99", + "docs/research-book/implementation/lagrangian-fem-sources-and-scope.md": "b349d20209c382bd8ee2d50d1be43e0e94b43a8b676fab3792eac063f4b4f193", + "docs/research-book/implementation/liquid-output-verifier-successor.md": "f579abc04399b97423adc5f4b5d8ae837d5fe026d613aa70dd2db1fa895c4514", + "docs/research-book/implementation/material-preview-contracts.md": "6049712d4ede6784943d4d7dadf642a7cdfe98ed4f7cc60b3fb38029db6f80d2", + "docs/research-book/implementation/native-coupled-discrete-work.md": "623a482c66646050cf3404b6acd4ffc59ce331ad8aa4ac819f073d5c06fbf5d8", + "docs/research-book/implementation/native-extruded-third-velocity.md": "f0d243527c9b22428c9123599e935e6520c9fe8a45b7f5f5cce143a705db61fb", + "docs/research-book/implementation/native-wall-force-sequence.md": "5a8e54d2bd2dafc7bb80511ff9fa2511e7726f45f89c926d89100439ae3f0366", + "docs/research-book/implementation/newtonian-box-viscosity.md": "12173e59bd303e0e9375ef8c95703c4dfd13fdf59124112930365c54a113584a", + "docs/research-book/implementation/prescribed-box-flux.md": "0577c310cc5a294209e9a8c7c61bb59a7d72028832b636e517647ef499f22b7c", + "docs/research-book/implementation/reconstructed-aligned-strain.md": "926864076b7c7bdec42432438fc3bb24995b177a5d13fb6e8a85396b366eca2d", + "docs/research-book/implementation/requirements-roadmap.md": "440454a35d9f277769cf2aaa7531a9332ad7f5f8d7eff5b671ce0ae17c0125b4", + "docs/research-book/implementation/static-obstacle-flow.md": "ea1d33f4f27a2265caecd6961b3e3c06a6d310040ac0ff3c8ba082487db560cc", + "docs/research-book/implementation/static-obstacle-geometry.md": "11127e45597aff2dff3967292ffaadb991061ecbafa69079552f95fd25a9e996", + "docs/research-book/implementation/static-surface-queries.md": "3acf4202881b0fd9757af625f0f736b1866878f0938a4dc1fd6f08a2e6a9b86e", + "docs/research-book/implementation/static-tracer-barriers.md": "077d405c597caf58131752b06c0ce46e06badf5b382b86aa2b3562782c76b46f", + "docs/research-book/implementation/thermodynamics-sources-and-scope.md": "ba3e9274a8c68a169f1bc4229d98d9ec4a5a3ac96cb53e8d54f8090ce4bc6713", + "docs/research-book/implementation/translating-surfaces.md": "0181429ee041d48f0def388c2782811b20eca20fb844ff09702627cf8f2c71fc", + "docs/research-book/lagrangian/minimal-solver-completion.md": "582408053497892784329c8d762ead88c109be57eec4307615d9202f7ec1b3f0", + "docs/research-book/lagrangian/research-status-report.md": "4de7b62c573e64900b45b8f79411ff9a229891c82adfe154030aca7458a5818c", + "docs/research-book/lagrangian/review-guide.md": "529b4def920bcb287993c70622e35bb8aa287edba28b3c3ecdfe253cb3c6ef52", + "docs/research-book/lagrangian/source-map.md": "ef39a4884773c3d70bde3a8827fa0b67ceb4fc52ead71ec167c93a99fe2ac375", + "docs/research-book/sources/cad-visualization-bibliography.md": "2aedcab99925fea10363e81630bd1ffcdfab17cac07091aa89c9dd16f2d5aab1", + "docs/research-book/sources/cad-visualization-implementation-plan.md": "552ddd1bbeda54d0eb55e2fac9bb7699655ccc36daab9a153f2c2a554b0556ed", + "docs/research-book/sources/cad-visualization-sources.json": "07e42365c99e3b3ca9a6a0811659f7d7993f875aa139e656bf476e9f1a66a59c", + "docs/research-book/sources/compressible-sources.json": "4f34e61ea34f020dbeb3f1074e92753272b0030ed6ac3274ebffab68028acd92", + "docs/research-book/sources/fluid-portals-license-audit.json": "18c2f1c12e81cfb9bb9bbb8cf374e35d020144db21c77bd36d0be60042c64a58", + "docs/research-book/sources/fluid-portals-repository-audit.json": "abf5da085351dd65564524e9cbe4a7544b7372d350295232c15726960529ad93", + "docs/research-book/sources/thermodynamics-license-audit.json": "94e9faf0f39db7ced140dafaf3579e1e2da95c3c7b5cf092e29a9588f22278e4", + "docs/research-book/sources/thermodynamics-repository-audit.json": "c5240be6d0358236250fc04e1220a0ec3cbe4abe2cfc2f13fe92c5fd3d6400cd", + "docs/research-book/translating-viscous-family.md": "f1383ff3f481b4ac8e357bde0f27ca31b04f471fa48e90526f1b1fa9adbcab60", + "docs/rust-source-manifest.json": "e1a2a01ed9aa1fb56b367ecb199b59eb772d0fcf40269a5a0c1b90044a1065c0", + "docs/validation/cloud-acceptance.md": "0478907d63575b0038221ad7f3dcefdece0e9a84734cd1b856d2e2a048128f84", + "docs/validation/cloud-evidence-20261013.md": "eba89253bd88b6b86180391aaaa120339b653ce21a118c4868110b738c0bc3d8", + "docs/validation/production-provider-20261013.md": "e79dd060fc6356392d6d332de5a1da441e2974979ea2b8d21cd1026fc08f4f7f", + "docs/validation/session-flow-continuation.md": "c0996abcf7c8c48aa75bc6ea23b5eb9716b8be74b36238bee18c9876df96c2f7", + "evidence/advancing-liquid-contract/AuditMovingLiquid.lean": "5b43536c9ad513a451064879dccb4f757e2cbf2aff70b1ddd202cf8ccab008cd", + "evidence/advancing-liquid-contract/MovingLiquid.lean": "1917e236b458d741e94c95936ed9f5d504a8a6c0488b8be33c856f0980d04508", + "evidence/advancing-liquid-contract/README.md": "96407509a9b72e08037e648fcb1ddac9baa140cd87e0c50d9d457aed1ccc9511", + "evidence/advancing-liquid-contract/diagnose.py": "a720861bfef059c58a4f57bcef31b38ea436685c7e2ee758ea1524ad49beda7e", + "evidence/advancing-liquid-contract/lean-qualification/receipt.json": "9fa8881174be02486c6b77ad5da4872cfcd208ab54cf601ec346bc06bd1fa38a", + "evidence/advancing-liquid-contract/qualify_lean.py": "f3d787d6d7d98fe9d8286201c56df3ed9913d10a4de6c568bbe7fc6afb32d5b1", + "evidence/advancing-liquid-contract/receipt.json": "4a0e146a94ef1f6a970d3e70f487e4a5c9fc3a86210ff43b72a23c0cb449bcba", + "evidence/advancing-liquid-contract/verify.py": "f86ae1575fb2429fb7cfca13850a6a0d73aa2ea59c2a55249a2bbdf95c1e84f8", + "evidence/bounded-physics-contracts/AuditBoundedPhysics.lean": "ad9b42dd49701214c1d90d8836eccbc5ea4ad1ea06ffdeee52748d7e190ce647", + "evidence/bounded-physics-contracts/README.md": "28826e941006c4169da29e09e8e072fbb92b7238952a7fd42250aefa5268ea3a", + "evidence/bounded-physics-contracts/check-receipt.json": "644f31567b85a9f9a4d24782cc206b2d06eb0ac618f45966c96ea8a21fa35e3c", + "evidence/bounded-physics-contracts/witness.py": "b7cd7fb53b855a53a9f71f1b734ae3a09fbf523ea358f3cef6860f4fd7534df6", + "evidence/box-flux-step/AuditStepBudget.lean": "2a38d64f8f9fd3d9876560c852ae901aafde2f05d846fffc0bab322b982e264b", + "evidence/box-flux-step/README.md": "5697914173dfa2c7c0c70ef71199e57b7c85b69e84abaeb5658ef5481aa7b15e", + "evidence/box-flux-step/StepBudget.lean": "10be406be75eb7d2de0c4ef518d177e66d6278747e625b95a932c1c69f17fb5c", + "evidence/box-flux-step/lean-negative-receipt.json": "2b314d7b6cf63f1531ff7789793d9274050e9c038844a7843b2fa4a5796be72b", + "evidence/box-flux-step/legacy-replay/receipt.json": "3d4ba2b6bb6c5634ca8d2938c970e38ee527b1fbefe74b7b573e6765c2849608", + "evidence/box-flux/AffineProjection.lean": "357e470e8a4d76ebdc8b471211b6721c0d896892a7e6aaf856d57d2e7dfbe8a9", + "evidence/box-flux/AuditAffineProjection.lean": "fec8505171d92b120c6fa2d70edb666a46e7dbee8c4a0f23345cf2deab1f9e4c", + "evidence/box-flux/README.md": "7c1db884c968cf62820b19cc4a2720dbb577a111962a985601bf5560294c4700", + "evidence/box-flux/lean-negative-receipt.json": "2b314d7b6cf63f1531ff7789793d9274050e9c038844a7843b2fa4a5796be72b", + "evidence/box-flux/legacy-replay/receipt.json": "1ba8d273d9b756be490ed1586eaa1c24f213640fddf2af3dc4e6abe08712f4a4", + "evidence/box-flux/receipt.json": "299a5a42d854926ef7b9103eac4c667a0821046fdd378f55d7510b40acd65a56", + "evidence/box-flux/red-flux-underflow-receipt.json": "2f63342b43723f6b3432a267b16f7c27213d0c42194d8e1f13586a1ed933a3ab", + "evidence/cloud-gate-repair/README.md": "182236f319f27a5df9af16502fa55ce3be4ec402397dee0600714368e0aaf934", + "evidence/cloud-gate-repair/receipt.json": "38a8fd019b7e25aa7a4ff90ba901dcfcc8c36cc2dd73e1d28dfa46a57bdb6719", + "evidence/cloud-gate-repair/replay-normal-receipt.json": "75fe82735e7d6df4a1b3a36e627cdf81256d0702924a9fd40bf40916b2ba7200", + "evidence/cloud-gate-repair/replay-optimized-receipt.json": "b99d12b2bb43c8fe449cf8f80932154cb0bfb9c04eb1de02270e9391d6ac1005", + "evidence/cloud-qualification/README.md": "b029694c8c2c348237c82d2bd8c37378ce841f7c497da46ba7065ac3d5a4de0d", + "evidence/cloud-qualification/benchmark.py": "9633944d7e8c44715807f0b4c24140c6b823e83e4f82bc4a4ea1a633c76030ba", + "evidence/cloud-qualification/qualified-source-manifest.json": "980ec9d1874828e12b8ab844a8f8715257ee4ada62f512b841027f9d315e9d41", + "evidence/cloud-qualification/replay.py": "eb32accb0150a7acc7d6a314a7cc0eb1257f3a68a8eb036e9033b42be68e363a", + "evidence/cloud-qualification/replay/receipt.json": "fb077fbd2e23fbc2fa8a2dbbf31b08de1883fc6352d136898f9fcbb8edeea2df", + "evidence/cloud-qualification/test_gates.py": "d1e77028506f7ca3a9b0e34e57266da1b0be7e0833c59c7c0cdb1bf69dad3474", + "evidence/cloud-qualification/verify.py": "4fec1f998ebffcf8c4ad5f66d234ac8afcebe13f016cdb61e405eaaa44561bc1", + "evidence/column-interface-final-artifacts-validation/receipt.json": "fbb177e33505c52728b0db165211dd24deb4c0fe56cc561af7e3a85c988bb6ae", + "evidence/column-interface-final-artifacts/guarded_figure.py": "0b6f83feaa7ce3b29046f57e993a9008a2da0974a4e6b401f792e0705396f3ae", + "evidence/column-interface-final-artifacts/remaining-ci/lifecycle.sh": "ae059bae5e614d149e3898ed5cd87422097d29498fe0f12add3d42b7e6160f61", + "evidence/column-interface-final-artifacts/remaining-ci/receipt.json": "024978075be225cc084fdda50d39f3be4be29d56951ee344a6c0f7a8a12527f2", + "evidence/column-interface-final-artifacts/remaining-ci/smoke.sh": "ed2bb5550e0d36b1e4c1de44de2c431d49d0588517757f277fa24b6e4668918e", + "evidence/column-interface-final-artifacts/reproduce_old.py": "514f55b704204fa57f25a362e1bbb2b855f00a3c4b2ec758d663700d7ecf38d3", + "evidence/column-interface-final-artifacts/run_remaining_ci.py": "dc3a8c5190fe05fb5fa3c30bf97d46516d1342ede7faa531f7c839aa8de09e1a", + "evidence/column-interface-final-artifacts/scope_witnesses.py": "60b7a939e5a4dfa2a7fdcf49f80b91c8ed850d8d5aa7d5cdf57e50fed47e1221", + "evidence/column-interface-final-artifacts/trials/frozen-workflow.yml": "06e8c59ba1dd5fdd2df1a99ae5dc559a260fc248a75c451c09b42fcdcf1c4955", + "evidence/column-interface-final-artifacts/trials/frozen_verifier.py": "190bb7fdd7c4959550226ea9a7a08cc6de4179c0e05db2a031c39d621c5b7c69", + "evidence/column-interface-final-artifacts/verify.py": "5263aeca55c1cd7a02764282593bdf765b0ca9b3d9d40cb84c2f7e375633b051", + "evidence/column-interface-path-ledger-validation/receipt.json": "3b615c66af9e4f62c725015efe6df1bf28d2f30513d0cf5d86c153df0a62fd37", + "evidence/column-interface-path-ledger/run_ledger.py": "efd12ff7249ba207f97ba6dfe697dc3f022759de55f4647376a6e4ddc43733af", + "evidence/column-interface-path-ledger/verify.py": "dbdccd084c9311888c00cf78a9ca17c487a694bed353998c2a42b5dafdf3c837", + "evidence/column-interface/AuditColumnSurface.lean": "6be636efba4e8d85dfaa676d40ee439f31e36e68d11630e5bf11dea92d15aad1", + "evidence/column-interface/ColumnSurface.lean": "6d8b204bec18260e73b07691a2d64073330948bc69df07723868c6479cea52cc", + "evidence/column-interface/README.md": "158cea178a96ba0f5823e71ddc4e2d2ff196d5c19ae68f67db2eb043d6c5b486", + "evidence/column-interface/figure-receipt.json": "320fe104edd5fade937e1109c5975cbcde107a68e7954dea6822dd32e555175f", + "evidence/column-interface/lean-qualification/receipt.json": "841bba3a22f159ad967a09a547f92d07681e86fe93669b334d27bcbb6e78c903", + "evidence/column-interface/legacy-replay/receipt.json": "e04f850d03c8608f9111c1f0a423db772072c9d7d39f35dff4414ba1d53ae357", + "evidence/column-interface/make_figure.py": "5ed97338700cb0eae71e5d788556a8799a955eb31e49521b41acabda204ecbf3", + "evidence/column-interface/qualify_lean.py": "70d4db38c3608b4e559749e0de99798a3d1fa4fffd31503be629066ab446d2e9", + "evidence/column-interface/verify.py": "5d330fd473fd2977f9e054cf159596f53f83d9d3c3156d700907dcd4a3cb6efa", + "evidence/column-mac/AuditColumnMac.lean": "b2939485836735e198049287886319768aa9cd21021f5907010f9c9c7abb63fb", + "evidence/column-mac/ColumnMac.lean": "c3fe46b6d3c7cdee1e5340788aa5886a7c924411de78fe4722456a1354037120", + "evidence/column-mac/README.md": "20716991ae9d59511ba8a8736c2c6d61914e1dfaefc597cc77812bf738eec059", + "evidence/column-mac/lean-qualification/receipt.json": "aa173a3a304e96358652849f4431908b9c720b3f80b0bdd0365bb8222ef0f3fc", + "evidence/column-mac/make_figure.py": "124a7e5bd76f5c7b374c39f7b9bb9e12f234f7290ed8b2f3154b5d58ad2e21e3", + "evidence/column-mac/qualify_lean.py": "403b146c5addfb003d78cf30e79fac91cc90d5a91a2f4f3b5154fb5f757e1c25", + "evidence/column-mac/qualify_replay.py": "a86eff50a98f159fd7f267a7c871cfd0ed9986e83a373a04c6a7666788a1e4ae", + "evidence/column-mac/qualify_rust.py": "2dea0fdd1de25cdd0e6062cb684379777e440fe86f4f469599694fb5ce88a0fe", + "evidence/column-mac/receipt.json": "cc34c81bc699328f84305fd89e568731d43c077af9c67795f6dda3bbc6f6af23", + "evidence/column-mac/verify.py": "b87bfd1c5633fb3a9337b125e12f3b6cb60d3f5ed12b846eec59d65772ffca6d", + "evidence/column-momentum-constant/README.md": "b85c0acd2869d6dfeb8d51e405760d25a69e21fdcb3b69540eb4795fd8c62334", + "evidence/column-momentum-constant/lean-qualification/receipt.json": "867ac12c4db57357fe63c131dda875252b249243999097c15ed7b9af17536b94", + "evidence/column-momentum-constant/qualify_replay.py": "c868a7f9e8dec381f75b635b0e67a31673d2eea0a0f90c51056cb12df7893cc9", + "evidence/column-momentum-constant/qualify_rust.py": "2dea0fdd1de25cdd0e6062cb684379777e440fe86f4f469599694fb5ce88a0fe", + "evidence/column-momentum-constant/receipt.json": "4ca8e9a60a96ce493477d171390256a301cad34c1036a2391a43a98fd9c7ea58", + "evidence/column-momentum-constant/verify.py": "c4086698e898b0153abd90c3dc0ce6eab7b16a45e9011ebd03dec74a84d4ab45", + "evidence/column-momentum/AuditColumnMomentum.lean": "d1a86c2f82848d4a7f9dc0be58ce8da4edba8ccfacbb6e14aad02112a59fd5cd", + "evidence/column-momentum/ColumnMomentum.lean": "2eb4eebf756d2eeb0382283d6b66728c8e0a4d6e1fbf77b5a869e1bc35d52df4", + "evidence/column-momentum/README.md": "8e550cf1cc1d4233978867d1eacc6312410352349716b701d63a383823e42d50", + "evidence/column-momentum/lean-qualification/receipt.json": "867ac12c4db57357fe63c131dda875252b249243999097c15ed7b9af17536b94", + "evidence/column-momentum/make_figure.py": "abd5ffe5cdae013661e013a277ebae67566c0b044337a0598a56d3c7c2ed34e8", + "evidence/column-momentum/qualify_lean.py": "aa94add88633285304b7475659b57b011204f4313d1fbb3e79bf4c3409099bbd", + "evidence/column-momentum/qualify_replay.py": "c868a7f9e8dec381f75b635b0e67a31673d2eea0a0f90c51056cb12df7893cc9", + "evidence/column-momentum/qualify_rust.py": "2dea0fdd1de25cdd0e6062cb684379777e440fe86f4f469599694fb5ce88a0fe", + "evidence/column-momentum/verify.py": "d9e1e44efec5a66265f68adbd6b5672935ab019d2f7cc467dcdf661409ed50f1", + "evidence/column-shear/AuditColumnShear.lean": "6bed3a9c56432605aa9c88a6085d989a8f35d3d0b2d306acc39465c5e0634a06", + "evidence/column-shear/ColumnShear.lean": "dd3d5182d08f4a3d060f972a3b9f3740a323a3fa1c146238c9d78bd4222cc1b9", + "evidence/column-shear/README.md": "8abb447c1c0c8eb918ee7bb839db3fc25060c691cee8caabf881d1dcfbb15a42", + "evidence/column-shear/lean-qualification/receipt.json": "26896e6939c6570ddc977302355f48207063eafad8c7be5b4b6774c68a881042", + "evidence/column-shear/make_figure.py": "1d106abcf79047494a5547a39233e04a0ad551a9c5e47602e76c6a0e1f4fce39", + "evidence/column-shear/qualify_lean.py": "49598367decf36563aa653d2d5035c094eea7cfa3d14ec243e8fccb13ead35e2", + "evidence/column-shear/qualify_replay.py": "84c5a7f07a5d9261d977fd25d3d04fa4399079b547d3c673a97b9d81ec64aad3", + "evidence/column-shear/qualify_rust.py": "2dea0fdd1de25cdd0e6062cb684379777e440fe86f4f469599694fb5ce88a0fe", + "evidence/column-shear/verify.py": "19a0e26b711f17b8bf735af2ae92c5b5cc4dd88685d26ceaafee6889ee2b6c89", + "evidence/comparison/source-manifest.json": "0557f9f0217d21f6fc34cb0db03f647a9ef02d23751ccd240dd2d8d9bba9d9cf", + "evidence/coupled-equation-consistency/README.md": "9e02815ed4641154100ce5cc47dac47dcbf46e3b298b1e77ee5c89f13faa6655", + "evidence/coupled-equation-consistency/consistency-qualification/receipt.json": "3dcd416449864ea2e534d17d645f2bbd1ebe30f35411c16135799cfa7aba51b6", + "evidence/coupled-equation-consistency/finer.py": "39567ea569e91fe06c99dfdb1f19cbd6f07fc53c25e2c45331202841df88e520", + "evidence/coupled-equation-consistency/qualify.py": "b30b63d0c4d58ec9ab8198c9bf20775b26204f79026e70941ffd1ca901366276", + "evidence/coupled-equation-consistency/render-qualification/normal/receipt.json": "ec1c38b1e095f9cf6a27dca01d2f1eb83dbf7b5a0efdf8d1f31393ef03456577", + "evidence/coupled-equation-consistency/render-qualification/optimized/receipt.json": "ec1c38b1e095f9cf6a27dca01d2f1eb83dbf7b5a0efdf8d1f31393ef03456577", + "evidence/coupled-equation-consistency/render-qualification/receipt.json": "b2783e2582d54b21ac57b930e655ac35332d80996f2623bf35a6873b13939a37", + "evidence/coupled-equation-consistency/render.py": "b3f1011cd91308d4c5c13e28612d0bcebc099481c5d183ee014290ea7316202b", + "evidence/coupled-equation-consistency/study.py": "6f3c0134c1e469945269ff19e4c6324d6544481849f3851071eb33c6975b5791", + "evidence/coupled-equation-consistency/taylor.py": "175daeb3159191400a8501bc03cc4bc60a2d3263e57b22c6cf39982fd19a188c", + "evidence/coupled-equation-consistency/test_reference.py": "53f7dc095378b2ad39615a1f3421288ba9c00cc2db1e9ac0c692b36fcc9bd454", + "evidence/coupled-equation-consistency/verify.py": "42029f9067203f3071e1e6a3420b7adca2820ec73c65d2802d649513ec520613", + "evidence/coupled-oracle-repair/README.md": "dbd30faca9a3c84a975cfe6ecc3475ab567f2328fe4a1b3550c1b50d48bc47bd", + "evidence/coupled-oracle-repair/oracle-qualification/receipt.json": "029fd9138fa68d839ad0f06adfeb54c5aaf29c025344ede20db424d49a98507c", + "evidence/coupled-oracle-repair/qualify.py": "8c3352f8a0635ab7f0456182a726216ea1948cb430ac391e3c9fc059a4c90316", + "evidence/coupled-oracle-repair/replay.py": "764d95b3dffc9a0181f76f796fe957c7223c8b6374f148cee395bd839745678b", + "evidence/coupled-oracle-repair/reproduce_old.py": "834214295aa6bf88bfa3dba7a798263cb2b0d74c4a5241fa2a951e7706bb5425", + "evidence/coupled-oracle-repair/test_reference.py": "35bd8f12c7ba8a63bed36a27295081213a7409e806088c1bad096687d1694c41", + "evidence/coupled-oracle-repair/verify.py": "1ad93ffe2b80995ff22d815ea8a976c06b3a95637e245056473210523a9be14d", + "evidence/coupled-oracle-repair/verify_trajectory.py": "8a95375d02633a3c397db573b04a90239180f643ee55324b8757e07c0498ec6b", + "evidence/coupled-terminal-main/README.md": "f3a3d1e6fbc7ab324c24ea681b321ddc412df93ffe5e9d8a586819ec096ffbb2", + "evidence/coupled-terminal-main/baseline-probe-source.rs": "8c47def3bd74d2c12f3035f046fb25a9e3ea01884e54f6de956fe8e768c3356b", + "evidence/coupled-terminal-main/freeze_receipt.py": "98d22e33ca6f1ca235214ce6843a366b82867d710b8659b4eb9a822401f5bc24", + "evidence/coupled-terminal-main/preflight-receipt.json": "4161ad529637af8339861e4c605d0543de891cdc3fe45da53c5a8a2f797b31d1", + "evidence/coupled-terminal-main/proposed-readable-workflow.yml": "217c6de5a0905cb9ef6d4bbc1f53aa822c79e9dc9b45e3618ad23162bca43fe9", + "evidence/coupled-terminal-main/qualification-outcome.md": "536931d0b2fa6c388cd7002ec1f2ee2e6e76760befe3db9f04e20fc66e79dd6f", + "evidence/coupled-terminal-main/qualify_local.py": "547a94d0b58f630f27180f083bbadf3437f1d4ab2d7b540a0e0a315b9d76fb53", + "evidence/coupled-terminal-main/qualify_workflow_candidate.py": "20ea8c54fcf61fc2942fd07617dad7a65aca4d0189f3d580fb1679df1af95d53", + "evidence/coupled-terminal-main/receipt.json": "4785f59e288d474e572e8f8e87c584d3eeb0247995af650d07cab2386443f74e", + "evidence/coupled-terminal-main/repair-source-receipt.json": "082694be1feff93a844d02eeb09b528e5f065c36d5908fcd571b847329481d80", + "evidence/coupled-terminal-main/verify_receipt.py": "aede98c64797195611c8a2af68b9dcf7ca392b753d116c74919aef94745b09c9", + "evidence/coupled-terminal-main/verify_workflow.py": "b4e00072301199e4e98c9b88307a5a8c332c9567e7c30cd10305662e07610cca", + "evidence/coupled-terminal-main/workflow-candidate-receipt.json": "e4efaaac8b41fd3fa33116c9fb853725f39a6ca2b6d7460090e404935e272e7b", + "evidence/cpu-threading/README.md": "f1e2f0af21929ea5681508025f3103bb9fd1bcd4628c78274488ee6dceed673b", + "evidence/cpu-threading/measure.py": "015a4ae0826b699ef7856d786e5217b47612de2b3801ac0c37b18e9c1987de1a", + "evidence/explicit-forces/AuditForceWork.lean": "69a6e71c6d2932f6d7c97e3a69b458eb2bcc03779b74c9707b7c3e7f75eb07f1", + "evidence/explicit-forces/ForceWork.lean": "6523dc9b86f70fba8b81301bb7c674f43545825a34f8524fa89134b1cf62e725", + "evidence/explicit-forces/README.md": "d907ffb20ab8de99312288093fcd8d6efa526e7304a26d4aab7eb906e6dce382", + "evidence/explicit-forces/legacy-replay/receipt.json": "abb30074e042ab6a953e5c700e5d847dac0c969b8f9fbd44b52a36e9f2803696", + "evidence/extruded-third-final-validation/receipt.json": "464c116c84a5f5a6ea1779650bf74428505f843802aea88bba45a96579739bfb", + "evidence/extruded-third-velocity/README.md": "3b95e509913a448e15a67dd2968c791906390c9354695e3b27e9663107ba7fd9", + "evidence/extruded-third-velocity/check_browser.py": "1bf42b492416c0201fe785cf467b66d95383a97cb09a7a969d02c2c95e0e01e2", + "evidence/extruded-third-velocity/check_viewer.cjs": "0335c32c8eaf3c4c5778733777a20a2f08ce111a6eaf9ff01db1d65cfa0aefe0", + "evidence/extruded-third-velocity/composition/receipt.json": "cffa3ce71ee9b7739a3867e9260d6bc728e921e7954d8f03a7ed67d08a34934f", + "evidence/extruded-third-velocity/derivation-qualification/receipt.json": "38387ddb2835333fe7dbf9a54a1893ddae870bdc9026ef2c4cc453ca945e1fdd", + "evidence/extruded-third-velocity/derivation-receipt.json": "1fbe74676b519c6bb807e623c6d13601274b2760203c38e1fb349578d0a37ca8", + "evidence/extruded-third-velocity/derivation-trials/first-harness-source.py": "5dd0213a02f0fba3bce07816b2b6f51359c6760df04d506a9efa070df0d6ee29", + "evidence/extruded-third-velocity/final-qualification/renders/receipt.json": "1626fc60064aee7cfd78201b9fa45f83ecfd570e5ee2b1216fa36b828b4b2587", + "evidence/extruded-third-velocity/full-feature-tests/receipt.json": "2a8fcf3ada2a752f7d38e094a2efb39d206caa175807cc62708842a944f26701", + "evidence/extruded-third-velocity/native-preflight/receipt.json": "6c469baadd0365d9021fd54ea2f2dfdbccd5a1ae9b6e54730b706ba72ebf3180", + "evidence/extruded-third-velocity/native-trials/first-export-source.rs": "7b493980de835d69f1c367137d14f37636564f90f9fdb80df1a02ad403bff08b", + "evidence/extruded-third-velocity/native-trials/first-replay-source.py": "5d70b1a20ae1a6a3361fb2876360c2e3e4b8247df000d1e5b38cbc06a8d2b1aa", + "evidence/extruded-third-velocity/native-trials/mapped-normal-replay-source.py": "5c92fbe8b2ca8ba079e7270d9fc34cfae6fd83e0f85c5b7ae04ae58a543b4d7e", + "evidence/extruded-third-velocity/native-trials/strain-square-replay-source.py": "6c2311f1da63309c9d20f0f963d58b6ac079e5441d83c7379b941338d50a05a4", + "evidence/extruded-third-velocity/qualify.py": "c04ea03a22e600e7b33f1e772fa3abe6cba616039f24eace702befffe65debea", + "evidence/extruded-third-velocity/reference.py": "d44896d9548867d37234d2734dba6ac28861ffdfcaf2108bbb8ba9fb8878c14d", + "evidence/extruded-third-velocity/render-trials/first-render-source.py": "72c4cda04e4c0cfaffbe981e902904e9d70d64bf72a80529e8b1c43a283b9140", + "evidence/extruded-third-velocity/render-trials/receipt.json": "f59e36be50db87d1a04ba1fc0c9e3614e5cbb8bef8f0cc0737320ad5ef4b9f3a", + "evidence/extruded-third-velocity/render-verified/receipt.json": "59ce185ab7e9f1069d02c2b7e8826aad6323bc76b6e5bd86782628cde8c8148f", + "evidence/extruded-third-velocity/render-verified/renderer-source.py": "89a8d67b0f6428b14e5b300cf07f6f979654689eb21c2f172e17e5000faec91c", + "evidence/extruded-third-velocity/render_native.py": "7f13daa3048b6649b7e1025f914527cc7ac698ecda63ed903f52d7c795e62197", + "evidence/extruded-third-velocity/replay.py": "eab1033f182a5a1802f32097c76743a44f35e87bbb91d4eeac877aab28794d0c", + "evidence/extruded-third-velocity/service-boundary-1/RESUME.md": "e0291081bcc59150ae8626b784704b746baf36aa1bdca85423b2fe2c3677b1f1", + "evidence/extruded-third-velocity/service-boundary-1/preflight-receipt.json": "6c469baadd0365d9021fd54ea2f2dfdbccd5a1ae9b6e54730b706ba72ebf3180", + "evidence/extruded-third-velocity/service-boundary-1/receipt.json": "8443e57579f6313ca4682c9449d148bec0e563bc5563a5bea226cf8cd08db7f5", + "evidence/extruded-third-velocity/service-boundary-2/RESUME.md": "3c68a3674fab01e7048b9c2c5759cb0b1d15d1294eb9e830b983ed349bfcf63d", + "evidence/extruded-third-velocity/service-boundary-2/receipt.json": "7f2c13eb379eecc17db929cc54e1fbafcfe6418e2811522e45e6e3629c090582", + "evidence/extruded-third-velocity/test_reference.py": "c3b94853cf5c31c867a4d4ee102294b299ce3235833fc9dd3c5acb41cf20afa6", + "evidence/extruded-third-velocity/test_replay.py": "70d30d11c41b1dc93ce1a245ab8db18cd07ef2d4f8cec70fe1c26ceb8facb070", + "evidence/extruded-third-velocity/third_exact.py": "bad2e491b34338a635659a7f1e594336629368f022f275bb99da0c11884283f3", + "evidence/extruded-third-velocity/verify_final.py": "2cf9a19efe9517715ce5cbed3565a62a15b877e98285b5ac1a51ee738dd18249", + "evidence/fitted-ale-native/README.md": "f4e8f2ba89c2d848b3dae09ccad62932a3558ac4d6a0d5a14d046139fa8797d0", + "evidence/fitted-ale-native/bind_final_build.py": "f0f2880f6fa4b806c8c99618f3727d862d933c7ec150de7baf82f2234b9bb841", + "evidence/fitted-ale-native/final-source-build/receipt.json": "28efc0fab409f5a41b009e7965e5b0ec6684ea75bf48dd544620aae29ce65fca", + "evidence/fitted-ale-native/qualify_native.py": "f1d18c887d852934fd38da09849d8216736d05ea8eca4c81d8800fff8177de73", + "evidence/fitted-ale-native/qualify_rust.py": "4c1aafdb25c412f07cb375931cbfedffc11e0c6caf3dfbd4026c8d73823d74a5", + "evidence/fitted-ale-native/receipt.json": "2ade69184e8becc61e7309f8af299533a2f8117953e187a8d175c187fd39b8eb", + "evidence/fitted-ale-native/render.py": "1e476f743277fc28c480fa2689824799c0947db07973deb2038cd1e69a6d8f36", + "evidence/fitted-ale-native/verify.py": "82c8761cae3a1335a42e862482fc095e7d08a079bc310db42b437ee5e8042c6c", + "evidence/fitted-ale-native/verify_native.py": "5403ab892dfd2257245574be49cf702ad0d436973853a3270ca73285f6105fa9", + "evidence/fitted-coupled-temporal/README.md": "ff8013d1d329e6e1e01ec7d0ba82c35f0a709bb952bdfc4c232d966400973d37", + "evidence/fitted-coupled-temporal/cell.py": "14a7b9a85f02fa5bab59073521fa17b2972b191c48d0fa79e565000a62e999d0", + "evidence/fitted-coupled-temporal/certificate.py": "0ef1328a9fae7d1f859a9bc29298a3e0fb4563e749fa236a5ff970bb58d6366f", + "evidence/fitted-coupled-temporal/exact.py": "26a61d5bfb7404e181f7bf2d0d582f90ba2fd8565ea33f096bdba7c96c21930c", + "evidence/fitted-coupled-temporal/independent.py": "d6d8d5d9d61475cec0470f86dcdc67811183e104ec3d39f3e2a15adb167ac3e1", + "evidence/fitted-coupled-temporal/model.py": "6f3ec893af86e7465b4ac0afca9e28b22eaf71d18f42b3c302862413d2a1b499", + "evidence/fitted-coupled-temporal/qualify.py": "db63afac7d55483ca085971b6ad4d58db9717d98da7c56f93aa0ec55d05ee5df", + "evidence/fitted-coupled-temporal/render.py": "8629a3ee99dc984b51b6aeb830974e114fa65a2a4e53773b55524a06180d2849", + "evidence/fitted-coupled-temporal/research-qualification/receipt.json": "e6d185c15672c317fa7a245eb2b32b56d208a457c72d4a0f73affec694ea3b95", + "evidence/fitted-coupled-temporal/study.py": "849e3f03c1ab1019f85ca27cab54dceaf3aabb3b73d35ea7c27c58a2d6009fde", + "evidence/fitted-coupled-temporal/test_reference.py": "2c72d2441ac62f6158cedcbb2880d1ed31ec6da7f69250024d2fde5040d22a9e", + "evidence/fitted-coupled-temporal/verify.py": "e6cb484d8c5da25beae80f4cd97e77dfa967785c06052af0a7e7e930973e615a", + "evidence/fitted-coupled-temporal/verify_cell.py": "3cd6bc8dfbb94ee8030285d1402d1a04e72dcb59f012639482e04c7656562d9c", + "evidence/fitted-discrete-refinement/README.md": "c3dd8a0f0519323ea919596ededad36b9019da1da6d999221a46ec699b815ea9", + "evidence/fitted-discrete-refinement/cells.py": "606525eb0fe0a2a8144b514d844870ee5422305d2aafe6f2a6ee97d961334e75", + "evidence/fitted-discrete-refinement/certificate.py": "57d25e7daf0a35bf408f79763f898de331d8c8dd6428542a0ebdcd4eec65a732", + "evidence/fitted-discrete-refinement/diagnose.py": "d03bc80f923d185b79cf9f0774d00344c11093e68348900adcb1e5cf0d361018", + "evidence/fitted-discrete-refinement/independent_work.py": "f9434695435d675e2db3d95eb3aa6a2a044def998ea737ddd0332b8cc5592e9b", + "evidence/fitted-discrete-refinement/qualify.py": "4a34b8d2c2c394b907e5a83d34f28b2538bdedf43cc5418688659b3ccf8654cd", + "evidence/fitted-discrete-refinement/rate.py": "00d3ae69d53e125be057840746df951d2e17241dd416a6d30e45a1bf28eee345", + "evidence/fitted-discrete-refinement/render.py": "cc838cdcb5bd3453e0e121cf938ac7f4cad8f1c7dd30c6bbc04532ca91c6edf0", + "evidence/fitted-discrete-refinement/research-qualification/receipt.json": "4312151a95b2d9f2a708832db33c7fc5f7f2f3a065c82bd06a50230ef35dfd4d", + "evidence/fitted-discrete-refinement/temporal.py": "e499438f17178b8a29bd3dd37dce02300482b85d2f691155b747fcf8c45f6c96", + "evidence/fitted-discrete-refinement/test_reference.py": "a588e4e72f86098896e960a6b4311d5f19ced404f86d2f8e5367433c2adda488", + "evidence/fitted-discrete-refinement/trajectory.py": "322ea6bf608c289f06a6296ff95cafc10640f1685ec147a45780e81e0be017c1", + "evidence/fitted-discrete-refinement/verify.py": "fa89a68f86aa1e0080d06b9b506fa26ab38fed4ddc4244bbfed34d69f6890612", + "evidence/fitted-discrete-refinement/verify_cell.py": "3852cfdf29624a7972e69bfcc53704e969f43012292d3fb0be168f2a213c1baf", + "evidence/fitted-discrete-refinement/verify_trajectory.py": "3694a7b6073f6d99def6ca2448e86a1c74c5f1505a22e2d01b68024c4a7a2c5f", + "evidence/fitted-discrete-work/README.md": "0c96cddb9f56a32d320e611f0e4ab42637d65db7ce44d909c4ab42aeec4bf02f", + "evidence/fitted-discrete-work/cells.py": "c961e0455db272b70488284e26f7f011272713e75b5e942b867b3141e92e38bf", + "evidence/fitted-discrete-work/independent_work.py": "c0795436f7eb40519ec6c9a2a99f74c069dc0a2a22caf4dea5af09d7026705a6", + "evidence/fitted-discrete-work/qualify.py": "1a09ea64e6bb430e7458a368cf322286f8d8b751fd894030a98a2aabecd51ade", + "evidence/fitted-discrete-work/render.py": "e6cc06aff7076ef99e753100c4809776e2401b60b1332cf8ba810f59fac32a46", + "evidence/fitted-discrete-work/step.py": "3c720e94866a4c4fd318fa06ae25c620300153caf7c75127810ca6090a8529ad", + "evidence/fitted-discrete-work/test_reference.py": "04eace7aeae336fd4244b0501cce790730e0db98c8671e701e05f811aa8c6657", + "evidence/fitted-discrete-work/trajectory.py": "a2b255bd45e98712357b7af71f676e109d3b63f78682cbf623bf9d1feb39d1be", + "evidence/fitted-discrete-work/verify.py": "6901a321bdd4a2cf4879cc48fdfcd9414de12b0a7c3deedbcd2c3481558489b9", + "evidence/fitted-discrete-work/verify_cell.py": "c118a5b6ec1310bde2eedcb21fc316dd7683fd1f52026ef6d4d0baabf146380d", + "evidence/fitted-discrete-work/verify_trajectory.py": "1e4c9bb7d86da8238bbdd022f276821cb1d483f9d6f2503a72f75e4ce27c3894", + "evidence/fitted-finite-transport/README.md": "108145662b23e3ff090d4eb6428818d2b5e9e6da7aaf4891259c4d01d6d58423", + "evidence/fitted-finite-transport/make_figure.py": "dc1867b5a29567a74cca8bd9d4aca011c1146d7323ab093b5de4dd5dc9cb427c", + "evidence/fitted-finite-transport/numerical.py": "16bb385d2e8827426ba4e82b7d1e89edcf72da984286e9b312bfe752f187f8a1", + "evidence/fitted-finite-transport/qualify.py": "5d75bc5c77751e483f5074abc75e9a7b07fc7e0e908d2cd324c6ca0dfcff4c93", + "evidence/fitted-finite-transport/receipt.json": "36d5b45cd13f3408e0b8bd56bee2fdb797d2ccb902314182491fa18e5b92465b", + "evidence/fitted-finite-transport/reference.py": "88a17db2bced80ad303ad1e884c387357811159f1c734a05c7455ea373684640", + "evidence/fitted-finite-transport/research-qualification/receipt.json": "6aac36574d68733f9e2027eb96e4f99778d311911189176f3355b48e77eb4ef6", + "evidence/fitted-finite-transport/test_reference.py": "c7473bbfcbe2652b4b8ee04c129c988da8ae7c84165366c42dc7b751ab76ff27", + "evidence/fitted-finite-transport/verify.py": "22b5fa590f0948bf17f425e778ea68e25f2d2c46834087e8989f6de2e87ccbf2", + "evidence/fitted-height-assembly/README.md": "cdcd0a19bd00170310d704589ce2dc5ee39e2bc2868e53dd55fb39e34c128f5c", + "evidence/fitted-height-assembly/make_figure.py": "c7cea0fd234f50abf137de32140cfbc495b8c97a73cb0a5e31aa06562a8b75a3", + "evidence/fitted-height-assembly/native-qualification/receipt.json": "2f041db0625ad26992585f3fac6d2d6fff28a011463c2aa4846e502a39807554", + "evidence/fitted-height-assembly/qualify_native.py": "f5dbbefc8758f9aa7e7c7a04e7fab24a800abeb0762e68ea00022e4b8eb7127a", + "evidence/fitted-height-assembly/qualify_rust.py": "2ae45c33421a228baa648a73b04292997de5dbde1827a46761b86bc72c4c2323", + "evidence/fitted-height-assembly/verify.py": "eec1a0f1dbbe30fd13b2504c8a7d8cdca42438ee85819ba038189be37958ce9c", + "evidence/fitted-height-assembly/verify_native.py": "6c894879887b81e1bef75b57d0fec400171a8072df966d2930a636c6b7600014", + "evidence/fitted-height-formulation/AuditFittedHeight.lean": "0377b9c4281737db9f0ac2dce93996c1898e491d3e7229a0d9a98def44c92587", + "evidence/fitted-height-formulation/FittedHeight.lean": "ad716a0e642de8cdbfbaca8491a580621efb47e55a74f40d855ad5548363a433", + "evidence/fitted-height-formulation/README.md": "48518d44bad39490b4f37ebb77adad41bf3a62ec64553dcd9fa275ff629f809c", + "evidence/fitted-height-formulation/attempts/initial-qualification/README.md": "1fedaa32698b5a588d4474e628dec0926667c43a0d4a0bbcebafc98643325a8f", + "evidence/fitted-height-formulation/lean-qualification/receipt.json": "8ad26ff126257e5e2c6646f9567840a90c4ab6c24a1ffe8306b75cb8db969581", + "evidence/fitted-height-formulation/make_figure.py": "3808afad8158582d41cb06a404afbaa60fd3719771d4706b231d9fbd5c979ec3", + "evidence/fitted-height-formulation/qualify_lean.py": "6ebe10ac3995c4dafb7ae8549f23aa1fd52e270fcc2994e5c30b03cf11a7a0a9", + "evidence/fitted-height-formulation/receipt.json": "a6a9fca5568a4dae2dc66c17f4cb33d9b31cf0e362f71d2714bcfc82204aae49", + "evidence/fitted-height-formulation/reference.py": "d8a9a4ec5a99d64b8a4eef5df9b6f6dd3a325be3e402b5f0ef76db5aace9dfc5", + "evidence/fitted-height-formulation/test_reference.py": "682f2791b04823c38220b0ab42d6f961385c543c1093b2d8f47438fe78e4bb20", + "evidence/fitted-height-formulation/verify.py": "ae71e9f5ab6c388b886a8e007b4c081204444c718c92a547205265a35af63b66", + "evidence/fitted-height-periodic-repair/README.md": "f59a40337d5df87edb855d8080385e0440bb26f11e170646357cffc850f4f185", + "evidence/fitted-height-periodic-repair/diagnose_seam.py": "37df24a5ff9e949bab0fadddfc12de4aa169c613ba264cca937e698a59f109c4", + "evidence/fitted-height-periodic-repair/make_figure.py": "8334e2241437222061d032ffca1e112c1161807b021a9d3048fdc676311a0c64", + "evidence/fitted-height-periodic-repair/native-qualification/receipt.json": "a41509ec66ea63ed9e4771b7c18b8a1874f932c7eee2cb5815adb13861908a76", + "evidence/fitted-height-periodic-repair/qualify_native.py": "319104cd08cbdc3ea6a0aad9fb3e19ac81ca3261c636b446fc22cc2d07b2c94b", + "evidence/fitted-height-periodic-repair/qualify_rust.py": "2ae45c33421a228baa648a73b04292997de5dbde1827a46761b86bc72c4c2323", + "evidence/fitted-height-periodic-repair/receipt.json": "4ebe53e7bf37c8c64067e46858b42c5d6ac5f23798bc98215d1176111638df9c", + "evidence/fitted-height-periodic-repair/reference.py": "43cae1a869d0fbda43e93af58b2bf4ec4717bfd85231bbc77a41e6690e8dc477", + "evidence/fitted-height-periodic-repair/test_reference.py": "176f4af86a015396330363ec1d9dbd8f0ed523adcf496408b7fe2417bbe4d353", + "evidence/fitted-height-periodic-repair/verify.py": "d30dcf372a12f419999218be2a5ad62bbc069c63caf9a4fef53fe267e0f209b8", + "evidence/fitted-height-periodic-repair/verify_native.py": "da00c345bec70d2dfb6e0e5ca17e02d90c0c31f913c4dbae8fdc4e6a13b76734", + "evidence/fitted-pressure-path/README.md": "2496f842d744a91ed90056228687b65db2e6f0474c3e1ceff2207fa6f0a3ff83", + "evidence/fitted-pressure-path/numerical.py": "dadd6dfa5a89c787b88f28063e60b064966c2ef25e87012e6f155b02eb31bb58", + "evidence/fitted-pressure-path/qualify.py": "09b4560dea06651d4a59d149e8579589cd39ae541ed7317126fed4c56fccbf35", + "evidence/fitted-pressure-path/qualify_rust.py": "4c1aafdb25c412f07cb375931cbfedffc11e0c6caf3dfbd4026c8d73823d74a5", + "evidence/fitted-pressure-path/reference.py": "76264813031ff460a209f16a0d43306748b74d35cb31dccd88dd478ebed52efd", + "evidence/fitted-pressure-path/render.py": "f44106833755d5685a08f79481133c62f39a89562809a0d728604b1a8dbc462e", + "evidence/fitted-pressure-path/test_reference.py": "7052e80fa5dd69ada5d88446a91c8d7041363e55e774687eb6900492dd9d3db3", + "evidence/fitted-pressure-path/verify.py": "634ec8c55f747d60ddb5898fca569d4808b9a890dd0a66effa424780818db771", + "evidence/fitted-pressure-path/verify_native.py": "2de1a902d2726ef8a340e15bf27999c5cc6a072b4833e62b00ea427b56a94b7d", + "evidence/forces-surface-integration/README.md": "458d35419cbc74bdc629a8a5b1b490b74841c521527ad52a7fadcbf4d867d383", + "evidence/forces-surface-integration/legacy-replay/receipt.json": "7531e089766e59b85a2d8ad4ea131ac0a3cf0853fa8a6260e32ac8344db9957f", + "evidence/forces-surface-integration/receipt.json": "e8451b9a27726f195f77457eba1b8ae4a54361be2dfcf3815f1b5baa07c81f8b", + "evidence/free-surface/AuditFreeSurface.lean": "c54899c984daf23fcbe32774e1dea4b72e41a9663cfc8e7bf3708f254305cdf2", + "evidence/free-surface/FreeSurface.lean": "0e0e4ca38c2c1e034d805f94198391c67dadbafe66a477abe08fad8a5185cbe8", + "evidence/free-surface/README.md": "e34a688c181542ef8977a0517f2c04d7fe765bafb1df251ce7f3328179bfa880", + "evidence/free-surface/figure-receipt.json": "6a60299439144c30fe0d7fe4f7d228f9a932bdea2d4ccf58147ac7b7dbaa998d", + "evidence/free-surface/lean-negative-receipt.json": "55db103c62c4ef4611be15dc18284452139645ee6cebfb4168ebbb44c79ef3a6", + "evidence/free-surface/lean-reproduction/receipt.json": "739dff2bf5b4212e52fb4d37dd12425d64f2446a6d912fb2d3599efd67db4622", + "evidence/free-surface/legacy-replay/receipt.json": "98a6619f954f61114d6063f118f31f2b10536ca93236ea6b70da19fe8f076af4", + "evidence/free-surface/make_figure.py": "54b2c486e0ea6a47957871056858901fbe42cb1e4585528a3db26afed8a26383", + "evidence/free-surface/qualify_lean.py": "d97752fde80c2c8ad1637660dfb92409b60cda97d554474662bbbce3349b2863", + "evidence/free-surface/receipt.json": "997215ae0aefc96c4e76e029c08891265078a28249b35027b96a32b71ec04478", + "evidence/free-surface/replay-receipt.json": "c6dbb468cd583b01b8c177144d229d4d9e06f516e371bb392f4fafe44b9d100b", + "evidence/free-surface/verify.py": "a7e5c8fd09afe865943ef4b10655eb615d81eddba81a59f1a237e0912aadcf73", + "evidence/harness-repair/README.md": "9fd0d39cbecde921e5c6469fa7244b72842ffb00590976be466d8b30f72e835b", + "evidence/harness-repair/receipt.json": "fb97b86884171547d2d882ed29706fb2580bb5393b93337385bff0233c766e01", + "evidence/historical-hit-compositions/tracer/README.md": "7a46bffe1a2ee41a7bec72b50b7c2d48b60d935f08acb5e3c8d3b79ecbf29f3d", + "evidence/historical-hit-compositions/tracer/legacy-replay/receipt.json": "6d6d3d7962cc2a6378a776308de78464cc6c38f53e96f8f4b9769a3fc4f05a71", + "evidence/historical-hit-compositions/tracer/receipt.json": "1e49ef26f17d6262126e3c153c2627a194f1c44b0be40158f1d05dce4cf2fb0b", + "evidence/historical-hit-compositions/translation/README.md": "7a46bffe1a2ee41a7bec72b50b7c2d48b60d935f08acb5e3c8d3b79ecbf29f3d", + "evidence/historical-hit-compositions/translation/legacy-replay/receipt.json": "321997487077e566bbba8bfe35c661de2f566a911141f2250fbe706b298c8b35", + "evidence/historical-hit-compositions/translation/receipt.json": "7a0719f6fa1aa28adad80027e06d59dddda87998706fd2d8df4989c5f434395f", + "evidence/hit-reconstruction-composition/README.md": "a00c8601920aaa6547f82736af066a4e1ae899895fa5e6c17d5c2f96ccf9221e", + "evidence/hit-reconstruction-composition/legacy-replay/receipt.json": "04ae281799f7a300ab26ea89bc379b8316cd1a25a49e6c46bb93ebf44c403e04", + "evidence/hit-reconstruction-composition/receipt.json": "1fc20e758acf64891ab228db09926e578c6e7473486fc0fe6e7445ec7381b808", + "evidence/hit-reconstruction/README.md": "a7d4f1139e4e9469672ec066d281dd34c1993bf5933ae61f2922a3dbd9dc045c", + "evidence/hit-reconstruction/exact-red-witness.rs": "8ce5176f109fdfa7eb12eb4d4fafcc77eb77b32d71240bb1bb0ad9a8fb9fa878", + "evidence/hit-reconstruction/legacy-replay/receipt.json": "781efbd968c280e4d4fff3e4718d001b7a243b89d279193f82bc25e029496973", + "evidence/hit-reconstruction/receipt.json": "ba38f5fc4300faef1b61787ee6f1f15b13cb4b7f9f06eb0ef3c75e7bc8dddaa4", + "evidence/hit-reconstruction/red-receipt.json": "f9d619580dbb0383a6106b1ff554c60d33e00c22b238f08e1c50d1ac2676032b", + "evidence/integration-qualification/README.md": "460b4dab5692ad970645ec4b3930be1e568795e05927a0508d6b2720f000298f", + "evidence/integration-qualification/receipt.json": "b3d3ff4858660bbcc21dd43cfb77d6f55704c856861615e94203b931352fbaae", + "evidence/liquid-bindings/README.md": "3e43443b55598ca1f07dedfc251a8c4186b8525847a475e39a1f70bd5fcf5b5c", + "evidence/liquid-bindings/verify.py": "84ce066211c862cb24ecf7afb504dac18f9158543c0cac573c9e2f27b6df3c94", + "evidence/liquid-composition-erratum/README.md": "9fd0077c44f2dc303ed5c70b7b20a290c30302c024e6ca39a26d9021851c0bc9", + "evidence/liquid-composition/README.md": "12b066dd8810ee2b66c8dc09f180b0c8daa0cd6e603f571dbf36cb2d74604182", + "evidence/liquid-composition/legacy-replay/receipt.json": "a95aae3b6a64ee874ae3ad1824bbca453510c2aca3da660e0942377f0b469ac4", + "evidence/liquid-composition/receipt.json": "483771390e2755516da29233aef2081f7ffe2300d95bb53979b1c9f27b05e67f", + "evidence/liquid-composition/verify.py": "823e72530826ee15214b0c8da7f36dc9c1b3875493a9c595b725db41089d8873", + "evidence/liquid-step/README.md": "f0b2e0438d07618a620f46738f45cf9bb617ca9635fd50345d8f344806b46cc0", + "evidence/liquid-step/legacy-replay/receipt.json": "e2f8b9d6e31409a934b32c1a9ec5cc10e43db8e22a873d806528e932b4ac14b4", + "evidence/liquid-step/make_figure.py": "2e8a87124e68be9321cc8cdd23ca65df271117bbf4ab66c3fd14351b355a6a56", + "evidence/liquid-step/receipt.json": "75e0a6fc4c63a2b3f01d98b0f241303320f9a3fe798b9ad64b2cafc78ca2f861", + "evidence/liquid-step/replay-receipt.json": "c1fc0bac4fcc06e761cb1521e0b56fc5453a77a43086a3f1549baf92b08c77ef", + "evidence/liquid-step/test_verify_numerics.py": "ead1429c8375a27540bd9d06c5d8c39ad6c6593ca462443fa63c8158a325d7dd", + "evidence/liquid-step/verify.py": "43d1204b7d0d099f45ea666eb29a971b6d12a7d04b31d0b1a0ee753d00301cc0", + "evidence/liquid-step/verify_numerics.py": "da9d351e9b2fb64502a480dba12b4bd8bf3fbf9d22dc3708cd3139df629a3489", + "evidence/liquid-verifier-successor/receipt.json": "8ad31eb156090f56f6264b4d2f8f3dbc0c1b4530ad719b8617142487452e8bb9", + "evidence/liquid-volume/AuditVolumeLedger.lean": "7ed9affa73fade14f20fb1baea98db3a7d44eea0532d22f10e70c2469ef966de", + "evidence/liquid-volume/README.md": "c093dd19702f90de5c07f298458a2a59fbdbaa1aa5469831006096cfd1af12af", + "evidence/liquid-volume/SCOPE.md": "c93a0746a78d78c4bad5a5e0afab31f073c5a7be19ac7389ef60f8fb8c3c6f64", + "evidence/liquid-volume/VolumeLedger.lean": "35c34d148b36f03ae3429052e14bf948ce4e7587ea6113ae56160e17fd9d0f85", + "evidence/liquid-volume/face-area-fixture-compile-failure-receipt.json": "185d3db6b40aafdf0e155bbe4098a34c7c1971d69d76343e5b2dc14e12b82e85", + "evidence/liquid-volume/lean-negative-receipt.json": "2b314d7b6cf63f1531ff7789793d9274050e9c038844a7843b2fa4a5796be72b", + "evidence/liquid-volume/legacy-replay/receipt.json": "ff24fe5b12a7577969699ab92cb668c4aaf1a5ce0dcf5ca98b08fa55aa9e7958", + "evidence/liquid-volume/pre-area-guard-release/legacy-replay/receipt.json": "ff24fe5b12a7577969699ab92cb668c4aaf1a5ce0dcf5ca98b08fa55aa9e7958", + "evidence/liquid-volume/pre-area-guard-release/provenance.json": "cf1b9c2d9baac833737a72f7aee9b8f6683ec70267c65e0eb2711a9e4c6a4460", + "evidence/liquid-volume/red-face-area-receipt.json": "cb3d1b58ead7b07c552ddc79ce49fb1b2914f76bdb0c51487e026f44df93804e", + "evidence/liquid-volume/red-signed-zero-receipt.json": "0769a2aba56a567fddf8b04bf525a139daeda65533c7623e9f87a769bf750427", + "evidence/liquid-volume/verify_numerics.py": "872f78d8f3a9223ee3b01ea53a6f21ff3d3b1c7bdbf8c8b0449c93b9bcd85da3", + "evidence/liquid-volume/verify_packet.py": "88822404e280688ca26bde28febbf30122d913995595718b70d70cd6fb4cfb19", + "evidence/native-coupled-discrete/README.md": "2d28d1952daa70c9942be20ea68060f36990a2383a20dca70d8fac77e74ecdb4", + "evidence/native-coupled-discrete/native-qualification/receipt.json": "e179cb9b4329a28156213da215dc2c37f48f719e80ac6ce1fb15da488fc53a04", + "evidence/native-coupled-discrete/qualify.py": "f964e6654043963534d4a96c63a6c9c8c42741cd73b45c29ca00beb254432cc9", + "evidence/native-coupled-discrete/render.py": "ae7d19e09eb92613aa4bf4197367a6712844fa51a4ef089463fe948e0bea3a2b", + "evidence/native-coupled-discrete/replay.py": "0849f778cb27c6d127e93f5f29c73884e522de7535234345e444409e3115aa12", + "evidence/native-coupled-discrete/results.md": "ce687a1f619959f6a21895210202aa2d3378f2f092f5c38ddee4302a7887b85c", + "evidence/native-coupled-discrete/verify.py": "716309e039bb74ce88dde2df8f3cfa69a2d2658302b2e03b399378d3cf8eaf08", + "evidence/particle-pressure/README.md": "83673446a403537aa56ec87f5ee158c7d5b3907f44e65857ac14426dd00f7964", + "evidence/pr5-evidence-repair/README.md": "9605343ec51f6fc188780029ba79ef0f3b4969bb91702a71a9c271c0d90fb29a", + "evidence/pr5-evidence-repair/fresh-replay/receipt.json": "183465c169782184c13eb12e53b1dbdf915c3bad355edeee7cd3551ce7256238", + "evidence/pr5-evidence-repair/qualification-receipt.json": "58a24185aa52815d08903d1b45c4e1711ac235a2651133f306b23a954282b409", + "evidence/pr5-evidence-repair/test_integrity.py": "798e95b17ad58fa83a0f9cd8d54979ea2779076c055e06873196d5d51700a11d", + "evidence/pr7-verifier-repair/README.md": "abdb315a55a075655e67e35a3e9faf702da489ff50b2e518dd4ec4f82d60cc16", + "evidence/pr7-verifier-repair/receipt.json": "9a6399ee58939928e38c810e3a3ea1270f6413e41ed8588d4fe7b236219a39c3", + "evidence/pr7-verifier-repair/test_invariants.py": "14504883c8b8ab11cb31bcfa7ca2ab8b8a6a745a805c3fba606aafb0628f5116", + "evidence/pr9-git-isolation/README.md": "66f6b6ee7ac4b170fbe7793f42b9aa00febd345156832247437dec197635d700", + "evidence/pr9-git-isolation/probe.py": "4663163633ca937e8620dab180d77c15d42aa80a636c89be0145c2cd60c64fad", + "evidence/pr9-git-isolation/receipt.json": "f38586b2e5c3a2550a346837d8d8186927694e3553289ebcb81a1aeaa1136260", + "evidence/pressure-divergence-restart/README.md": "3212d845e6937ac46df397c3198ad33e73894c8cdae53c647dd90f9085923d61", + "evidence/pressure-divergence-restart/instrumentation.patch": "9f441df8350b99dff93454c109dd71f5a9676ef5da8d6a244e01058f7b84f325", + "evidence/pressure-divergence-restart/probe-pr3.rs": "0f7781786a40fcece2b7b01af4e5ad386d9e8e457870e923533d33c5b9d4c1d0", + "evidence/pressure-divergence-restart/probe.rs": "5be8fe73716fed669cb09e46339f0aa3c0f0b188e206d1551adbcf1a66c267e4", + "evidence/publication-terminal-repair/README.md": "4b08c9f77c9df2ca76b32ec76a29b6bdbfa865887350a643bcd1653e6a0ad34c", + "evidence/publication-terminal-repair/receipt.json": "b4e0d82b8ba046a5cfedac543b52ef4b688911d943d89feb659093982c763bc9", + "evidence/publication-terminal-repair/verify.py": "f68166f1e85c4b12fdd9115d62468e56c5c019046466d16264d911d551e06d07", + "evidence/repaired-stack-box-flux/README.md": "e52575c9eef6e3163a906971f0a76e5ef9aadd829f3cc71e8752bfab74023e4b", + "evidence/repaired-stack-box-flux/legacy-replay/receipt.json": "8a1d130eb0568ebeb4f65af18dc192c655abea919d9ed7bec35cb6ea9feb08c9", + "evidence/repaired-stack-box-flux/receipt.json": "74c827a9426761822f482bb15e61cce8e9d26aec4aa165ee8e8496e701ca9f4f", + "evidence/repaired-stack-tracer/legacy-replay/receipt.json": "3a042f2112e26aec31668f72f9327ef1629b456281763e575d8f81f42c005ce6", + "evidence/repaired-stack-tracer/receipt.json": "c4cef0c43e7d55239a79ebc6564d7f4d8cb6eb0e60c8eb8c08a29320e9f3087b", + "evidence/repaired-stack-translation/legacy-replay/receipt.json": "581a7939275ef6bb3ed8d73135f25c3d95fd3b820bd58e2b4bbd64c8dec708c2", + "evidence/repaired-stack-translation/receipt.json": "3ca581ff8c4533285a06677259274fab822c87acfa8b2dd5cb3fb41872f25776", + "evidence/result-integration-qualification/README.md": "b410780c294e4e3af4b53aec3dc0cca71ca55a2f29fc3dae75b17da86beb5b73", + "evidence/result-integration-qualification/fresh_replay.py": "5bec091ea8a1afca8615a31aef994f2c3fa15941f05c0e68d21cd15632aa4e6b", + "evidence/result-integration-qualification/receipt.json": "89dba7b6a3cff119dc3a423e473ea09a5fe2d24182fb7980b1dc4f07ee6a6c47", + "evidence/result-integration-qualification/replay/receipt.json": "c3076342c755b9522432864600c41f054f9e73e38536a58889d7a005254a8390", + "evidence/result-integration-qualification/verify.py": "02f4120739c47fbd18c31e7d0ff2e727434487ac2be5a6734bcd2237b663b19e", + "evidence/result-qualification/README.md": "c8cefa0b3934c8a6e583bf5fb27d1fecea26ccfaaeac173b70beb81063fd970d", + "evidence/result-qualification/verify.py": "3c5df079fa3139722a88ba6b4697cc6836ca674f250eb78002f51bd1b93f7431", + "evidence/scheduling/README.md": "d9d33b573af4f3d0ffaf4af754e0b582adfb582b440c2a0b91c5cc2691498273", + "evidence/scheduling/measure.py": "5bd8c35c168ba9492198d5bd29dde5d6dcc3602f651eb41fc5b0ea827cb46953", + "evidence/surface-queries/AuditFacetSelection.lean": "db52db5d39ba70c488517315eb3b5109cda0cff84bdc2335d35d6377be8d73b9", + "evidence/surface-queries/FacetSelection.lean": "710b188d7c214d8cdc3605b41621fd6685c481567c0925a4cd4db0e2ac47d60a", + "evidence/surface-queries/README.md": "4577fab44f64edbfd26562bb1f269f0ceb3d486bc34baccf89a8df3eeed12503", + "evidence/surface-queries/legacy-replay/receipt.json": "f8c49f1066529c679d02738f5d4feedf5c175835a3e68c23072c3f04be837910", + "evidence/tracer-barriers/AuditVisibleWeights.lean": "04fb910db2ccaf102f7c0fcec5225708632e3434f63b244336147ec2e3329297", + "evidence/tracer-barriers/README.md": "902e052db63485bbf003ff0f34f357c349d0393bee1d6af47e4bcdaa1a4ddf73", + "evidence/tracer-barriers/VisibleWeights.lean": "2fa7b0314c00859b55175db893dda09d18c4346bd87083dc27877a8f40b581b3", + "evidence/tracer-barriers/legacy-replay/receipt.json": "70b9a5a68e4203a3878ea38d7f3e99294317b6e0971ad70ec62ca417cec83bb6", + "evidence/translated-viscous-flow/README.md": "4d88d3d0dd7812890f5da517408bea8c5c2c5c876d137030c0b9f2615e3e1ec3", + "evidence/translated-viscous-flow/qualify_native.py": "aad400949fc62b8094235089853493b687824bf3a5207e46f3dc7f7d217bc986", + "evidence/translated-viscous-flow/qualify_rust.py": "bad2de6a6e7a9ee4787facd61a2379ae443571185d69f32ff78b6c33610fca7f", + "evidence/translated-viscous-flow/reference.py": "fb64e81061ef283f1f7bb6ebdd07ddbac6ac370d09be3302a24e9695b5ef1b9d", + "evidence/translated-viscous-flow/render.py": "22dabbf891906188c81c58f56714f283e2b736110162d1d4b62647d92e7906d8", + "evidence/translated-viscous-flow/test_reference.py": "9095e9bcd6859996a13aa143cc5bbad70c7c2deb63463a8d6c490de1d4f25244", + "evidence/translated-viscous-flow/trials/baseline-source/examples__translated_viscous.rs": "cd21ba55572510da15203f2c0b0cfc268a3289248759222b967f20ad51b82c3c", + "evidence/translated-viscous-flow/trials/baseline-source/src__lib.rs": "8f194e2204315c81d907f0ae454b2bd91358ea950f9bd4685ae66225b6222134", + "evidence/translated-viscous-flow/trials/baseline-source/src__translated_viscous.rs": "4702f4e42ab31c3122fa7b1fd332370a43d33d4fd6fd98ec3d52abb97e28fed7", + "evidence/translated-viscous-flow/trials/baseline-source/tests__translated_viscous_contract.rs": "c122407674f191512ba27668d2af5c9e35a0cceb1ece911a3efdfe0c30bcc06d", + "evidence/translated-viscous-flow/verify.py": "55f1c9c30fee22bee4dada3a2592808e1c514a38c322e96f0cf1c69c818f1f11", + "evidence/translated-viscous-flow/verify_native.py": "d5fd7d6b043a0679db9596a69371e119b9e48df6c5bbaf5481394c5df5f141fa", + "evidence/translating-surfaces/AuditTranslationFrame.lean": "329a225cf8e8305bc1455e23850bda44b69738414cabfc409f6902dc675fa4f8", + "evidence/translating-surfaces/README.md": "588238e527deb1c17a5a6fc56e786a33ff773d4c285d71be4ad0e38147be6aa1", + "evidence/translating-surfaces/TranslationFrame.lean": "8a30d9be2cb11d10ad99d9290901614020b78642b710ac400efa1bc55ed2f64a", + "evidence/translating-surfaces/legacy-replay/receipt.json": "394c41777e1e99c80a4106e474c60ece30442b8dfc3a8e03892eb7640a92460c", + "evidence/viscosity/AuditBoxViscosity.lean": "e36488fd8edbebed2dad395f29e4e87fe43e3c4e6d20a9c30671754d66cf9bbd", + "evidence/viscosity/BoxViscosity.lean": "cc4a3453624d8a0514f2d92918d6f016074f2409dc4cd83ce8966e25ee1c5c16", + "evidence/viscosity/README.md": "f2232c404cd1de44a00d91310a2e9d4583811aef339e1d300382469b21b1a757", + "evidence/viscosity/lean-qualification/receipt.json": "b0c2c683a6e212cc0374475af96065dc34d98a59989822359881bb1aefad32eb", + "evidence/viscosity/make_figure.py": "fc4c51ed6df76ec135888242fcc7fbb3adde91324c51892a529d8b3d63d5dac0", + "evidence/viscosity/qualify_lean.py": "61063fcc9ffbee47131b1accc2026fdf98ad2653ae6b0f2a14df7d2309778459", + "evidence/viscosity/qualify_replay.py": "2fa155311c42ce913614dee685790a31039f4bc33af630ceb5664c690ace2c22", + "evidence/viscosity/qualify_rust.py": "2dea0fdd1de25cdd0e6062cb684379777e440fe86f4f469599694fb5ce88a0fe", + "evidence/viscosity/verify.py": "1491e4f96b7499727216e4502d6c5230ff20d2fc2f2b7c38dfdd7a1c48de8017", + "examples/ai_pressure.rs": "1231f6cf933132841fc189f034850797ef25e16dd9850da9106a1e58e48710b4", + "examples/ai_pressure_trajectory.rs": "c4d37c4ab0aa8d10855b687290c2d2ee6df7e5b7390da530dc9da6c8fa767661", + "examples/aligned_stokes.rs": "52c7852f9688c62ba33ac6f0de2fe0df669214d7eda9bd1566332ea211f129f8", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "examples/box_flux.rs": "0f4f642e746644eaaa7fa3742bd3f6e89ef6e8e952a9e3c1bf0830824eada212", + "examples/box_flux_step.rs": "8aa8c3e1168671605a75e96b7cdb17ed01abde9a6cf57300a8664a2fd6698d0e", + "examples/cloud_frame_lab.rs": "083dc1a9464de2f60122a09b1736632059259a3a63a7fe2dec5b416e32fe451e", + "examples/collision_mesh.rs": "a1036f9f9cef2aadc3cf3a7c7f2b8d291860c64c2636e518968ee777599a64ef", + "examples/column_interface.rs": "ad55a5c74a7a857c79b06b4ac44025cce1c11782533499bfca3028a6b1b2af2e", + "examples/column_mac.rs": "b9e6d8e4e3d34fe12b04af40ab5dd9f98fe4ffe16aaad669cf00ab74dd6a81cf", + "examples/column_momentum.rs": "803835cd8c22e58e9087d635cb07e9ac02aaebedcfaff70405ded71e866046f8", + "examples/column_no_slip.html": "fd17a13ecf83a8817682a9b9a3e0d5a0ede71ea5a8458c724515d8c12e739c44", + "examples/column_no_slip.rs": "88316856dd6d08453807e67b36035ab848c556435cb55d61222b7bb73abd1ac8", + "examples/column_poiseuille.html": "cf12cc976a4d3ae45e767e380b3c5104326e78ee99c00f744e3875968ba0a594", + "examples/column_poiseuille.rs": "d44c8a14e2418c4b04ae9e030117fc08389ab8c701df62313941c816573c26ec", + "examples/column_shear.rs": "2fc9fc6797580365b4c86be0c2de5cb63d22ea062165f85e4a1c1322b121967c", + "examples/column_wall_shear.rs": "49c22a359ac4d512e2b564704e062483173a5dcc31af7d5a2bc409b2da18d72d", + "examples/compressible_reference.rs": "6eaad82dae42b7c6cd38fe45b2a8a1c140d9cbbd1d4b097fec607b6d7307900e", + "examples/coupled_discrete.rs": "01f09d383328da2af3a094d819fcfff75272ca6c812d8bd66516fbd855caa3b0", + "examples/coupled_discrete_identity.rs": "17d07a49f71cdb198706d7569bb222fbcfdf62d25342b9c07c35fe6edc80e7ed", + "examples/coupled_layout_probe.rs": "d33838f8f533c9cdb2bb6e9fb6938fcfcac0b24c948da77f521b26f632cf02da", + "examples/cpu_particle_lab.rs": "3e6f4eb91403c285805115733fd423e2ed071b6f3024a49daee35db527539e1c", + "examples/cpu_pressure_lab.rs": "60e0782c88c3e61fbe2723c81b9f9d4863f7c35db02739732570d076af318c18", + "examples/dense3d_sequence.rs": "47a4adc4446a8e084c1fd580f3b08c36a3552d573336f9e7d7b5689c07b50d94", + "examples/emitter_controls.rs": "c411cc0826169dd117c09166c7a5ab30594c873373dc95bf00937ade7f28f0ea", + "examples/extruded_third.rs": "bac7303bda410e3856b6fcd7a9511ab5ebb7ebc8355b72978b66fa8f79cd3ebc", + "examples/fitted_height.rs": "563fd60664a956e2e7049765b70c7752c04c4191d4788e8917042128efce899a", + "examples/fitted_pressure_path.rs": "44144d68df4ac6ccbfcd1432f07216a3cbd45f36e77e2f949dce99e4bcc6fd2a", + "examples/fixed_bottom_ale.rs": "8faec9c41e38e793fad09512632891415959b228d01e0cd8dceb46c84c649089", + "examples/fluid_physics_audit.rs": "a2ce3e4f0d3f8b2bca2ddb0f04f33d462a5ff17912c9264efdc60ef1f630f830", + "examples/forced_smoke.rs": "945462fcc489b492e6df08bf82f396b4f9b6fce4ee96efbc69969b2309c0bcf9", + "examples/free_surface.rs": "24f5d252fe6fb2350c94a773c92482a65a5ebd1f6f8672d4e67fd85b770cded8", + "examples/game_loop_session.rs": "394155c0f3801b070a0e291bd4708d69cf1135e118e7347997d77fa517829cc8", + "examples/grid_geometry_reference.rs": "edf31bb8e5ef6f98d9a79b100971899091052660bac1c76b353ae76d3fa0f1ff", + "examples/grid_geometry_reference/diagnostics.rs": "8eb69ac519bcc18ac00ef7b553b155a56dcbdd1f7ba35e96238e92aaa0ecca84", + "examples/grid_geometry_reference/geometry.rs": "887088bb28e135782f86fc0dbb70088e10dbdb8d590719b0d1eb3847582a0533", + "examples/grid_verification.rs": "352b0614993edf83d9b8f987cf72569f8f24de5b18c67d1ea128b1a1dec457b5", + "examples/grid_verification/carrier.rs": "bc5fc4a3b0907d6edc5ce68d51b509faab7999e69db581245568d45dbdfababc", + "examples/grid_verification/channel.rs": "0c97e53fed0257462bf599be32f8b97e0af3eac46a5b98c360f83e63cc9e9964", + "examples/grid_verification/sphere.rs": "ebcfd81ac03013dc967d656aa6f6ebc90de23d7d8e404c853bd167e6c854f8fa", + "examples/grid_verification/transport.rs": "e7617761d96c1dd473fe35afc60d10dad9f4a79696e4f6ba7646c40db070a6a3", + "examples/headless_session.rs": "07b884a8cd399311551db2970f7dd994d8e61ba23206fe79dad37445c601ea19", + "examples/liquid_step.rs": "ea38303027b9c88e5ba8d5f3d7e78f1de7032ce7349795fde6eade97c0c1d777", + "examples/liquid_volume.rs": "5875c7ee5f2fc803a26779e6a824c0844c4ddceefec18648a08edea0fde2168e", + "examples/material_bounce_lab.rs": "8ef3f4dc9db690dea5021ede9ba35c98a349cf2845b7b47f9beca1f83d9ed984", + "examples/material_partition_gate.rs": "b50e2d5e896f9d7cceb90157635cde1b54bab318f5addbb294da469818d7c48f", + "examples/material_partition_gate/model.rs": "21cdd85ec52bf0686e99a90eaf99e5b04e29b6ee487859162e3a3cbfd246c4ae", + "examples/material_session.rs": "0f56645f825f137774962bb0e5a77d5d0fcb2163424cad9f49c4efbb7614dc74", + "examples/obstacle_flow.rs": "c153dc8e97f5bb6c7e662a63ee6c76a255356b3cda7b13ea3847d80fbbbb0254", + "examples/outward_probe.rs": "20e6a0c25aec4018ca206d9aab33b57ee58e43e9eb7c22d20da74e9d77d3b1dd", + "examples/particle_adjoint_selection.rs": "ef484f655da04ae7b3bf2288471f8568ae062dcdc89e567108c9e4d543942469", + "examples/particle_adjoint_selection/model.rs": "da1fecdafefc1ae8dfdee74cf5367a230e92476fdb5130af1ab07a6767256db4", + "examples/particle_planar_selection.rs": "b746f302718d81fd64fad4f0f0466462d972b870cf7d67eca3de9f14c8ca6fd6", + "examples/particle_planar_selection/cloud.rs": "62eb3d59366421f23b84baf678e7f4e7247112182720c0210b059e49a7669a3c", + "examples/particle_planar_selection/eos.rs": "1c40e49c33929af3aac7a52718eedfed181b43efe2993205f22074227b3d15db", + "examples/particle_planar_selection/fixtures.rs": "cf0b64c15efc3d0aa0a32664d8a8bb77436c90df09159a265333a41f7078d3be", + "examples/particle_planar_selection/isolation.rs": "c8454062461234b3c92afd443372c6ec2afd051006e52c899fdd8d5039e63d45", + "examples/particle_planar_selection/kernel.rs": "36edad1b3121dafe87bd4810af0f73c3babc339c85e7b45e1cf367c04047265e", + "examples/particle_planar_selection/matrix.rs": "97855af66d96197331e344db09234472b761166bf361a06bb9438453bad7a516", + "examples/particle_planar_selection/planar.rs": "e22f868592c5d022609e861f215c885a06b76615bb634beb84082ff805fcbde2", + "examples/plate_coupling.rs": "7ad16deed68aadaea7ca5b03ad30716c75e56d092897dfa6b11394d074cede8c", + "examples/pressure_session.rs": "b81d7358679ec44a019f9ba7cb4912b1a605e6bacbaab4107b3e15b8e04999ac", + "examples/production_provider_session.rs": "74a6b847bd02523f284e51368336cf5f483f9dae19f4550d896d35416d7f8005", + "examples/recorded_carrier.rs": "43b0e7702d8e83341f9d0fa55adac936f578020acab64f4ebf1f4cdfd6b38f60", + "examples/recorded_configured_provider.rs": "d00e9504f395e3e46d016e157eb68bc2b95124a69c1fb8cf88f2b10da58c4ffa", + "examples/recorded_material.rs": "88996ea3a841d089096cbe3826626636a4000d952db4f0e0394bb26f2edfa7ba", + "examples/recording_storage_probe.rs": "3cd82787af8f36da99906f07b696e74fab48fd9ce0aeaeed76f20744d9197a53", + "examples/scheduling_lab.rs": "170db497caa9d8a6101c4966c5b59ebff9f152116a016fdda2b877739106ff6f", + "examples/session_support/mod.rs": "d74419edf6a45fb79ab444eb4977652ed68ffa047bb0f4ecb97866452b287db1", + "examples/static_obstacle.rs": "d6a6b832d9016335310211df215f19621ea01fd6aaded21bf02583d1c0187a66", + "examples/submarine_stokes.rs": "229287012e30d454ccfc6c160db6d2cdf783da36c43c27275c76b54e2b7c897b", + "examples/surface_queries.rs": "863cf617e25af715d8a1dc873a51067ec43b7d191d5cd94f2717c5712eef2be7", + "examples/tracer_barrier.rs": "48501413c3f16d2ffe3c38e2340e5b4d30f3a22454aea1af486f7462bd3cc811", + "examples/translated_viscous.rs": "599188c4f022da4690ac42fa1ffc1f216bb1775dad5f252daa7c42e1ceece62f", + "examples/translating_surface.rs": "b02d9021321929f4f70bc0fe8566a77a0c27680c45bdc26d969be560105b3462", + "examples/viscosity.rs": "2e947a838c36a30a51e0640216c8cf956e4cfcd7d70978552a22161d5da6752d", + "examples/vtk_export_fixture.rs": "32e5ee4e48321e93623f958792657223f535b0034fa5abb456cd6e7fc12ce6b8", + "experiments/README.md": "bc438395236b2c812248b7384d99d544987a495bd216f02a0e12549dd43a5904", + "experiments/aligned_stokes.rs": "d5b08df55c45c62fe801749746ade40026f53a1c14bce4792587fe0a9ff022a4", + "experiments/outward.rs": "226f82a681d1a8c0b0fc89e65de7ec40dcc085883ec7fbc5990f19ae36af292a", + "experiments/plate_coupling.rs": "1c8e16ebdebbbcf15e7b53ff09965f556dae47a6d06e7f5c060bb13959df7de2", + "experiments/proofs/AlignedStepAcceptance.lean": "93a802757e5d338a2ac674412fb4c463f75cfccb58d76076e6cfe968f3f76344", + "experiments/proofs/AlignedStepAcceptanceAudit.lean": "9374b1b01ef28ddb0ce53ba9b4700562f51048cb179c381e57fc9da6be89221d", + "experiments/proofs/check_acceptance.py": "b29a2fe54f1731040175d5665c144b7b74c47d640475c087def03cbf19623efc", + "experiments/submarine_stokes.rs": "ef534615daf2e2f304be064536cf08f54fb42d2ee21ed220d5ed1db524889efa", + "proofs/.gitignore": "54b47581e44d6c752738f08d8842338d0a43302e12d4cbc7a69c549cccc9df11", + "proofs/AxiomAudit.lean": "afe91662265ac2bd2ca79755872c396679d7a02f99e1435055aeb58a026053d6", + "proofs/README.md": "9ee8a7345ba99f8686f5b3ab6330d3107a1506ec87a1332b95bd7de6315299a5", + "proofs/Rheon.lean": "7270cbaa05a3ec984867d89fa35a7e4ffefe3a94a5959163fbe03737690154eb", + "proofs/Rheon/AlignedStrain.lean": "4a76bacb1a49b2c395c1718ce45e2ed134217b78697766c099e666d09001ae32", + "proofs/Rheon/BoundedPhysics.lean": "20dd53b1b137a01f8b04de47ffbe8474561696940e17ab1ed4d3bfde388b03af", + "proofs/Rheon/ColumnForcing.lean": "9199bd6d06f254e1cf31d8c7cd5e8cee951d53a5325db8bc78ef5cb449226211", + "proofs/Rheon/Compressible.lean": "c396825f47b53981b0e4882bf3fcb581ddec3fb449578236ec4f5f5450be0d85", + "proofs/Rheon/CouplingStudy.lean": "67b27256aa37289ae3b5885c53b37a0a3d2bc42fc2c7a4415b0ad2d8d326caf5", + "proofs/Rheon/CpuScheduling.lean": "76e427ae8d5ba32ba3ee5c67a8e25ba09246dd5fa3445968f72fe7e34bff1375", + "proofs/Rheon/Discrete.lean": "70a2ca5d2c5cbefacbbb8742954375fdfe8cc25c3c5b8afd05738941cfc5ee0a", + "proofs/Rheon/EngineeringFlux.lean": "2b07020a8a8059e2eeaa12920217b254f57072ed3ebac319f3c7dcc5690aa5d7", + "proofs/Rheon/Indexing.lean": "862c33164e75daccd43603c9b5a61473fd825885d9106b766a35204e578f60bf", + "proofs/Rheon/MaterialPreview.lean": "a7e7668b6a364b2388e2362d44366fbe8e7104656eebde0964fd11f454a0e95e", + "proofs/Rheon/ModalDecay.lean": "69c643dfd3a523b8146eedbe918e68f848310d29349bc98ba21a7e71c1a83f2b", + "proofs/Rheon/NoSlip.lean": "615283345c18331b5c19fba94cf738a55f089978df68d2ff67f109ae219b4e3c", + "proofs/Rheon/ObstacleOperators.lean": "514cb760f16dd55d6bbad78b30953fcf3b90f3247b2185c1719b8463b6531680", + "proofs/Rheon/Physics.lean": "26cbb4f75076c7e70a90da126f96622b75044befce26a4c17a50066c76e96050", + "proofs/Rheon/PracticalStudy.lean": "20be05cb0916c5b2fa679ae20b060d5329050ce67507e628ccf4f1ac8897f49d", + "proofs/Rheon/PressureGauge.lean": "c004131c86f4b49a9b24759297c70731acd6c8ae15da5672b54d33f562477fe0", + "proofs/Rheon/StaticObstacle.lean": "b93a60d832775dd2177980806d149cbe0a42fef03bc3993f10ed44aa8451c4bb", + "proofs/Rheon/Transport.lean": "f967e593db1df0ec945ea6830e67b991e56da168e9f6e3f2d42c4c5866c5cf06", + "proofs/Rheon/VolumeFlux.lean": "1125200cd92c396c0d07dab7a159c08a8a76c822f2f88e2cdc841ea9e36d7364", + "proofs/Rheon/WallFriction.lean": "3aa15f9e4b5881181cdf438c88774a5eec29feb1a849b0329f0f95c34fa551e7", + "proofs/lake-manifest.json": "6fca0fbcd73e55375c73b69fcff247d94bf70753439a2791a1af392d3277d730", + "proofs/lakefile.toml": "a1d5685a03cbe77cd5a9b5c58e0229282fd3173797e62f3d307bfa3597a2d10a", + "proofs/lean-toolchain": "55e97be96000b5e9e290c9e74482e5e317861499a5540353ce845471bded8cea", + "proofs/scripts/check_sources.py": "a230cec2ed8882904524f12b11eb644d9120da46b9b71c95d45fbb313466402e", + "proofs/scripts/test_audit.py": "7c2116a269c0dd04ce44123a737c3de7d4fb40980436a83fff6da77b17656b5d", + "proofs/scripts/test_bootstrap.py": "08d2ead62ec79e0bdf5349223de6277610b42119db510aec808d1ec27924f041", + "proofs/scripts/test_check_sources.py": "e53304e8bcb0b11a61e434d2e8be39e0b42e37a11d82af689423e97777ba4899", + "proofs/source-inventory-pr24.json": "b18c9562718881eecaeae54d24f5a9427675b7977dd764a0f23d0d784b1dc2d4", + "proofs/source-inventory.json": "4eaa150ae0513844e95da153535b7d23befc048bb6e07adec3ed26eee6bc8a1d", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "e268555e0ebde7080f0ea8b2e8e398721fd1a65ec60f1925a314ace5f73d3488", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "c4455879373fc71eaaf398fdaa230c4d0b115dc7ff0a9da6356afeb24cba23b2", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "cf8be77bcc46e192d0fcf44e8206d1e0a54a88deefcd178083ff39263ad957dc", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "5463e18b3b5a139c448dd327b23318605664e90aea4690187981177e7f68e60b", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "06a9e7f5724b73c101a38dcc2c966d37b640900495643ea7bc04c13f4630f278", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/force_run_policy.rs": "cbb784c1cc403cfd524b715a52144c662f428b302014af1794bb3131d09bb97a", + "src/bin/desktop/force_run_policy_tests.rs": "99d6b9e8b2a98eceab0514510d3f54873da50fdabc7626dd3896d45dd3c53383", + "src/bin/desktop/force_runtime_integration_tests.rs": "04ba4f5883e48c5548cb420e17b6a6736436871d8e6c7792487939bfe5ed29a6", + "src/bin/desktop/force_runtime_ui_tests.rs": "92475c2b577510a8f8fc11217f7eb1a5361dcaef20ade99f198f60d5b654966c", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "2e6a9f4f44e4a3843bc1c16953e1fc2f182a08b3a25e70f968084b454af8a438", + "src/bin/desktop/native_presentation_harness.rs": "8ce8efa63afbe0d09e22996ec00478de331fcbda7a5ac83882f2ed3fff0d8ea1", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "b25f07c5d9f4a27572922956043224c35dde35d9a0d987ab8af4f3f3151c91f0", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "39e8982fffaf4e9adcd0ca0c60f49eabc96b829957bc6d9c05479c80eee99daf", + "src/bin/desktop/scene_handles.rs": "4818b85644a2891de562adc00fc203eb59c674bbf46aa88cd440bcab6477eb22", + "src/bin/desktop/scene_ui.rs": "e98c8aa0449b8f1adac4eb8a5bdc9a0951bd0b054f4dd2575d31dee30990c922", + "src/bin/desktop/scene_view.rs": "d16851804c3aa727c7fdf658a821ef8c8cd2c167e853b72d02604f2a14dfa02f", + "src/bin/desktop/settings.rs": "72a2e42de38100fa7cb517bfa7c1b9377975d23c3c4cd887615c296549c093c4", + "src/bin/desktop/setup_ui_tests.rs": "278b7a20f5d48a4e8a6c8ee2a4b18f0377f09f78bd64b34cfb20d4545ebc2563", + "src/bin/desktop/timeline_ui_tests.rs": "545e109f6d6808cc31482b8cffb4e21f8518d705424327728dc6c5d549a73df5", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "4a365fbb1a0f48bd016b3d673b30e635ad26390205cb22c24d25fa46738b6a08", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "6d16349502d2ce6bd3a2e07a5285cd1538703a48ec591215d7cb327d435a902a", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/force_field.rs": "adecbc5f92b89179a2e38885be2acbcddd42df40061f00ffa5d758224ed045a5", + "src/forces.rs": "7b3b48c0813c995a937a44ca1b624411c59dde6419b62041b67456cde2d692d9", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "6a9f704b00321be1cb9699e4d81d953030a42e3794f5b5d03ce548490f51f7b5", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "538c498122bbc1045ae59d7363ff87e1dd9a40003fb48eeae835228ad4c65893", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/projection_step.rs": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "4273be1af82f7a1ab9c0f141fc58b663354e5fc96e625835ad1dbcef2588af34", + "src/recording/carrier.rs": "5a9b10b929f650423ad9e58bd7047bfe80cc7bf18138d74bd628c2f3f17af711", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/force_fields.rs": "2cf3ec9ec191c35c814d48ace301feaccd6cc73311a66970c9d112dad432c4a9", + "src/recording/material.rs": "e72e256aa3af46fef9002822de5281caf1de66ba070eb2109f77b083e20ae6ce", + "src/recording/projection.rs": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588", + "src/recording/projection_tests.rs": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d", + "src/recording/provider.rs": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "src/session/projection.rs": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4", + "src/session/projection_tests.rs": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "0abf525a7535e48f04acd3ef408c15c7d93242906195f778fb0e1e8646dff254", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/advection_contract.rs": "2e6c78e51d457bfe0cda4972dbfec5677e9e3a5e4f42a8647aec8aa1f4b73f2d", + "tests/aligned_stokes_contract.rs": "7b43a757245edc097874bfd23ec0690d1d4a8df9eb6186ab86e843720dc7a687", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/box_flux_contract.rs": "d3a23e9ae3973044183d22c5dbc9b2a00c2d0d731cae1777426337310949133d", + "tests/box_flux_step_contract.rs": "4adc5ddf0e878cffc3e70b47bcb0f98cad07aef4489a41f9fa7d1695304bd94f", + "tests/cli_contract.rs": "83d3c9a839dd2c722b3c509e051350a6ca1c754cbe0ae5dbb521e7d3346c6aef", + "tests/collision_contract.rs": "8625b6a0d01271b90f17fd22b0ea4f5d0869827fad6537720fb631ce565367ac", + "tests/column_mac_contract.rs": "3fc23b6ff935696bb96082e824cc1a5c2cfe32821559074f6ec00b3b8000afdf", + "tests/column_momentum_contract.rs": "4ea859692dc437e98bdce6fc3fdfb55a8821ffc52699c8a7596ddc7d75e8aec7", + "tests/column_shear_contract.rs": "466dab4d7dd6cfa464de3428da8b0b9aadfb3a2699810ca302e9bec90db62f12", + "tests/column_surface_contract.rs": "515f39b3bf06fe23c1115201cefa1d4f1d69660ce4298daf3d4b7e16f5844759", + "tests/comparison_archive_contract.rs": "ddb88a1faba015e1f636d66d6dbc8a770a1875ad52ada6d6a0a773b5c0e4f0e2", + "tests/comparison_field_view_contract.rs": "2bfcf188fbde8ba9908c90365eb10a3e708853d0a928267541a5cfb5358b22f2", + "tests/compressible_contract.rs": "9f1582b436e268a7bef6d42dccc3ff0754b963942301eb26442d7f33790d5b7d", + "tests/configured_archive_binding_contract.rs": "821ddd7d173c84453650d2cde938bf024d907e2f062a894ea2b182e44ac56932", + "tests/configured_provider_session_contract.rs": "ba4a8f26fbf0324d705a80a4b108b1e9d09a293ac2eb29a8278fe01f65dc5a00", + "tests/configured_recording_comparison_contract.rs": "8205a1b5ddb1248d545edc27d4b23f27fb89717f311ec336d01bb3202591f2fa", + "tests/configured_run_sets_contract.rs": "1356bf9a8ed17fb724a43324f18c8ce8c4d2f863fb984abb7dd31c5de9382972", + "tests/coupled_discrete_contract.rs": "3a730e8dbeaf8fd81a19eee5717b4719f62af83e42c395691535a1ed6f1a0116", + "tests/dense3d_controls_contract.rs": "678058ce656cde9d0b8c5f3ac9de4da5a81ca3f76d5003c1954ff3929d964625", + "tests/dense3d_sequence_contract.rs": "016ba99a4a234ced02a1613d5cc4af6072f3e070f185bf8ad25ca73202b128a7", + "tests/diagnostic_pressure_oracle_contract.rs": "b492194a384779fd15ba967bac93a5068d1635d5ff5b443d13a31252716134d7", + "tests/diagnostic_recording_contract.rs": "3cd9e0a01916ed416cffd93f96aa463447beed404f202e3e2f5783c76122b758", + "tests/emitter_contract.rs": "9288b53744ff31fb4e338be13d8b4e9e68ea58aec2e78a15d5aa8850da0a9d4d", + "tests/emitter_controls_contract.rs": "7b3ad890d44d70652c04e119156dd6ecc32cb79587c87e49b1fd2fc72f6caa66", + "tests/export_contract.rs": "299ace3dc49a9990b52cd2ee55c974769c3acda5fc9ce43331fdb0cbfd34c070", + "tests/extruded_third_contract.rs": "19968c75c9dd95c1c19cc2a4f6a605d4a047bc20290562fe693fc7e8b628fbe2", + "tests/fitted_height_contract.rs": "391e6d3c992442a5a3a2e38f4d1304a20602047808831bd873567b1d8224a61f", + "tests/fixed_bottom_ale_contract.rs": "006968122943cd48290f302cdc33115d7c40058d992f8f38df1d5fbf28f57289", + "tests/fixtures/accepted_pressure_adapter.py": "958ba74ebde596aac8375eb436898a1e2342ba1b7868c08bfee99c09c02dc27c", + "tests/fixtures/collision/README.md": "1a27b9a7754d7e04ef3a05d1df57f9cff9d708f24b6ca2a913f761ed55e2c317", + "tests/fixtures/collision/cube.bin": "19ee1217f457696346ea61ca36ab09c26256d732cf9b02c962a81878cabfca4e", + "tests/fixtures/collision/cube.glb": "d7aaad641dffa913e68fddeb404e7cc06714f7ff546a902cfb72ad0fa404d4da", + "tests/fixtures/collision/cube.obj": "12a32152f8323a8bdea42b7c25ada7ff49737d2328aafda671497029f3aa0521", + "tests/fixtures/collision/domain-box.obj": "a0717a2b27629734e7946773671e34a1f8b7d572949a7c69a21d1e239c56a38e", + "tests/fixtures/collision/embedded.gltf": "4e050abe9a4a6ed810aa29c2d73051ac3cef413aa036ce33f711f87a6e6ce278", + "tests/fixtures/collision/hierarchy.gltf": "a37f48c741dc15ea24ad75796984661531955400bac7417ef43a0f4b1db0c116", + "tests/fixtures/configured_box_pressure_adapter.py": "01ad2acb063b21c29cc379191c1048f5a365d707de428693cec7ae30c744e98f", + "tests/fixtures/pressure_adapter_correction.py": "9ec95cd43f44f8f8f2f908057b135e16d0a92d790c60dca934946d9ab8cba889", + "tests/fixtures/pressure_adapter_full.py": "e3dceb0db85270f79a835149463892a8eee19442815dbc93abf3434132410047", + "tests/force_field_contract.rs": "1f97de31f8db1db38ff581e0ce702ffad7c16284fb29c39e8d61fc51ac9c645c", + "tests/force_field_solver_contract.rs": "9efdf712baaa8e662e77339a81074751ed10ef01b9675f99351fac2a662b41fc", + "tests/force_recording_integration_contract.rs": "e9ca49fdeb0f474cdcddb40930c3773dc71762a709ac7dec6200fd5db31859a7", + "tests/forces_contract.rs": "b8a5da48feab2eef82cc1600945cc30ff15082c0b447d8b5eb0c635821cf27eb", + "tests/free_surface_contract.rs": "8f9584c26f7a816bb53f15bb70ddec168c0949adf9ad7847ad2edcfb0af40e9d", + "tests/geometry_contract.rs": "87b34154f609767f1521a57531f6f45df4d965685113dcb43806069299865f4a", + "tests/grid_geometry_reference_contract.rs": "d36b91bc9bf4977bdab4fb1e02df11e7b7b27d60dee319bbbd46970fbaba830a", + "tests/grid_verification_contract.rs": "985ed9378329e3c9bb4e3891583f08ebecd554761e200b295dc1972ce5ab0ea7", + "tests/implementation_contract.rs": "e8b3b88536bd5d38dfda7d1454e916277e5314bbb9410bda81630faffe76c621", + "tests/liquid_scale_division_contract.rs": "dede02f6a5fc9eff67d87814b1845bfc6295c7a22098121217fee70822a4c3fb", + "tests/liquid_step_contract.rs": "e1aa67f673de131f97a1be651221db3f74a8beeed105076532ceeac2b92b5b12", + "tests/liquid_volume_contract.rs": "9eac2c3feedf24efd3e34f1651ead5ea14f036dbfb238af829650d5b77006ec2", + "tests/liquid_volume_periodic_contract.rs": "711208ff7a7da644cfc5751fd453742d689958ec71e79bb61dc8dd71dda94664", + "tests/material_contract.rs": "c5a1e89205b6cb65df69a1c10fa905f85d5efa6bc11c591211d509cb40161257", + "tests/material_partition_gate_contract.rs": "fa7049e27887ff275a2a35ee930ffb9d738171313cc35d61a668b442ca703a91", + "tests/material_reference_contract.rs": "9db6a8cc0558b4b04b4039ab8b7c74bd57c2f69a15d05b2b553713713a8f387b", + "tests/material_session_contract.rs": "9fadbca17897a93e9dc95be24a42c5181bfeaaf35aad650ea4bf6f477b9e580f", + "tests/mesh_collision_contract.rs": "e8977a66763745cfb807e9bcae392be3aa39ebca113aa3db4c4d4eb39447c8ca", + "tests/mesh_import_contract.rs": "a568e510cb457f8d90bffd2c99eb1c05d64ce5ac4c34949a58479831ffad3da9", + "tests/native_comparison_oracle_range_contract.rs": "290def29e35b9597d1c56757f5fb70d9ac100d95ca67b616c54533d31f8e0f82", + "tests/observation_contract.rs": "54a89d2df244839dec1931cde92117cf1bb832ffb0b6eb2ca32ca9ec28a8f7ed", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/operator_contract.rs": "b0ea207c02df69aed1f5f3eb6abda8fdeb245b271c325b383c3748d945c5095e", + "tests/parallel_contract.rs": "b91c7c87698c1a7b1d3b92c7b252781d96616df37c8a6ef391d4229a251668f2", + "tests/particle_adjoint_selection_contract.rs": "6ea5cc6c8e6719d363c500de4547d6de11a2f18606a816000aa8d957f64f5c04", + "tests/particle_inspection_contract.rs": "9e36d134d2391786457ff23bb20df63a5aadf29a8ae508cffec2de824528bc93", + "tests/particle_planar_selection_contract.rs": "5b52e344facae609a22dafce7f4e6b129872a481363f4765f476cd20d611795f", + "tests/plate_coupling_contract.rs": "3c413b5c903194ba8f1a83970275d066ba93a5568f0d43a27f93788f3c4af5fd", + "tests/pressure_context_contract.rs": "244afca41c35a929588f5dd0168ae682b1ae0457f0edc3f821b95ed93d7f2f36", + "tests/pressure_contract.rs": "f343f7f23965d963df8d734d624c63b12acaf165936ba2635e1b71816ee16c91", + "tests/pressure_session_contract.rs": "a2471a0faa91bac0acd4c824ee4b1175fe6f827357246218684ae47104aea0ce", + "tests/projection_session_contract.rs": "0da2954a1be0ffa516287ee62132589a6900be162015d929c1fe1492a401f1cc", + "tests/provider_step_contract.rs": "116c03830ed617e585a6eabe1dd9d8e826ed833039e4397de565d218ec9852e5", + "tests/recording_carrier_contract.rs": "8a3a5cd307b9b5e2b646165502029018eeb9e36268986b679094a9a1e43dfba0", + "tests/recording_comparison_contract.rs": "567a33029ba512fd2417555415fa7d8324d7981112c7548917499e596c5a1b61", + "tests/recording_contract.rs": "3db4e56207de52576aae5838d30e02894590ba843d1af8d10e5e7fd5a772ee8a", + "tests/recording_provider_contract.rs": "0766d5d9ac55fd8102c23b9492e11d41e4caa931249531a8b36824b2a97039c0", + "tests/recording_provider_runtime_contract.rs": "7f02cf7510be8bd9bca9b3af380e80401ead89ee9b5c2e2561de65e31c5f6cd1", + "tests/sampling_contract.rs": "3e99ff52088aa37d4043453a57c82bbe6de0da84e990796df76a3453f1ae004d", + "tests/saved_comparison_ui_contract.rs": "d95da93e267dda5f79a57d8b77727a49c2af336fb7b84ca8abe6e4d69c95ffb6", + "tests/saved_run_set_contract.rs": "0aa743522343bc75a1ad36dac956e4f3b5d978407e21b88eb90f0117c8e466f3", + "tests/saved_source_contract.rs": "39cb5152583c1662f8dfb71217409025084c4e05be1a18e1b7b3912fa4d21ca5", + "tests/session_configuration_contract.rs": "4f53c8d35eeb44819791341b8ce1a80421d9562ab8413f528a3234da233632f7", + "tests/session_contract.rs": "50f7a8981d1bc22ad63f990b01027b0ae26c4dc01192dc5dd7d9723f7e44da68", + "tests/session_interval_start_contract.rs": "4cdc0a85d21d77784ef142ba04f1ef20fb0333555d7bbb15b43465f475934769", + "tests/simulation_contract.rs": "f81fb0696307aa07abba0d8b44316430aeab19317c57d38db3222cdc9e33ddc6", + "tests/solver_provider_contract.rs": "0c063df217150bf407af3f6af9d39101bc37aa3192e00e0833b43042ebc06143", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tests/submarine_stokes_contract.rs": "20cb58baf441b56e7b5f72b9424de265c7bf656bb2c3532d4718220b8c291ce2", + "tests/tracer_barrier_contract.rs": "433edf41b549171f3a3c412e6d9233345f4ca8f45e6f5ebe5468638d3db9aca8", + "tests/translated_viscous_contract.rs": "d6fda116af1ae38a3e9216b97136562c144bfe1a5269734d002c3117c9b65e79", + "tests/translation_contract.rs": "e1fd504cb399b313bbb1df752f79e72cb51556c5af6d85dbb91cb5c690fb5c8d", + "tests/viscosity_contract.rs": "b716ef20283784d9a61bc95702c97c30c8e7d00c80f95530c46d27e667586c9d", + "tests/vtk_export_contract.rs": "3df0cd4bfe900adb855fa65d9ec267e43544961fd5608d4f1ab24258c6a44532", + "tools/ai_pressure_trajectory_oracle.py": "eb64fd6342e831be3d607d8593a9ddd8b92571cedd7f27cb896f88648435396c", + "tools/aligned_stokes_oracle.py": "aa2b41565b692445c4b32be9b0cfae6c99c8d599c73316cbf44bf3ade862b1d3", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/build_qualified_desktop.py": "392381ab8810ac08bd801b7a3e25ea2432f55debec6c72248b01073b96e582a1", + "tools/capture_material_desktop.py": "9a41394abce7803d4e79087fb54543170496e3d94133b48787fc360df647d954", + "tools/check_plate_coupling.py": "8ff34d73e6b437fc49120c07f316b0131f156078313ba1680b47ffad379caf65", + "tools/cloud_acceptance.py": "960a8621559026c5fb695b5596dfb4e264a963dd1818282bf1984dbb9af7f684", + "tools/export_ai_pressure.py": "a23c2e09d118f76f3ae243b3a8bbbbb35a54f6d9345d5a37c12b655d671859c5", + "tools/export_dense3d_sequence.py": "e9ec082113536e62f019d7ec4c51519719940b6ff4a584c9b1a5faf386253ec1", + "tools/generated_fixtures.py": "09ba81c54209e5896b9d840cd42192716e5008e0a1004533359b3c34cf4ef791", + "tools/import_dense3d_controls.py": "215f98241e01a6fb099b5b1b8789e00c951988e1382438afbd45cfbb7e1c4c43", + "tools/import_dense3d_sequence.py": "5c41f3a3c848940191d05d9b5b01a2a398b0d2a67f23c603ab8e918897bd3b55", + "tools/probe_ai_trajectory_receipts.py": "3aae40bb4b39bdecfd77bea1ab751502f3330d69a1cdf26d8307bbd4903057f2", + "tools/production_recovery_probe.rs": "70e248db8c7cccb9a70ce362de29db268a708574920345037887bc1e7110eae3", + "tools/qualify_aligned_stokes.py": "3a7104fec12b44c16b12e45d138f25e7fe0d113ccdc9bfcaeacf356dc177b20b", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/qualify_dense3d_controls.py": "b835bd06ec16ec0be2a7e561f726ce8d2ab814eaf50247851fc3d68577a041ea", + "tools/rheon_compare.py": "750e9ece40810667b9a9bfa5b4e942cc7ef132fadc8e22ae914b009b77aaadd2", + "tools/session_recovery_probe.rs": "eab066cb8dff750893c8a2eb9b7bd4efb22f1f4a18daf4fd49106a65bd7743f1", + "tools/setup_ci_rust.py": "57ccd44c75d3a834034e98d934efabe4586c90ed302aa8ad64d3b202a67fc172", + "tools/summarize_fluid_physics_audit.py": "f424ed2b06f0ac1c9c7d91f4a1814a5582e621cdddf3dd705ea7f878984e7f74", + "tools/supervise_ui_cancel.py": "23d4f18a97076d4908c11fedcd5c378568c9d8dd8bf5211b0116f5ebadc9b201", + "tools/test_ai_pressure_tools.py": "d93bfbeebeb44e1d594083f82d9af11d8a1d2ead050f02d5caf1dc81fa195d30", + "tools/test_ai_pressure_trajectory.py": "af769f8e489a3dbc861fac7114cf37ead1c7a320efc5b4563625eb028455e087", + "tools/test_aligned_stokes_oracle.py": "b947ec62102b1951a0a4a2773b766350300f4c1574dfdf4aaef9d9fb90e5cf9a", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_build_qualified_desktop.py": "857a0dc7f459a73bd8156a8164b529ac1399db41bd8e934a73367fb9a44bee7c", + "tools/test_cloud_acceptance.py": "e625e29678e96f93a7c56994eeb8bf6698b418534dfd6a4cc18b37d9dccee19c", + "tools/test_column_interface_verifier.py": "fa759c2553c1d02c6b9a67188dae83ecfb76a4cf6fcfd11baef4a4c9d41398d9", + "tools/test_column_mac_verifier.py": "f0c0ab7ac8de2f58b44a011d7e969cffb09fe5efb8982267ff0206662bfd4b1c", + "tools/test_column_momentum_verifier.py": "af4a90074eca2115ea00d8dc6173663dd1ebbf9855c320a7ed7b022e6f38667b", + "tools/test_column_shear_verifier.py": "530e3e4ee469c7b6d94381970dac5ae8672f89b053a61a5e06af0d3f95cd8060", + "tools/test_compressible_verifier.py": "c485d6faf627a73950187a21dec0f8a373a51f58c29d02af9b684982aed7546b", + "tools/test_dense3d_controls_export.py": "da490cb894feca9b2c8647828ef19824a1c8be0c6f4e2d08bdf264563bf82962", + "tools/test_dense3d_controls_import.py": "fa940190bac55ce4955f2046e857d52b336442e9edecabbf5653afedf0eb828f", + "tools/test_dense3d_sequence_export.py": "8dc654fffb11476697baa01ecec17f30e5d36ceadfb70f8404ef280d5e9135d1", + "tools/test_dense3d_sequence_import.py": "fa43af4815ee64676df772b19f4647378e44d18b34a7116ab638d5643ce0b743", + "tools/test_free_surface_verifier.py": "c9bb52cfde9431f58d9201525fd2a05c8c334066253fd67a07ab58e7ecd60f83", + "tools/test_liquid_transport_verifier.py": "6436a3f60789835ade0d9e292bb8366f05a51af3ce102b781cf11e0f3189e225", + "tools/test_production_transition.py": "8aa44b5ecec170407f4ae0457dcbd7f8f79f5a83589972378d7276d6197775e3", + "tools/test_qualify_aligned_stokes.py": "2f9732b1b18b5350ea8bcde9dc9cbb20cf45a5abc509f39ebc3d1ef469687d86", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "tools/test_repository_hygiene.py": "f016816b167e4519ca14f07f5f05d1e268fc971a8aa1785b2fe9947ac2b5f092", + "tools/test_result_qualification.py": "4ce94058c888c8e29c7b3d493d632ee85574687b6a74f2ba4fdd3f023a83f55b", + "tools/test_rheon_compare.py": "8e32da5ad5c0f07796fc9987b1faa9dbc22595b764a83988b0e47b41a759e7a1", + "tools/test_session_flow.py": "6b20193b3ec765c34b2e11fb346d8875aede4fcfd6aa67d9cf58c12b9b2ce8ff", + "tools/test_setup_ci_rust.py": "4640698e95804086a3e487088c09dac709c913f61d6b2c6c5dd3fc6178e704b7", + "tools/test_supervise_ui_cancel.py": "3d853281ee13e25a95375d73e4b7fc16652da93b6c27862c536fc09659234a98", + "tools/test_viscosity_verifier.py": "6da78d7af13cae2991797ed8695d849e7ed6dbf247bf34c65f6f24f6236c42e6", + "tools/verify_ai_pressure.py": "53e78c7a595aba45e08084d727a1919e114da0dec75eff8e104d4215ef29eeb4", + "tools/verify_ai_pressure_trajectory.py": "f59f29fb0f966b28fd583c9777e332faa986b3b4135f1e0558d43c62a9eb858e", + "tools/verify_column_interface.py": "b4e822ec7977c9a3145b4a299532e09453a1c400163360e35a09306a6860e13c", + "tools/verify_column_mac.py": "652787bb2b1fff64773f0c15e1e291ac8c5333d593781fb99f6729cbb278c825", + "tools/verify_column_momentum.py": "9b70b8574ad078485741b62bb66c628b14ef58161f73f0e1482690bdaac313e8", + "tools/verify_column_shear.py": "189ab0906295aba19137792d4c7f88632a59ea03d742a77fd6d53e0d467d6722", + "tools/verify_compressible.py": "431dfadcdf6a78820136b65a5b56b80581c55b38249b95b7560417fcc87cd2a4", + "tools/verify_diagnostic_pressure.py": "afa9845b1513a4119777f9564e5020e8503e0eabaed897aead8e2a11e9f5a299", + "tools/verify_free_surface.py": "ea855a2e793f4cbac96bf5acfbc81ea4d43bd9935ffb90ca26cf4e7d67899b2b", + "tools/verify_liquid_transport.py": "4100783fe1012705f49dbb24eb18333b92e7d540f07375cb72a041d08e3bce2b", + "tools/verify_production_transition.py": "98611f774750ab4daddb135f8eefbaa80592336591828e4ffd968a7a539ed520", + "tools/verify_recorded_carrier_vtk.py": "e02e75a1b00c829b2f398161cb2a49e26add6be75e66a65fbd887857d576fcb6", + "tools/verify_recording_comparison.py": "5261f0094aea5ebce5cc152bec55d5f6026ef6db7c971be87600d74e9cef8465", + "tools/verify_session_flow.py": "76e9d7411b482033d63c8904bac36f396a08bbb9bb98b314c879c252fe47b6c7", + "tools/verify_viscosity.py": "68b8594e952e621b677cb3059f2ffd89c7e94a2eac54b2a86f2e1eaf17f94180", + "tools/verify_vtk_roundtrip.py": "83dfffbb2bbf38c5903ca2a0c233e377028a44f45c929fb8e0927296bb091d4d", + "validation/cpu-cfd/Cargo.lock": "981e234dfcce42cfb6c74e762faa74867106895c8e032bc80495f5ea1c51dfba", + "validation/cpu-cfd/Cargo.toml": "c0bbcc24985c7f0fa0df7d92bc838adbac7951a1ff6d2ad58d908a6c4fcf9796", + "validation/cpu-cfd/README.md": "75eb410b72cc17b19acbbc5005c3c9e4dbc4a16560a97a3f00bf6e9f2e6ac4f6", + "validation/cpu-cfd/oracle.py": "068237b17d0225cbbae1a506d85e64b94a89e58d45f82c60dd5a91c5ac8553ce", + "validation/cpu-cfd/run.py": "2006b8b6cbf1c03c215a5f72147e63e1e1d808e07e0abf8d2b9f866a6acf4768", + "validation/cpu-cfd/src/main.rs": "339ee7d2caad1d5350a5cda8bb4968c201a3d1cb62d301ed7b1eedd2d72a32d6", + "validation/cpu-cfd/test_validation.py": "1d027cedcddc0530d4178b06e4004be4c195f0acf0b87f456a2a2f7506074d5e", + "validation/submarine/README.md": "5eb9cbf2ebf4262ab1bb0f659fdecc72f25d3f9f18752df0457f0e4c2e9415a9", + "validation/submarine/directional.py": "c9bd70ac8234821f16f47aab27a8468eaf37d44b1672974797ed9218a79bbdad", + "validation/submarine/directional_fixtures.json": "06889b4dc2c059a8d1d10f7d9805f2506e5e2a59da95c4f9ac47fe56d3afc992", + "validation/submarine/fixtures.json": "3762540394238820ad47ca7ce4f8fc5b140e11abc0d52458a2451a4fe588f160", + "validation/submarine/oracle.py": "6708b48b8d6adebe24d4e43c6fd2a6ccfc9431bfe0d77dc5de1cf6d893d83500", + "validation/submarine/run.py": "8c35fd2346d1af88786e583648e622b6646a04b7b6e6dc2594376d996d079acb", + "validation/submarine/test_directional.py": "160246dfcc32b356ad50a04c64542e8b3f071ea3545d52d59c577103790ed2b8", + "validation/submarine/test_validation.py": "3ec8dfa8591a3d04596ee9f2af401f564c8c601350bcda03afebf42457066468" + }, + "new_reconstruction": true, + "stepping_authorized": false, + "floating_point_estimate_enclosed": false, + "commands": [ + { + "name": "format", + "argv": [ + "cargo", + "fmt", + "--check" + ], + "exit": 0 + }, + { + "name": "rust-contracts", + "argv": [ + "cargo", + "test", + "--locked", + "--no-default-features", + "--test", + "aligned_strain_contract", + "--test", + "obstacle_flow_contract", + "--test", + "static_obstacle_contract", + "--example", + "aligned_strain" + ], + "exit": 0 + }, + { + "name": "rust-build", + "argv": [ + "cargo", + "build", + "--locked", + "--no-default-features", + "--example", + "aligned_strain" + ], + "exit": 0 + }, + { + "name": "rust-clippy", + "argv": [ + "cargo", + "clippy", + "--locked", + "--no-default-features", + "--lib", + "--example", + "aligned_strain", + "--test", + "aligned_strain_contract", + "--", + "-D", + "warnings" + ], + "exit": 0 + }, + { + "name": "qualification-gate-tests", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-m", + "unittest", + "discover", + "-s", + "tools", + "-p", + "test_qualify_aligned_strain.py", + "-v" + ], + "exit": 0 + }, + { + "name": "qualification-gate-tests-optimized", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-O", + "-m", + "unittest", + "discover", + "-s", + "tools", + "-p", + "test_qualify_aligned_strain.py", + "-v" + ], + "exit": 0 + }, + { + "name": "native-run", + "argv": [ + "/workspace/pr142-target/debug/examples/aligned_strain", + "/workspace/pr142-qualification-1/native/native.tsv" + ], + "exit": 0 + }, + { + "name": "native-oracle-comparison", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "tools/aligned_strain_oracle.py", + "/workspace/pr142-qualification-1/native/native.tsv", + "--negative-tests", + "--output", + "/workspace/pr142-qualification-1/native/native-oracle-summary.json" + ], + "exit": 0 + }, + { + "name": "unit-center-cube-run", + "argv": [ + "/workspace/pr142-target/debug/examples/aligned_strain", + "3", + "3", + "3", + "1", + "1", + "1", + "0", + "0", + "0", + "1", + "1", + "1", + "2", + "2", + "2", + "1", + "1", + "/workspace/pr142-qualification-1/native/unit-center-cube.tsv" + ], + "exit": 0 + }, + { + "name": "unit-center-cube-oracle-comparison", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "tools/aligned_strain_oracle.py", + "/workspace/pr142-qualification-1/native/unit-center-cube.tsv", + "--negative-tests", + "--output", + "/workspace/pr142-qualification-1/native/unit-center-cube-oracle-summary.json" + ], + "exit": 0 + }, + { + "name": "represented-nonmidpoint-run", + "argv": [ + "/workspace/pr142-target/debug/examples/aligned_strain", + "4", + "5", + "3", + "0.1", + "0.3", + "0.7", + "0.1", + "0.2", + "0.3", + "1", + "2", + "1", + "3", + "3", + "2", + "2", + "0.375", + "/workspace/pr142-qualification-1/native/represented-nonmidpoint.tsv" + ], + "exit": 0 + }, + { + "name": "represented-nonmidpoint-oracle-comparison", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "tools/aligned_strain_oracle.py", + "/workspace/pr142-qualification-1/native/represented-nonmidpoint.tsv", + "--negative-tests", + "--output", + "/workspace/pr142-qualification-1/native/represented-nonmidpoint-oracle-summary.json" + ], + "exit": 0 + }, + { + "name": "reflected-anisotropic-run", + "argv": [ + "/workspace/pr142-target/debug/examples/aligned_strain", + "5", + "4", + "3", + "2", + "3", + "5", + "-7", + "2", + "-1", + "2", + "1", + "1", + "4", + "3", + "2", + "3", + "0.25", + "/workspace/pr142-qualification-1/native/reflected-anisotropic.tsv" + ], + "exit": 0 + }, + { + "name": "reflected-anisotropic-oracle-comparison", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "tools/aligned_strain_oracle.py", + "/workspace/pr142-qualification-1/native/reflected-anisotropic.tsv", + "--negative-tests", + "--output", + "/workspace/pr142-qualification-1/native/reflected-anisotropic-oracle-summary.json" + ], + "exit": 0 + }, + { + "name": "large-origin-nonmidpoint-run", + "argv": [ + "/workspace/pr142-target/debug/examples/aligned_strain", + "3", + "3", + "3", + "0.3", + "0.7", + "1.1", + "100000000", + "-100000000", + "0.1", + "1", + "1", + "1", + "2", + "2", + "2", + "2", + "0.375", + "/workspace/pr142-qualification-1/native/large-origin-nonmidpoint.tsv" + ], + "exit": 0 + }, + { + "name": "large-origin-nonmidpoint-oracle-comparison", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "tools/aligned_strain_oracle.py", + "/workspace/pr142-qualification-1/native/large-origin-nonmidpoint.tsv", + "--negative-tests", + "--output", + "/workspace/pr142-qualification-1/native/large-origin-nonmidpoint-oracle-summary.json" + ], + "exit": 0 + }, + { + "name": "oracle-tests", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-m", + "unittest", + "discover", + "-s", + "tools", + "-p", + "test_aligned_strain_oracle.py", + "-v" + ], + "exit": 0 + }, + { + "name": "oracle-tests-optimized", + "argv": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-O", + "-m", + "unittest", + "discover", + "-s", + "tools", + "-p", + "test_aligned_strain_oracle.py", + "-v" + ], + "exit": 0 + } + ], + "status": "passed", + "lean_checked": false, + "executable_sha256": "4b2c44d880cbada3ac031f81b68c0a120b84aebd8c320f6d20d8d90dfd84943c", + "records_sha256": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45", + "artifacts_sha256": { + "reflected-anisotropic-oracle-comparison.log": "4f48508dd4a59fc2a9c100acc6c7179393782cafba86b0df4862015163667765", + "rust-clippy.log": "ecbf53654128420d0f4f0052a53572bde464835e2fe11eb9dd111c2dbecd8beb", + "reflected-anisotropic-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "large-origin-nonmidpoint.tsv": "38405a03996ba2be5dc952b85b1d7e0b0e7df4d115e30b9bdfe14852e55c3628", + "represented-nonmidpoint-oracle-comparison.log": "458f42df77d9c75e81818d6893441937045f241b888669912b63d19d02a4d9ae", + "oracle-tests-optimized.log": "706dc27569a1dbc330f92e4c81a8fd1b06d1cc7fbba332f7227a122d67f660b7", + "represented-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "large-origin-nonmidpoint-oracle-summary.json": "c4ba2c4f41b3610efa2d945da86bb525da3a133582808244aafa0a72cc55f0c2", + "reflected-anisotropic.tsv": "04821a0128a562dc796b5ec369e552eff2b867d09c55a7d1333cdfb35048b4d3", + "unit-center-cube-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "represented-nonmidpoint-oracle-summary.json": "458f42df77d9c75e81818d6893441937045f241b888669912b63d19d02a4d9ae", + "oracle-tests.log": "2edf5d69509c6dfd8a780163298d62a613be1c4ba1ec9b449cb136b60e06b834", + "unit-center-cube.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "native-oracle-summary.json": "5e43659700729d7cc5d0e0250c0a3019d6fa9071d4b293657944ea00dda02425", + "large-origin-nonmidpoint-oracle-comparison.log": "c4ba2c4f41b3610efa2d945da86bb525da3a133582808244aafa0a72cc55f0c2", + "unit-center-cube-oracle-summary.json": "324602066581959b0f796442860d9c276f645f94084da08da5f14b0eab734ba9", + "large-origin-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "unit-center-cube-oracle-comparison.log": "324602066581959b0f796442860d9c276f645f94084da08da5f14b0eab734ba9", + "native-oracle-comparison.log": "5e43659700729d7cc5d0e0250c0a3019d6fa9071d4b293657944ea00dda02425", + "rust-contracts.log": "2cfad8dea3400d1e2200b4f8f191a49c5090ac3cb58e3360bd421a5ed6c26f53", + "format.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "represented-nonmidpoint.tsv": "c7eed9042d4806d437a573ddae91817c692c8cbd77b32e2df296b0e0b38d96f2", + "native-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native.tsv": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45", + "qualification-gate-tests-optimized.log": "44a1a7630f01d8905f57c4303a34c92d6f26221015df7365307504ae332a810f", + "reflected-anisotropic-oracle-summary.json": "4f48508dd4a59fc2a9c100acc6c7179393782cafba86b0df4862015163667765", + "qualification-gate-tests.log": "7c5821bac407cda67d413b016da118be9e4848bbbf5e6f96f65977e0407f1e85", + "rust-build.log": "e0603cfd1cfa74e6d5757b2024b781a1e962335568366310e09d910ba05ac4a2" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/frozen-packet-receipt.json b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/frozen-packet-receipt.json new file mode 100644 index 00000000..40139041 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/frozen-packet-receipt.json @@ -0,0 +1,200 @@ +{ + "clean": true, + "data_sha256": "2a3e9211269177acedb343dac7055b1429456f3d20afaa00fc4a0270a1b02410", + "executable_sha256": "4b2c44d880cbada3ac031f81b68c0a120b84aebd8c320f6d20d8d90dfd84943c", + "fluid_solves": 0, + "native_argv": [ + "/workspace/pr142-target/debug/examples/aligned_strain", + "3", + "3", + "3", + "1", + "1", + "1", + "0", + "0", + "0", + "1", + "1", + "1", + "2", + "2", + "2", + "1", + "1", + "/workspace/pr142-qualification-1/packet/native.tsv" + ], + "native_exit": 0, + "native_source_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "native_source_sha256": { + "Cargo.lock": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "Cargo.toml": "f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "e268555e0ebde7080f0ea8b2e8e398721fd1a65ec60f1925a314ace5f73d3488", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "c4455879373fc71eaaf398fdaa230c4d0b115dc7ff0a9da6356afeb24cba23b2", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "cf8be77bcc46e192d0fcf44e8206d1e0a54a88deefcd178083ff39263ad957dc", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "5463e18b3b5a139c448dd327b23318605664e90aea4690187981177e7f68e60b", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "06a9e7f5724b73c101a38dcc2c966d37b640900495643ea7bc04c13f4630f278", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/force_run_policy.rs": "cbb784c1cc403cfd524b715a52144c662f428b302014af1794bb3131d09bb97a", + "src/bin/desktop/force_run_policy_tests.rs": "99d6b9e8b2a98eceab0514510d3f54873da50fdabc7626dd3896d45dd3c53383", + "src/bin/desktop/force_runtime_integration_tests.rs": "04ba4f5883e48c5548cb420e17b6a6736436871d8e6c7792487939bfe5ed29a6", + "src/bin/desktop/force_runtime_ui_tests.rs": "92475c2b577510a8f8fc11217f7eb1a5361dcaef20ade99f198f60d5b654966c", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "2e6a9f4f44e4a3843bc1c16953e1fc2f182a08b3a25e70f968084b454af8a438", + "src/bin/desktop/native_presentation_harness.rs": "8ce8efa63afbe0d09e22996ec00478de331fcbda7a5ac83882f2ed3fff0d8ea1", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "b25f07c5d9f4a27572922956043224c35dde35d9a0d987ab8af4f3f3151c91f0", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "39e8982fffaf4e9adcd0ca0c60f49eabc96b829957bc6d9c05479c80eee99daf", + "src/bin/desktop/scene_handles.rs": "4818b85644a2891de562adc00fc203eb59c674bbf46aa88cd440bcab6477eb22", + "src/bin/desktop/scene_ui.rs": "e98c8aa0449b8f1adac4eb8a5bdc9a0951bd0b054f4dd2575d31dee30990c922", + "src/bin/desktop/scene_view.rs": "d16851804c3aa727c7fdf658a821ef8c8cd2c167e853b72d02604f2a14dfa02f", + "src/bin/desktop/settings.rs": "72a2e42de38100fa7cb517bfa7c1b9377975d23c3c4cd887615c296549c093c4", + "src/bin/desktop/setup_ui_tests.rs": "278b7a20f5d48a4e8a6c8ee2a4b18f0377f09f78bd64b34cfb20d4545ebc2563", + "src/bin/desktop/timeline_ui_tests.rs": "545e109f6d6808cc31482b8cffb4e21f8518d705424327728dc6c5d549a73df5", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "4a365fbb1a0f48bd016b3d673b30e635ad26390205cb22c24d25fa46738b6a08", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "6d16349502d2ce6bd3a2e07a5285cd1538703a48ec591215d7cb327d435a902a", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/force_field.rs": "adecbc5f92b89179a2e38885be2acbcddd42df40061f00ffa5d758224ed045a5", + "src/forces.rs": "7b3b48c0813c995a937a44ca1b624411c59dde6419b62041b67456cde2d692d9", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "6a9f704b00321be1cb9699e4d81d953030a42e3794f5b5d03ce548490f51f7b5", + "src/liquid_step.rs": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "538c498122bbc1045ae59d7363ff87e1dd9a40003fb48eeae835228ad4c65893", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/projection_step.rs": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "4273be1af82f7a1ab9c0f141fc58b663354e5fc96e625835ad1dbcef2588af34", + "src/recording/carrier.rs": "5a9b10b929f650423ad9e58bd7047bfe80cc7bf18138d74bd628c2f3f17af711", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/force_fields.rs": "2cf3ec9ec191c35c814d48ace301feaccd6cc73311a66970c9d112dad432c4a9", + "src/recording/material.rs": "e72e256aa3af46fef9002822de5281caf1de66ba070eb2109f77b083e20ae6ce", + "src/recording/projection.rs": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588", + "src/recording/projection_tests.rs": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d", + "src/recording/provider.rs": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b", + "src/session/configured.rs": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4", + "src/session/projection.rs": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4", + "src/session/projection_tests.rs": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "0abf525a7535e48f04acd3ef408c15c7d93242906195f778fb0e1e8646dff254", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "native_source_tree": "2f37db7c119b846003f5a01a82d46c4cf965b474", + "oracle_summary": { + "B_exact": "17", + "active_faces": 48, + "dissipation_exact": "12267/128", + "dump": "/workspace/pr142-qualification-1/packet/native.tsv", + "matrix_nonzero": 408, + "rows": 210, + "zero_rows": 6 + }, + "primary_qualification_sha256": "c295a810ccc480bd5fd267179f89f9815a419c03fc3ad8f5211d2c188caa3bf7", + "records_sha256": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "schema": "rheon-aligned-strain-education-qualification-v1", + "source_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "source_tree": "2f37db7c119b846003f5a01a82d46c4cf965b474", + "status": "passed", + "stepping_authorized": false +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/protocol.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/protocol.md new file mode 100644 index 00000000..6cd49000 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/protocol.md @@ -0,0 +1,83 @@ +# PR142 current-main composition and bounded repair + +Prospective attempt protocol, not an execution receipt. Continue the canonical +`docs/plans/fluid-accuracy-composition/plan.md` under the fresh 2026-10-21 user +instruction to complete and normally merge the five retained PRs. This supersedes +the historical no-merge delegation for this new task only; denied cloud-task +reads/resumes and the earlier artifact download remain prohibited. PR142 is sole +serial integrator, followed by PR138, PR143 and PR59. PR150 may enter only at a +safe serial point after its final artifact/content/visual gate actually passes. +GitHub PR comments own inter-worker readiness and exact-head merge authorization. + +Retain PR142 `4f2d55323825c8907cf9209914f29130ec7de511` and fetched main +`15026a966265cf9eaedf464e2b5a066bd0fef3d8` as merge parents. Preserve every +predecessor branch, committed source-bound receipt and failed/cancelled outcome. +No rebase, force push, branch deletion, test weakening or scientific campaign +rerun. Normal GitHub merge requires independent exact-source review, applicable +hosted checks and post-merge source/check verification. Merged code does not +establish whole-application production acceptance. + +## Owned bounded change + +Merge current-main UI/force/thermal changes without changing their contracts. +`src/simulation.rs` retains both `workflow` and `fields` in StepDomains and the +existing projection input; every constructor initializes all three explicitly. +Automatic merges in lib/recording/desktop composition need independent review. +The shared cfg(test) desktop CPU fixture must not assume unique wall-clock +nanoseconds: process ID + timestamp + atomic sequence and exclusive directory +creation skip AlreadyExists, while other I/O errors fail. The regression creates +32 concurrent fixture directories with an identical timestamp. Existing provider +metadata/scratch-cap rejection contracts remain unchanged and must execute. + +Read actual Coding Standards at `0fc92a24279f3a4574c80af0a2f31ea347a21597`: +Core/router, implementation, verification, planning/serial integration, commit, +proportionality, documentation, Rust mechanisms and affected architecture, +contracts, concurrency and cross-platform concerns. No AGENTS.md exists in the +checkout or workspace ancestor. This is source-guided application of standards, +not an automated standards-engine certificate. + +## Exact source admission + +Use the unchanged conservative selector, checker, native qualifier and packet +consumer. Review the entire selected source closure against both parents, +including unchanged identities and all overlapping composition points. Do not +union old inventories or infer one parent's acceptance covers the combination. +Only after independent review, explicitly refresh existing v3 inventory and its +bound review digest; retain historical v1/v2 inventories and both parents' bound +review text. Record the old inventory refusal. Commit the precise reviewed map, +protocol and metadata before qualification. Any selected edit requires renewed +review/admission and fresh committed-source qualification. + +## Fresh evidence recipe + +Use Rust/Cargo 1.92.0, Python 3.12.14, jobs 2, incremental 0, dev/test debug 0, +default optimization/debug assertions; clear ambient Python optimization and +record material compiler overrides. External target `/workspace/pr142-target` +may reuse only this task's explicitly preparatory builds; this is not a cold-build +or reproducibility claim. New evidence output `/workspace/pr142-qualification-1` +and journal are exclusive. Each command records argv, source head/tree, exit, +raw log and actual executing ELF identities. Retain failure/partial evidence. + +1. Require a clean committed source, admission, locked metadata and formatting. +2. Execute the unchanged native/rational qualifier (18 commands), retaining the + actual contract/specimen/gate/oracle counts and exporter bytes. +3. Build a fresh real packet with that exporter and its newly generated native + receipt. Require exactly 26 normal and 26 optimized packet tests, no skips. +4. Execute strict Clippy all-targets and complete ordinary Cargo tests for + no-default, default and desktop features. Preserve existing explicit opt-in + ignores; do not run sealed scientific campaigns or reinterpret ignored tests. + Core/default and desktop suites include complete library, public B2/B3 long + differentials, legacy custody, volume and borrow compile-fail contracts. +5. Audit clean unchanged source/head, every committed-source digest and all + retained executing ELF bytes. Seal new raw evidence including initial failures + into an archive with CRC/member SHA256 audit. Keep generated output outside + Git. Obtain independent execution/result review. Library storage, if used, + must use its normal supported upload workflow; no earlier artifact retrieval. +6. Publish exact ready head, source/review and local/hosted results in PR142, + transition from draft only after material gates pass, then normal merge using + expected head. Verify main merge ancestry and resulting checks. Serially + re-read each remaining PR's fresh readiness and current main before admission. + +No GUI-window, CUDA/GPU, physical/scientific accuracy, model deployment, +performance/release or broad C1 replacement acceptance follows from these +contract gates. Missing mandatory evidence remains a blocker, never a waiver. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/qualification.json b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/qualification.json new file mode 100644 index 00000000..5ea5c9b0 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/qualification.json @@ -0,0 +1,203 @@ +{ + "schema": "rheon-pr142-completion-qualification-summary-v1", + "status": "scoped-composite-qualification-passed-ci-budget-guard-coordinated-new-head-pending", + "actual_execution_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "actual_execution_tree": "2f37db7c119b846003f5a01a82d46c4cf965b474", + "reviewed_selected_inputs": 152, + "canonical_selected_map_sha256": "4d6fbe1927962b23da4c37e32b476b20a2ae7f48bf0d11805c36065c8a8b464d", + "admission_inventory_sha256": "a1c59a4d17ccdd1af16ff8ceadc08eedad54e92b1de043147057b7da48774a7f", + "bound_review_sha256": "014e19aac55f3fceae1edef9deff8c41337b5c3ca3db655ba07b978b562fb28e", + "evidence": { + "schema": "rheon-pr142-evidence-reconciliation-v1", + "status": "passed-scoped-composite-evidence", + "source_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "source_tree": "2f37db7c119b846003f5a01a82d46c4cf965b474", + "original_all_local_attempt": "intentionally-cancelled-after-complete-source-identical-hosted-feature-gates; original failed journal retained unchanged", + "local_completed": { + "native_commands": 18, + "native_rust_tests": 35, + "native_specimens": 5, + "gate_tests": [ + 5, + 5 + ], + "oracle_tests": [ + 10, + 10 + ], + "packet_tests": [ + 26, + 26 + ], + "packet_skips": 0, + "core_tests": { + "passed": 722, + "failed": 0, + "ignored": 10, + "top_level_harnesses": 85 + } + }, + "hosted": { + "run_id": 39688034222, + "head_sha": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "conclusion": "success", + "attempt": 1, + "actual_checkout": "d5ef6e22322183f34be437a1e9427a2b7d53d9d2", + "checkout_tree": "2f37db7c119b846003f5a01a82d46c4cf965b474", + "tree_equals_reviewed_head": true, + "feature_modes": { + "core-only": { + "job_id": 119526972309, + "passed": 722, + "ignored": 10, + "top_level_harnesses": 85 + }, + "default": { + "job_id": 119526972867, + "passed": 730, + "ignored": 10, + "top_level_harnesses": 86 + }, + "desktop": { + "job_id": 119526972766, + "passed": 1114, + "ignored": 17, + "top_level_harnesses": 88, + "nested_child_summaries_excluded": 4 + } + }, + "jobs": [ + { + "id": 119526972309, + "name": "Feature contracts (core-only)", + "status": "completed", + "conclusion": "success" + }, + { + "id": 119526972766, + "name": "Feature contracts (desktop)", + "status": "completed", + "conclusion": "success" + }, + { + "id": 119526972855, + "name": "executable-contracts", + "status": "completed", + "conclusion": "success" + }, + { + "id": 119526972867, + "name": "Feature contracts (default)", + "status": "completed", + "conclusion": "success" + }, + { + "id": 119536864453, + "name": "core-and-executable", + "status": "completed", + "conclusion": "success" + } + ] + }, + "cancelled_local_default": { + "schema": "rheon-pr142-intentional-duplicate-cancellation-v1", + "requested_at_utc": "2026-10-21T23:07:41.388486+00:00", + "source_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "reason": "Independently reviewed source-identical hosted full core/default/desktop and aggregate have passed; no deciding value in further local duplication. Original protocol/driver/journal/partial logs remain frozen, no all-local success claim.", + "independent_review_task": "/root/pr142_source_review", + "driver_pid": 7921, + "cargo_pid": 22421, + "test_pid": 26575, + "test_argv": [ + "/workspace/pr142-target/debug/deps/material_contract-4052afe5fb62db1a" + ], + "signal": "SIGINT", + "outcome": "confirmed-stopped", + "journal_status": "failed", + "last_command_exit": 101 + }, + "independent_review_task": "/root/pr142_source_review", + "independent_review": "Passed complete native/packet/source audit; separately approved source-identical hosted fullfeature recipe and explicit owned cancellation. Not a cryptographic authentication claim.", + "claims_excluded": [ + "whole-application production acceptance", + "new physical/scientific accuracy", + "GPU/hardware", + "native-window", + "performance/release", + "ignored force/model tests as executed passes" + ] + }, + "archive": { + "schema": "rheon-pr142-raw-archive-seal-v1", + "source_head": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "source_tree": "2f37db7c119b846003f5a01a82d46c4cf965b474", + "archive": "/workspace/rheon-pr142-dbd49d3-qualification.zip", + "sha256": "4d55283ec9894b5c4c742e743913b6bc63fc8fbf413a21b6c6e6098d8e1fa04e", + "bytes": 153125915, + "members": 191, + "all_members_crc_sha256_verified": true, + "member_manifest_sha256": "c26fe09fa7d6961415e0113e510e3360c7cd6ce367e6cd187d0e7234ae359bd1" + }, + "actual_executing_elf_paths_retained": 131, + "native_receipt_sha256": "c295a810ccc480bd5fd267179f89f9815a419c03fc3ad8f5211d2c188caa3bf7", + "packet_receipt_sha256": "59a2c46d1bb0bd2ae2255ab80d146acd1744be6e7e74aa018b22f61218c1d434", + "non_source_followup": "Only reviewed outer CI feature-job budget30\u219260 and authored result/status/review docs; selected152 runtime/build/qualifier bytes and admission inputs remain exact. Actual execution identities are not relabelled.", + "merge_status": "not yet merged; final reporting head checks and exact-head normal merge required", + "library_retention": { + "status": "failed-before-preparation", + "operation": "Create Library item from new sealed local qualification archive", + "target": "rheon-pr142-dbd49d3-qualification.zip", + "reason": "hosted apps tools/list request failed: network", + "exit_code": 1, + "library_id_returned": false, + "retried_or_alternate_route": false, + "raw_archive_retained_locally": true + }, + "compact_receipts": { + "native": "frozen-native-receipt.json", + "packet": "frozen-packet-receipt.json", + "custody": "custody-manifest.json" + }, + "subsequent_reporting_ci_failure": { + "schema": "rheon-pr142-ci-budget-guard-repair-v1", + "failed_source_head": "5eb8bf5607c01f1d59242c604b1d1204882d2eac", + "failed_run": 39692282682, + "failed_job": 119541101644, + "actual_checkout": "7ce8a40dfd240bb81c2f7ffcad947138194494b1", + "raw_log_sha256": "aec251631819cb28b421ef2e517ec4e13dd697949ba6c1328d40e2ef5e4cd404", + "raw_log_retained_locally": "/workspace/pr142-failed-5eb8bf5-executable.log", + "result": { + "tests": 219, + "errors": 2, + "skipped": 27, + "exit_code": 1, + "failure_owner": "source-only CiBudgetContract exact feature-job prefix" + }, + "errors": [ + "test_ci_budget_preserves_every_existing_job_check", + "test_only_exact_reviewed_isolated_setup_and_additive_contracts_are_allowed" + ], + "diagnostic": "runner/budget/matrix/dependencies: feature-contracts", + "repair": "Coordinate the source-only exact expected feature prefix with reviewed actual workflow: exact two comments and60minutes. Frozen baseline and all commands/matrix/aggregate/per-case/scientific checks remain unchanged. Add rejection of30/59/61/missing feature budget.", + "guard_source_sha256": "46a9d538ef4680e983099a3dfdcb6eb98b7ca87a5f8c8ec80e02d64508142960", + "focused_checks": { + "normal": { + "passed": 4, + "failed": 0, + "skipped": 0, + "log_sha256": "f4b0bc8cee953e5b29e79e1e007c4d093d73853a350ee94051b37b6500685085" + }, + "optimized": { + "passed": 4, + "failed": 0, + "skipped": 0, + "log_sha256": "b835a38207a75d7d44c75f3d31d1727f585e5fc31f4e6c2559058accb76f3f6a" + } + }, + "selected_native_input_count": 152, + "selected_native_input_delta": 0, + "source_formula_or_numerical_verifier_delta": 0, + "historical_failed_outcome_preserved": true, + "new_head_ci": "required; pending" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/qualification.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/qualification.md new file mode 100644 index 00000000..c4ebb070 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/qualification.md @@ -0,0 +1,101 @@ +# PR142 completion qualification + +**Scoped composite qualification passed; final reporting-head hosted gates and +normal merge remain pending.** Actual local executed source is +`dbd49d3e41c482a753884abc8aaaff7d1b0d0653`, tree +`2f37db7c119b846003f5a01a82d46c4cf965b474`, with parents retained PR142 +`4f2d55323825c8907cf9209914f29130ec7de511` and main +`15026a966265cf9eaedf464e2b5a066bd0fef3d8`. No original branch/history is +rewritten or deleted. + +The bounded repair preserves workflow, authored force and projection inputs +in Simulation and both desktop/recording owner changes. Test fixture directories +now survive repeated timestamps/concurrent creation. Fully qualified preparatory +new regression and original metadata/scratch-cap refusal tests each execute1/1; +the initial zero-test filter and missing-field compile outcome remain recorded. +The [independent source review](source-review/review.md) and +[final admission review](source-review/final-admission-review.md) cover all 152 +selected paths. No selector, qualifier, oracle, numerical formula or threshold +changes. Original v1/v2 inventories, both divergent review histories and prior +source-bound receipts remain retained. + +## Actual completed evidence + +| Evidence | Result | +| --- | --- | +| Fresh unchanged local native qualifier |18 commands;35 Rust tests;5 actual specimens; gate 5+5 / oracle 10+10 | +| New actual native packet |26 normal +26 optimized tests, no skips | +| Complete local core-only ordinary suite |722 passed,0 failed,10 explicit ignores;85 top-level harnesses, including3 compile-fail doctests | +| Hosted core-only |722 passed,10 ignored;85 top-level harnesses; strict all-target Clippy/test/dependency inspection passed | +| Hosted default |730 passed,10 ignored;86 top-level harnesses; strict all-target Clippy/test passed | +| Hosted desktop |1114 passed,17 ignored;88 top-level harnesses; strict all-target Clippy/test passed;4 nested child result summaries excluded | +| Hosted executable + aggregate |SUCCESS in workflow 39688034222 attempt 1 | + +Hosted jobs are119526972309/119526972867/119526972766; executable119526972855 +and aggregate119536864453. Actual checkout `d5ef6e2` has exactly the local +reviewed execution tree. The independently approved +[evidence reconciliation](evidence-reconciliation.md) retains the duplicate +local default attempt as intentionally CANCELLED (SIGINT, Cargo 101, original +journal `failed`), with partial logs intact and all owned processes confirmed +stopped. Local desktop was not executed. This is not an all-local pass or a +sum of distinct tests across modes. Long B2/B3 native-selection/fallback +contracts execute in complete local core and hosted feature suites. + +The local ten ignores comprise seven separately gated authored-force/numerical +SQLite cases plus three checkpoint-input cases; desktop has its additional +explicit gated cases. No ignored case is counted as passed. Hosted native CPU, +rational/kernel, executable, VTK and reference-book supporting checks also +passed on dbd49d3; the full Pages build was still pending when this report was +prepared. Final checks on the workflow/document follow-up head remain required. +CodeRabbit skipped214 files over its100-file limit, so its status is not an +independent review; the delegated exact-source review supplies that evidence. + +## Custody and limits + +The unchanged native receipt records1,903 committed-file identities and all 152 +selected inputs on actual dbd49d3. Local execution uses Rust/Cargo 1.92.0, +Python 3.12.14, jobs 2, incremental 0, dev/test debug 0 and ordinary unoptimized +debug assertions. Preparatory cache reuse is explicit, not a cold/reproducible +build claim. Actual native exporter SHA256 is +`4b2c44d880cbada3ac031f81b68c0a120b84aebd8c320f6d20d8d90dfd84943c`. +The archive retains raw logs, native/packet receipts, actual executing Rust +ELF copies, original cancelled journal, cancellation/reconciliation receipts, +and raw hosted logs/metadata. Interpreter/child-fixture/rustdoc identities are +not claimed as exhaustive OS-process custody. + +Raw archive `rheon-pr142-dbd49d3-qualification.zip`:191 regular members, +153,125,915 bytes, SHA256 +`4d55283ec9894b5c4c742e743913b6bc63fc8fbf413a21b6c6e6098d8e1fa04e`. +All member CRC/SHA256 checks pass. The [machine summary](qualification.json) +retains exact receipt, source and custody identities. The [independent execution/archive review](source-review/execution-and-replan-review.md) +passes. Compact [native](frozen-native-receipt.json), [packet](frozen-packet-receipt.json) +and [custody](custody-manifest.json) manifests retain source/hash/command identities +without committing raw logs, fields, archives or executable bytes. + +Library saving of this new archive failed before preparation because its +workspace connection was unavailable; no Library identity was returned. That +operation was not retried or switched to another route. The sealed raw archive +remains intact locally; compact receipts above remain in Git. This is a +supporting storage limitation, separate from successful scoped qualification +and from PR150's earlier denied artifact-content gate. Final result-document +review remains separately recorded. + +ClassicalSelectionV1 remains closed/stateless/native. Only actual producer +IterationLimit is recoverable among producer errors, using immutable same-input +fallback; existing field/momentum fallback remains, mixed-pressure witness +fallback refuses publication, and failures/cancellation publish no accepted +state. Old versions and unsupported desktop namespaces retain explicit refusal. +No stateful/learned/external/whole-family replacement or new physical accuracy +is admitted. Q2/CV source, native-window, force opt-in/physical/release/performance +and whole-application production acceptance remain separately scoped. + + +## Subsequent reporting-head CI diagnosis + +Reporting head5eb8bf5 failed two source-only exact workflow-budget contract +checks because their expectation had not yet been coordinated with the reviewed +60-minute feature-job budget. The [bounded repair](ci-budget-guard-repair.md) +keeps all numerical/workload/aggregate checks and the frozen baseline exact, +and adds specific rejection of every other tested budget. All four source-only +contracts pass in normal and optimized Python. The original219-test/2-error/ +27-skip failed job remains source-bound; final new-head full CI is still required. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/ci-budget-guard-repair-review.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/ci-budget-guard-repair-review.md new file mode 100644 index 00000000..340c1422 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/ci-budget-guard-repair-review.md @@ -0,0 +1,61 @@ +# Independent exact CI budget guard repair review + +PASS, delegated task `/root/pr142_source_review`, 2026-10-21. +Reviewed the complete six-path repair over reporting source +`5eb8bf5607c01f1d59242c604b1d1204882d2eac`; this review adds a seventh file. + +The actual failed hosted executable log SHA256 is +`aec251631819cb28b421ef2e517ec4e13dd697949ba6c1328d40e2ef5e4cd404`. +It records checkout `7ce8a40` merging actual reporting head `5eb8bf5` into +`15026a9`, 219 Python tests, 2 errors and 27 skips, exit 1. Both errors are +the exact stale `feature-contracts` prefix check in `CiBudgetContract`. +No numerical-verifier test failure was observed. The failed source/result +remains recorded; the repair does not waive or relabel that gate. + +Actual guard source SHA256 is +`46a9d538ef4680e983099a3dfdcb6eb98b7ca87a5f8c8ec80e02d64508142960`; +its Git diff over `5eb8bf5` has SHA256 +`a0a861c2ac529da6492ee2f0185266c13d6f720d7619a162e0aae7fd1719300d`. +Independent source/AST comparison establishes that the sole existing verifier +change is the exact approved feature prefix: two comments and timeout 60. +Every old test method and every numerical-verifier method is unchanged. +The new fourth source-only test checks the unique feature budget and requires +the feature-specific ValueError for 30, 59, 61 and missing-budget mutations. +The existing all-30-to-60 negative remains, guarding executable/aggregate +budgets. No range, skip, assertion relaxation or generic normalization is added. + +The frozen eight-step baseline, workflow, setup, action pins, workload commands, +feature matrix, aggregate and the other two job budgets remain unchanged. +The guard file lies outside the conservative 152-input native closure; all 152 +actual hashes and frozen admission records remain exact. This is coordinated +contract maintenance for an already reviewed workflow change, not a weaker +acceptance criterion. + +Read both actual focused logs: 4 tests normal and 4 under Python -O, all passed +without skips. Their SHA256 values are +`f4b0bc8cee953e5b29e79e1e007c4d093d73853a350ee94051b37b6500685085` +and `b835a38207a75d7d44c75f3d31d1727f585e5fc31f4e6c2559058accb76f3f6a`. +The selected class constructs no numerical fixture. This reviewer ran no Cargo, +full numerical module, sealed campaign or graphical execution. + +The new repair Markdown/JSON, appended qualification summaries and ledger +accurately bind the failed job 119541101644/run 39692282682 and exact repair. +All prior qualification summary fields except status are preserved, with the +new failure/repair record appended separately. Original `dbd49d3` receipts, +cancelled all-local attempt, Library storage failure and sealed archive identity +are unchanged. Fresh next-head full CI is explicitly pending. + +Reviewed file hashes: + +| File | SHA256 | +| --- | --- | +| Plan-root `execution-ledger.md` | `08c1ab4a236ecad86f48fff4dc4fdcdeb7239633db39bb3e9cba667c302cd9b2` | +| `ci-budget-guard-repair.json` | `c6f444c9ba2b8ff4346d9ba4991320df49304fbfa3326a9bdba96be80579fce5` | +| `ci-budget-guard-repair.md` | `0a1890dfe54bad3a320db84377c42a2fa6231d0d00d0e454455cb9896e87a526` | +| `qualification.json` | `1cb6d2a771ebb0a3bcd4007f9ea640fe2070d2e41bdb347faf257631c648eacc` | +| `qualification.md` | `ea7c8f07a31977f30fa564fcd766b1c3c3ed5b92a9a17b3ecb349b8557c1b655` | +| `tools/test_column_interface_verifier.py` | `46a9d538ef4680e983099a3dfdcb6eb98b7ca87a5f8c8ec80e02d64508142960` | + +Approve committing this exact repair and report set. No material source, +contract or reporting issue remains. Fresh full checks on the actual new head, +normal expected-head merge and post-merge verification remain required. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/ci-budget-review.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/ci-budget-review.md new file mode 100644 index 00000000..2609be01 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/ci-budget-review.md @@ -0,0 +1,33 @@ +# Independent outer CI budget patch review + +Reviewed read-only against clean source `dbd49d3e41c482a753884abc8aaaff7d1b0d0653` +before the patch was applied. External patch +`/workspace/pr142-rust-ci-budget.patch` SHA256 is +`a6ce599c12f0645fd8fb91b1f3abc18cd5c6b0d78a96a299e3b0edbc3cc97e4f`. +The exact old workflow SHA256 is +`769e89aadb3ed2abbcf2e72a8a722ab0de5165976de0f8f35eca0ad37e63ea76`; +the prospective new workflow SHA256 is +`80f732505778a8f7746ca42c52e919c5d7d2cbdf0fe2432c8695079663c8e300`. + +The patch changes only `.github/workflows/rust-rheon.yml`: the outer +`feature-contracts` matrix job timeout increases from 30 to 60 minutes and two +comments explain its scope. Commands, feature matrix, assertions, per-case +limits, scientific bounds, executable job and aggregate gates are unchanged. +Independent in-memory diff comparison and `git apply --check` passed. The +workflow is outside the unchanged conservative 152-path native selector. + +The reported historical desktop cancellation at the previous outer job limit +supports allowing more scheduling/compilation/test time without weakening a +test's acceptance criterion. This review did not independently re-fetch that +historical run and does not guarantee that 60 minutes suffices. The newly +audited exact-tree hosted run 39688034222 separately completed all three feature +modes under its original 30-minute setting; that success remains its own +source-bound evidence. + +Approve the exact prospective patch within the user's instruction to complete +and normally merge the remaining work. Application was conditioned on the local +clean-source qualification driver and owned children first ceasing. Its native +source closure and prior admission bytes must remain unchanged; original +receipts remain bound to `dbd49d3`, never relabelled as receipts from a later +workflow/documentation commit. Actual final diff, source identity and required +checks on the resulting new head remain separate verification steps. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/execution-and-replan-review.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/execution-and-replan-review.md new file mode 100644 index 00000000..0636a97b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/execution-and-replan-review.md @@ -0,0 +1,140 @@ +# Independent execution, evidence replan and archive review + +Reviewed on 2026-10-21 by delegated task `/root/pr142_source_review`. +The actual qualified source is commit +`dbd49d3e41c482a753884abc8aaaff7d1b0d0653`, tree +`2f37db7c119b846003f5a01a82d46c4cf965b474`. This review accepts the scoped +composite evidence below. It does not turn the cancelled all-local attempt +into a successful all-local run. + +## Completed local evidence + +Independently read the actual native receipt, specimen summaries, raw Rust and +normal/optimized Python logs, packet receipt and driver journal. All 1,903 +receipt source SHA256 values were checked against the actual qualified commit's +Git blobs and, before later documentation edits, the clean current files. All +152 conservative native pins match the approved independent source map. The +fresh receipt binds the approved v3 inventory, review and historical records. + +| Completed local claim | Actual result | +| --- | --- | +| Unchanged native/rational recipe | 18 commands, each exit 0 | +| Native Rust contracts | 7 + 16 + 10 + 2 = 35 passed, no failures, ignores or filters | +| Native specimens | Five actual TSVs and summaries; 11 rejected mutations per specimen | +| Qualification gate tests | 5 normal + 5 optimized, all passed | +| Independent oracle tests | 10 normal + 10 optimized, all passed without skips | +| Real packet consumer/rejection tests | 26 normal + 26 optimized, all passed without skips | +| Strict local core-only Clippy | Exit 0 | +| Complete local core-only ordinary tests | 722 passed, 0 failed, 10 explicit ignores, 85 top-level harnesses, 0 filtered | +| Strict local default Clippy | Exit 0 | + +Native receipt SHA256 is +`c295a810ccc480bd5fd267179f89f9815a419c03fc3ad8f5211d2c188caa3bf7`; +packet receipt SHA256 is +`59a2c46d1bb0bd2ae2255ab80d146acd1744be6e7e74aa018b22f61218c1d434`. +The actual exporter and retained ELF copy both have SHA256 +`4b2c44d880cbada3ac031f81b68c0a120b84aebd8c320f6d20d8d90dfd84943c`. +Packet primary receipt bytes exactly equal the fresh native receipt; TSV/data, +source, manifest and executable bindings pass. Native artifact names and all +artifact hashes match the actual output. No inherited-head receipt is consumed. +The completed local core log SHA256 is +`54bbe5bccc9eb45509ee215a6a5903ae29ba58bad9474c302f8e2c066feb7107`. + +## Source-identical hosted evidence and explicit replan + +Independently inspected supported-tool-downloaded run/job metadata and all +three raw feature-job logs from +[Rust run 39688034222](https://github.com/MrScripty/Rheon/actions/runs/39688034222), +attempt 1, actual head `dbd49d3`. The run completed successfully. Each feature +job's strict all-target Clippy and complete ordinary `cargo test --locked` +commands and steps passed with its declared flags. + +All three logs record actual checkout +`d5ef6e22322183f34be437a1e9427a2b7d53d9d2`. Independently inspected its Git +object: parents are `15026a966265cf9eaedf464e2b5a066bd0fef3d8` and `dbd49d3`, +and its complete tree equals the reviewed source tree exactly. This establishes +source identity despite the distinct synthetic pull-request merge commit. + +| Hosted ordinary feature suite | Job | Passed | Explicit ignores | Top-level harnesses | +| --- | --- | ---: | ---: | ---: | +| Core-only | 119526972309 | 722 | 10 | 85 | +| Default | 119526972867 | 730 | 10 | 86 | +| Desktop | 119526972766 | 1,114 | 17 | 88 | + +Every top-level summary reports zero failures and filters. Desktop emits four +additional nested child summaries, each with one pass and a nonzero filtered +count; they are deliberately excluded from the table to avoid double counting. +The full suites include the real B2/B3 differential paths and all three +compile-fail documentation contracts. Long selected-producer intervals and +real fallback cases were observed passing. No error/failed-test marker appears. +Executable job 119526972855 and aggregate job 119536864453 also have successful +source-bound metadata; their individual raw assertion logs were not separately +audited by this reviewer. + +The raw feature-log SHA256 values are: + +| Job | Raw log SHA256 | +| --- | --- | +| 119526972309 | `836c1482f5da4eea789a7b89288d7cb03cbdade69d918cb99ddaeb0c1dbca13b` | +| 119526972867 | `a6b2a716c69de8a2bd581516c62464aaf96e360fe021999c98ca4a546bd8bacf` | +| 119526972766 | `bf80a828f9e7be4dde2d3add12955e464df2d65c5af6569354dc2fb2ff1806c9` | + +Under Development Proportionality and Verification, these completed, +source-identical hosted feature suites satisfy the ordinary default/desktop +claims without duplicating the whole suites locally. Before cancellation, this +reviewer explicitly approved that revised recipe: completed local native, +packet and full core evidence plus completed hosted feature gates. No command, +assertion, explicit ignore, threshold or required gate changed. The original +protocol and driver remain frozen; this is an explicitly recorded new recipe, +not a retrospective claim that the original recipe completed. + +## Intentional local cancellation + +The original local driver completed every command through default Clippy. Its +duplicate default ordinary suite was deliberately stopped during +`material_contract-4052afe5fb62db1a` with SIGINT, after the above approval. Its +original journal remains `failed`, last command `tests-default`, exit 101. +The raw log records signal 2; no assertion panic or failed-test summary was +observed. Local desktop execution never began and is not claimed as passed. +The explicit cancellation/reconciliation records retain these facts separately +from successful completed evidence. + +Independently confirmed that owned driver PID 7921, Cargo PID 22421 and test +PID 26575 no longer existed before authoring this report. Qualification source +guards were not bypassed by documentation or workflow edits during execution. + +## Final archive audit + +Independently read and audited the completed local archive +`/workspace/rheon-pr142-dbd49d3-qualification.zip` and seal receipt. The archive +is 153,125,915 bytes, SHA256 +`4d55283ec9894b5c4c742e743913b6bc63fc8fbf413a21b6c6e6098d8e1fa04e`. +It has 191 unique members with no absolute/traversal names; ZIP CRC checks all +pass. Every member's actual size and SHA256 matches `MEMBERS.json`, whose +SHA256 is `c26fe09fa7d6961415e0113e510e3360c7cd6ce367e6cd187d0e7234ae359bd1`. + +Rechecked all 1,903 archived receipt source hashes against qualified committed +blobs, all 152 selected pins, all native artifact hashes, packet primary +receipt/data/TSV associations and every recorded command log hash. All 131 +retained executable entries in the original journal identify actual ELF bytes +matching their recorded SHA256. This is scoped journal/executable custody, not +an exhaustive identity claim for every operating-system child or rustdoc +temporary executable. + +The archive preserves the stale-admission refusal, the initial zero-test +exact-filter attempt, successful exact fixture regressions, the +unchanged original driver, failed progressive journal, interrupted default log, +hosted evidence, and explicit cancellation plus reconciliation. Reconciliation +status `passed-scoped-composite-evidence` accurately describes the new recipe; +it does not overwrite the failed/cancelled original attempt. +The earlier preparatory E0063 compile failure is retained in the execution +ledger and tool transcript; its raw compiler log is not a member of this archive. + +No material evidence or source-identity blocker remains for these scoped +claims. Later workflow/result-document commits require their exact diff, +unchanged native-source identity and applicable new-head checks to be verified. +Every receipt remains pinned to its actual source. Ignored tests are not passes; +native-window, whole-application production, new physical/scientific accuracy, +GPU/model deployment, performance and release acceptance remain outside these +contract results. This reviewer ran no Cargo, numerical campaign or graphical +execution and accessed no denied cloud task or artifact. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/final-admission-review.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/final-admission-review.md new file mode 100644 index 00000000..41e11854 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/final-admission-review.md @@ -0,0 +1,37 @@ +# Independent final v3 admission comparison + +On 2026-10-21, independently compared the actual working and staged admission +files and every staged selected source against the frozen 152-path source map. +All comparisons passed. No source change occurred after the complete review. + +| Reviewed artifact | SHA256 | +| --- | --- | +| Canonical sorted compact source-hash dictionary, no trailing newline | `4d6fbe1927962b23da4c37e32b476b20a2ae7f48bf0d11805c36065c8a8b464d` | +| Actual v3 inventory file | `a1c59a4d17ccdd1af16ff8ceadc08eedad54e92b1de043147057b7da48774a7f` | +| Actual bound integration review | `014e19aac55f3fceae1edef9deff8c41337b5c3ca3db655ba07b978b562fb28e` | +| Frozen independent source-map file | `ae828885a18fbf5c986b73d65353197a85194f7496337080e88e6198e5558421` | + +The active inventory's exact key/hash dictionary equals both the unchanged +conservative selector's actual files and the independently reviewed source map. +All 152 staged source blobs match these hashes; both admission files' staged +bytes equal their reviewed working bytes. The v3 schema/base, predecessor pin +dictionary and bound review digest are valid. Both prior review histories are +preserved as their common 72,250-byte prefix and complete divergent suffixes. + +Historical v1/v2 inventories, selector, admission checker, native qualifier, +rational oracle and packet rejection test source remain byte-identical to both +named parents. No old receipt was reinterpreted or used to qualify the new +composition. The actual appended review accurately states the complete map, +both inventory deltas, exact-source review scope and outstanding fresh gates. + +The unchanged `python3 docs/education/check_native_admission.py` was run by this +reviewer and passed with 152 paths. Its output explicitly states that this is +not qualification. No Cargo/native/rational or graphical execution was run by +this reviewer. + +Approve the actual explicit v3 refresh and the clean source commit needed for +the prospective protocol/driver reviewed in `protocol-review.md`. No material +source or metadata review blocker remains. Fresh committed-source qualification, +independent result review, applicable hosted checks and exact-head normal merge +verification remain the serial owner's required next steps. This review does +not establish scientific, graphical, performance or production acceptance. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/final-result-document-review.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/final-result-document-review.md new file mode 100644 index 00000000..4a07e620 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/final-result-document-review.md @@ -0,0 +1,85 @@ +# Independent final reporting-diff review + +PASS on 2026-10-21, delegated task `/root/pr142_source_review`. +Reviewed the entire actual `dbd49d3` to working-tree diff and all eight new +report/receipt/review files then present. This report is the ninth new file. +The four tracked changes are exactly the previously reviewed CI timeout patch +and the plan, ledger and issues status updates. No production source changes. + +All 152 selected runtime/build/qualification hashes still equal the frozen +independent source map. Existing v3 inventory, bound integration review, +historical inventories, source selector, admission checker, native qualifier, +oracle, packet consumer/tests and original prospective protocol remain +byte-identical to actual qualified commit +`dbd49d3e41c482a753884abc8aaaff7d1b0d0653`. The applied workflow has exactly +the reviewed candidate SHA256 +`80f732505778a8f7746ca42c52e919c5d7d2cbdf0fe2432c8695079663c8e300`. + +The frozen native/packet receipt files are byte-identical to the corresponding +independently audited sealed archive members, not regenerated receipts. Their +SHA256 values remain `c295a810ccc480bd5fd267179f89f9815a419c03fc3ad8f5211d2c188caa3bf7` +and `59a2c46d1bb0bd2ae2255ab80d146acd1744be6e7e74aa018b22f61218c1d434`. +The compact custody manifest's complete member dictionary equals archived +`MEMBERS.json`; its 131 executing-ELF entries equal the original journal. +The summary's evidence dictionary equals archived reconciliation, and its +archive fields equal the independently audited seal. These new checked-in +files retain metadata rather than raw log, numerical-field or executable bytes. + +The Markdown/machine result summaries, evidence replan and status updates +correctly retain actual execution source/tree, the intentionally cancelled +all-local recipe, original failed journal/exit 101/SIGINT, unexecuted local +desktop suite and independently accepted composite recipe. Hosted desktop is +1,114 top-level passes, 17 explicit ignores and 88 top-level harnesses, excluding +four nested child summaries. Explicit ignores are not passes. No all-local pass, +new receipt subject, full-plan completion or production/physical/graphical +acceptance is asserted. The local runtime sentence was narrowed to the observed +completed core suite's 18.2 minutes. + +The supporting-check statements were checked against the fresh source-bound +`/workspace/pr142-hosted-dbd49d3-check-runs.json`: native CPU, rational/kernel, +VTK and reference/book check metadata are successful on actual `dbd49d3`, while +the Pages build is in progress in that snapshot. Their raw assertion logs were +not separately audited here. The companion checks text reports CodeRabbit +skipping 214 files over its 100-file limit; the report correctly does not count +that status as independent source review. These snapshots do not establish +checks for a later reporting commit. + +Library storage failure is a separately reported supporting limitation, not a +successful upload or a qualification failure. Inspected the lead's explicitly +labelled tool-observation record and empty upload stdout file. The observation +reports exit 1, hosted apps tools/list network failure before preparation, no +returned Library identity, and no retry/alternate route. Stderr was not saved +as a raw local log; the observation is attributed to the lead's tool transcript, +not presented as independently captured stderr or an archive member. The raw +archive remains locally intact with its previously audited identity. This +operation is separate from the earlier denied artifact retrieval. + +Corrected this reviewer's own execution report to say exactly which raw +preflight outcomes are archived. The initial E0063 preparatory compiler failure +is retained in the ledger/tool transcript, not as a raw archive log. The archive +does retain stale-admission refusal, the initial zero-test filter and successful +exact regression logs. No root status/report or production file was edited by +this reviewer. + +## Exact reviewed reporting identities + +Paths below the completion report directory are shortened in this table. + +| File | SHA256 | +| --- | --- | +| `execution-ledger.md` in plan root | `78ea9e48a968364bdafe6f5f55776352a23e6d90ead5e23e043b0c17d18f4d4d` | +| `issues.md` in plan root | `c28c39b1a27d52a7e7902af21e90f44ee620f6de15f984b09c6ce286665a45da` | +| `plan.md` in plan root | `68020ec3742252560d84a3a75e18a29370384c759964972f426e4e9ad0c7bc96` | +| `custody-manifest.json` | `5df3a421acb7b5d8888b4b1407b4a261695109c7462132db2c65401e226debab` | +| `evidence-reconciliation.md` | `d98f2b2229612677c394d0fbda210a255a31e25ea6eb80d84a0933655b321bad` | +| `frozen-native-receipt.json` | `c295a810ccc480bd5fd267179f89f9815a419c03fc3ad8f5211d2c188caa3bf7` | +| `frozen-packet-receipt.json` | `59a2c46d1bb0bd2ae2255ab80d146acd1744be6e7e74aa018b22f61218c1d434` | +| `qualification.json` | `f919e0da932972b9f697751740e94d4e33fa8c8124c9e5a0dcf97d92c8a1f9cd` | +| `qualification.md` | `b3dcbb6c15b5c49b1d3023a5b423deca81be81ee8c04ab97cfd2f58b35b7a88c` | +| `source-review/ci-budget-review.md` | `cfe0875de8f62d3ed700011346cfe00ecad54e5d0bb56986ba77fb07534c0b41` | +| `source-review/execution-and-replan-review.md` | `9dbab81e4ad2849d6d5b39a4fade38c6233b26dbf2d26e798f462b84c924bc6d` | + +Approve committing this exact workflow/reporting follow-up. No material +source, evidence or reporting blocker remains. Applicable checks on the actual +new head, expected-head normal merge and post-merge source/check verification +remain required. Existing receipts stay bound to their actual `dbd49d3` subject. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/per-path-review.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/per-path-review.md new file mode 100644 index 00000000..766aee7f --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/per-path-review.md @@ -0,0 +1,158 @@ +# Per-path source review dispositions + +Each row is part of the unchanged conservative selector. Parent hashes and prior pins are in `source-map.json`; these justifications are source dispositions, not execution receipts. + +| Path | Disposition and review justification | SHA256 | +| --- | --- | --- | +| `Cargo.lock` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c` | +| `Cargo.toml` | Byte-identical to main; inherited owner inspected in composed call path. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae` | +| `examples/aligned_strain.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547` | +| `rust-toolchain.toml` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800` | +| `src/advection.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849` | +| `src/aligned_strain.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f` | +| `src/bin/desktop/README.md` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d` | +| `src/bin/desktop/accepted_session.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31` | +| `src/bin/desktop/ai_comparison/accepted_provider.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc` | +| `src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729` | +| `src/bin/desktop/ai_comparison/accepted_provider_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237` | +| `src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942` | +| `src/bin/desktop/ai_comparison/adapter.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2` | +| `src/bin/desktop/ai_comparison/configured_track.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 workflow producer/consumer retained: actual attempt observations, immutable selected publication, explicit terminal reads and frozen-intent checks. No paint-time provider execution or substitution of newer state. | `c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117` | +| `src/bin/desktop/ai_comparison/configured_track_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c` | +| `src/bin/desktop/ai_comparison/cpu_contract_tests.rs` | Differs from both named parents; exact composed source reviewed. Reviewed local fixture isolation repair: process ID plus AtomicU64 sequence and exclusive create_dir ownership; AlreadyExists retries stale/competing names. Same-timestamp 32-thread regression checks distinct directories and cleanup. No production behavior changes. | `e268555e0ebde7080f0ea8b2e8e398721fd1a65ec60f1925a314ace5f73d3488` | +| `src/bin/desktop/ai_comparison/diagnostic_runs.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c` | +| `src/bin/desktop/ai_comparison/diagnostic_view.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2` | +| `src/bin/desktop/ai_comparison/diagnostic_worker.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b` | +| `src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8` | +| `src/bin/desktop/ai_comparison/engine.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55` | +| `src/bin/desktop/ai_comparison/engine_typed_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad` | +| `src/bin/desktop/ai_comparison/mod.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076` | +| `src/bin/desktop/ai_comparison/model_process.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d` | +| `src/bin/desktop/ai_comparison/prediction_contract_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3` | +| `src/bin/desktop/ai_comparison/record.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d` | +| `src/bin/desktop/ai_comparison/scene.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321` | +| `src/bin/desktop/ai_comparison/view.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d` | +| `src/bin/desktop/ai_comparison/worker.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b` | +| `src/bin/desktop/archive_view.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff` | +| `src/bin/desktop/build_identity.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b` | +| `src/bin/desktop/camera.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d` | +| `src/bin/desktop/carrier_execution.rs` | Byte-identical to main; inherited owner inspected in composed call path. Native/configured saved execution owner retained; immutable specification, per-track force identity, cold archive binding and explicit unsupported combinations stay owned by their existing boundaries. | `c4455879373fc71eaaf398fdaa230c4d0b115dc7ff0a9da6356afeb24cba23b2` | +| `src/bin/desktop/collision_ui.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204` | +| `src/bin/desktop/comparison.rs` | Differs from both named parents; exact composed source reviewed. Composes PR142 immutable workflow selection/key invalidation with main ForceMetadata difference label. Workflow comparisons retain exact side/publication identity; force intent difference stays visible. | `cf8be77bcc46e192d0fcf44e8206d1e0a54a88deefcd178083ff39263ad957dc` | +| `src/bin/desktop/comparison_archive.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9` | +| `src/bin/desktop/comparison_field_view.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82` | +| `src/bin/desktop/configured_comparison_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46` | +| `src/bin/desktop/configured_controls.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review. | `5463e18b3b5a139c448dd327b23318605664e90aea4690187981177e7f68e60b` | +| `src/bin/desktop/configured_producer_exit_tests.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb` | +| `src/bin/desktop/configured_worker_tests.rs` | Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `06a9e7f5724b73c101a38dcc2c966d37b640900495643ea7bc04c13f4630f278` | +| `src/bin/desktop/emitter_controls.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9` | +| `src/bin/desktop/engineering.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d` | +| `src/bin/desktop/export_ui.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d` | +| `src/bin/desktop/force_run_policy.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review. | `cbb784c1cc403cfd524b715a52144c662f428b302014af1794bb3131d09bb97a` | +| `src/bin/desktop/force_run_policy_tests.rs` | Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `99d6b9e8b2a98eceab0514510d3f54873da50fdabc7626dd3896d45dd3c53383` | +| `src/bin/desktop/force_runtime_integration_tests.rs` | Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `04ba4f5883e48c5548cb420e17b6a6736436871d8e6c7792487939bfe5ed29a6` | +| `src/bin/desktop/force_runtime_ui_tests.rs` | Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `92475c2b577510a8f8fc11217f7eb1a5361dcaef20ade99f198f60d5b654966c` | +| `src/bin/desktop/history.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821` | +| `src/bin/desktop/identity.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184` | +| `src/bin/desktop/inspector.rs` | Differs from both named parents; exact composed source reviewed. Composes configured RCP4/RCT2 workflow capture and explicit cached selection with main force-bound material/carrier capture. Constructor and accepted force metadata use their own adapters. Projection profiles remain explicitly unavailable to the old workflow graph. Read/audit failures clear cached workflow and numerical selections. | `2e6a9f4f44e4a3843bc1c16953e1fc2f182a08b3a25e70f968084b454af8a438` | +| `src/bin/desktop/native_presentation_harness.rs` | Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `8ce8efa63afbe0d09e22996ec00478de331fcbda7a5ac83882f2ed3fff0d8ea1` | +| `src/bin/desktop/particle_view.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2` | +| `src/bin/desktop/run_set_view.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b` | +| `src/bin/desktop/run_sets.rs` | Byte-identical to main; inherited owner inspected in composed call path. Native/configured saved execution owner retained; immutable specification, per-track force identity, cold archive binding and explicit unsupported combinations stay owned by their existing boundaries. | `b25f07c5d9f4a27572922956043224c35dde35d9a0d987ab8af4f3f3151c91f0` | +| `src/bin/desktop/run_sets/configured.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Native/configured saved execution owner retained; immutable specification, per-track force identity, cold archive binding and explicit unsupported combinations stay owned by their existing boundaries. | `45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9` | +| `src/bin/desktop/run_sets/configured/archive.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 workflow producer/consumer retained: actual attempt observations, immutable selected publication, explicit terminal reads and frozen-intent checks. No paint-time provider execution or substitution of newer state. | `c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2` | +| `src/bin/desktop/run_sets/source.rs` | Byte-identical to main; inherited owner inspected in composed call path. Native/configured saved execution owner retained; immutable specification, per-track force identity, cold archive binding and explicit unsupported combinations stay owned by their existing boundaries. | `39e8982fffaf4e9adcd0ca0c60f49eabc96b829957bc6d9c05479c80eee99daf` | +| `src/bin/desktop/scene_handles.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review. | `4818b85644a2891de562adc00fc203eb59c674bbf46aa88cd440bcab6477eb22` | +| `src/bin/desktop/scene_ui.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review. | `e98c8aa0449b8f1adac4eb8a5bdc9a0951bd0b054f4dd2575d31dee30990c922` | +| `src/bin/desktop/scene_view.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review. | `d16851804c3aa727c7fdf658a821ef8c8cd2c167e853b72d02604f2a14dfa02f` | +| `src/bin/desktop/settings.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review. | `72a2e42de38100fa7cb517bfa7c1b9377975d23c3c4cd887615c296549c093c4` | +| `src/bin/desktop/setup_ui_tests.rs` | Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `278b7a20f5d48a4e8a6c8ee2a4b18f0377f09f78bd64b34cfb20d4545ebc2563` | +| `src/bin/desktop/timeline_ui_tests.rs` | Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `545e109f6d6808cc31482b8cffb4e21f8518d705424327728dc6c5d549a73df5` | +| `src/bin/desktop/transport_view.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable. | `e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8` | +| `src/bin/desktop/viewport.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review. | `4a365fbb1a0f48bd016b3d673b30e635ad26390205cb22c24d25fa46738b6a08` | +| `src/bin/desktop/workflow_inspector.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 workflow producer/consumer retained: actual attempt observations, immutable selected publication, explicit terminal reads and frozen-intent checks. No paint-time provider execution or substitution of newer state. | `4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f` | +| `src/bin/desktop/workflow_inspector_tests.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition. | `1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922` | +| `src/bin/rheon-ai-compare.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9` | +| `src/bin/rheon-desktop.rs` | Differs from both named parents; exact composed source reviewed. Composes main Scene/setup/timeline and immutable authored-force Request with PR142 workflow graph actions and WorkflowTermination. Worker validates force track/header binding and refuses configured authored presence before dispatch. Native/material execution uses per-track frozen force input. Workflow window selects configured carrier inspector or reports evidence unavailable; comparison graph identity is independently checked. | `6d16349502d2ce6bd3a2e07a5285cd1538703a48ec591215d7cb327d435a902a` | +| `src/bin/rheon.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51` | +| `src/box_flux.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0` | +| `src/box_flux_step.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b` | +| `src/collision.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115` | +| `src/column_mac.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84` | +| `src/column_momentum.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0` | +| `src/column_shear.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299` | +| `src/column_surface.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0` | +| `src/compressible.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3` | +| `src/coupled_discrete.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7` | +| `src/dense3d_sequence.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431` | +| `src/emitter.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84` | +| `src/emitter_controls.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4` | +| `src/export.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3` | +| `src/fitted_height.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a` | +| `src/fixed_bottom_ale.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47` | +| `src/force_field.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main force domain/solver adapter retained: frozen validated scene, SI units/support/time activation and bounded force stage; MAC accepted pressure stamp and particle accepted-control custody retain their distinct failure lifetimes. | `adecbc5f92b89179a2e38885be2acbcddd42df40061f00ffa5d758224ed045a5` | +| `src/forces.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main force domain/solver adapter retained: frozen validated scene, SI units/support/time activation and bounded force stage; MAC accepted pressure stamp and particle accepted-control custody retain their distinct failure lifetimes. | `7b3b48c0813c995a937a44ca1b624411c59dde6419b62041b67456cde2d692d9` | +| `src/free_surface.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e` | +| `src/geometry.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634` | +| `src/lib.rs` | Differs from both named parents; exact composed source reviewed. Additive union of workflow/native projection/native family APIs and authored-force APIs; existing target guards and native-only recording boundary retained. No dispatch, arithmetic, dependency version or selector change. | `6a9f704b00321be1cb9699e4d81d953030a42e3794f5b5d03ce548490f51f7b5` | +| `src/liquid_step.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 full interval composition retained: prepares carrier and volume in scratch, seals projection receipt or bounded workflow metadata before infallible pressure copy and owner swaps; failure preserves accepted fields and quota. Main authored-field entrypoints are separate. | `d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d` | +| `src/liquid_volume.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 explicit periodic donor-volume boundary retained: only full-cell domain admitted; matching seam velocities required, one seam transfer copied exactly, wrapped upwind donors and zero external boundary budget; existing inlet path preserved. | `7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650` | +| `src/material.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66` | +| `src/material_session.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960` | +| `src/mesh_collision.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24` | +| `src/mesh_import.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890` | +| `src/motion.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea` | +| `src/native_family.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 borrowed native-family facade retained; request family and expected run/generation checked before delegation to real MAC/particle owners. Cross-family transfer remains explicitly unsupported. | `070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5` | +| `src/native_family/tests.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 borrowed native-family facade retained; request family and expected run/generation checked before delegation to real MAC/particle owners. Cross-family transfer remains explicitly unsupported. | `6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5` | +| `src/observation.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee` | +| `src/obstacle_pressure.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07` | +| `src/obstacle_shear.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f` | +| `src/operator.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38` | +| `src/parallel.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e` | +| `src/particle_fluid.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main force domain/solver adapter retained: frozen validated scene, SI units/support/time activation and bounded force stage; MAC accepted pressure stamp and particle accepted-control custody retain their distinct failure lifetimes. | `538c498122bbc1045ae59d7363ff87e1dd9a40003fb48eeae835228ad4c65893` | +| `src/pressure.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5` | +| `src/pressure_session.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8` | +| `src/projection_step.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added. | `51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c` | +| `src/provider_step.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b` | +| `src/recording.rs` | Differs from both named parents; exact composed source reviewed. Additive module/export union for workflow, projection and force metadata. Main force run/step association validation is retained on append/read; absent metadata remains valid for legacy configured/projection paths. Existing SQL schema and byte hash algorithms are retained. | `4273be1af82f7a1ab9c0f141fc58b663354e5fc96e625835ad1dbcef2588af34` | +| `src/recording/carrier.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main accepted-force recording custody retained: bit-preserving bounded codec, validated freeze, exact run digest association and actual accepted-control stamp. Legacy absence is preserved and mismatched metadata fails. | `5a9b10b929f650423ad9e58bd7047bfe80cc7bf18138d74bd628c2f3f17af711` | +| `src/recording/comparison.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing recording consumer context retained; selected immutable fields, units/stage/time and bounded SQLite integrity remain governed by unchanged parent code. | `5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307` | +| `src/recording/diagnostic.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing recording consumer context retained; selected immutable fields, units/stage/time and bounded SQLite integrity remain governed by unchanged parent code. | `279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f` | +| `src/recording/force_fields.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main accepted-force recording custody retained: bit-preserving bounded codec, validated freeze, exact run digest association and actual accepted-control stamp. Legacy absence is preserved and mismatched metadata fails. | `2cf3ec9ec191c35c814d48ace301feaccd6cc73311a66970c9d112dad432c4a9` | +| `src/recording/material.rs` | Byte-identical to main; inherited owner inspected in composed call path. Main accepted-force recording custody retained: bit-preserving bounded codec, validated freeze, exact run digest association and actual accepted-control stamp. Legacy absence is preserved and mismatched metadata fails. | `e72e256aa3af46fef9002822de5281caf1de66ba070eb2109f77b083e20ae6ce` | +| `src/recording/projection.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 separate typed native-projection profile retained: native fields, immutable intent/receipt binding and terminal custody use explicit RPS/RPP/RPT versions. Old G1 graph evidence remains unavailable; no restart or execution authentication promise. | `49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588` | +| `src/recording/projection_tests.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 separate typed native-projection profile retained: native fields, immutable intent/receipt binding and terminal custody use explicit RPS/RPP/RPT versions. Old G1 graph evidence remains unavailable; no restart or execution authentication promise. | `5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d` | +| `src/recording/provider.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/workflow codec retained: RCP4 wraps existing RCP2/RCP3 and RCT2 wraps RCT1; complete decoding, source/prior-state binding and legacy/unknown-version handling remain distinct from force metadata. | `3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826` | +| `src/recording/provider/comparison.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. PR142 configured/workflow codec retained: RCP4 wraps existing RCP2/RCP3 and RCT2 wraps RCT1; complete decoding, source/prior-state binding and legacy/unknown-version handling remain distinct from force metadata. | `90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75` | +| `src/recording/provider/runtime.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/workflow codec retained: RCP4 wraps existing RCP2/RCP3 and RCT2 wraps RCT1; complete decoding, source/prior-state binding and legacy/unknown-version handling remain distinct from force metadata. | `2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381` | +| `src/recording/workflow.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/workflow codec retained: RCP4 wraps existing RCP2/RCP3 and RCT2 wraps RCT1; complete decoding, source/prior-state binding and legacy/unknown-version handling remain distinct from force metadata. | `020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1` | +| `src/sampling.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf` | +| `src/scheduling.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411` | +| `src/session.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b` | +| `src/session/configured.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4` | +| `src/session/projection.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added. | `b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4` | +| `src/session/projection_tests.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added. | `58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d` | +| `src/sgs.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d` | +| `src/simulation.rs` | Differs from both named parents; exact composed source reviewed. Conflict resolved additively: StepDomains carries workflow, fields and projection. Native field constructors explicitly set workflow/projection None; configured liquid path sets fields None and threads workflow; projection path sets fields/workflow None. Both inspection stamps invalidate before attempts and commit. Force application, projection choice, candidate-only preparation and final commit retain their owning parent behavior. | `0abf525a7535e48f04acd3ef408c15c7d93242906195f778fb0e1e8646dff254` | +| `src/solver_provider.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838` | +| `src/solver_provider/composition.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef` | +| `src/solver_provider/composition/projection.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added. | `c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3` | +| `src/solver_provider/composition/projection_tests.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added. | `1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e` | +| `src/solver_provider/composition_tests.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb` | +| `src/solver_provider/configured.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392` | +| `src/solver_provider/context.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693` | +| `src/solver_provider/modal.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796` | +| `src/static_obstacle.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080` | +| `src/tracer_barrier.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae` | +| `src/translated_viscous.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163` | +| `src/viscosity.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa` | +| `src/vtk_export.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance. | `56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e` | +| `src/workflow.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9` | +| `src/workflow/tests.rs` | Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner. | `5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5` | +| `tests/aligned_strain_contract.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16` | +| `tests/obstacle_flow_contract.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020` | +| `tests/static_obstacle_contract.rs` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de` | +| `tools/aligned_strain_oracle.py` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5` | +| `tools/qualify_aligned_strain.py` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba` | +| `tools/test_aligned_strain_oracle.py` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f` | +| `tools/test_qualify_aligned_strain.py` | Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed. | `48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db` | diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/protocol-review.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/protocol-review.md new file mode 100644 index 00000000..15a74b1d --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/protocol-review.md @@ -0,0 +1,42 @@ +# Independent prospective qualification protocol review + +Reviewed without execution on 2026-10-21 after the complete 152-path source +review. Subject protocol is `../protocol.md`, SHA256 +`bce8489f4890076bc4ec4534f809a88972ce82bb31cb43aa67d6b04477fb68ec`. +External driver is `/workspace/pr142-run-qualification.py`, SHA256 +`136201ef09fb74cbe9ea43138ea8b7f354d2412737431314627829ce4009fb9b`. +The driver was read in full and parsed as Python AST; it was not executed. + +No material source/protocol mismatch found. The source review and final active +v3 metadata comparison remain prerequisites to running this exact driver on a +clean committed tree. Its output directory is exclusive and outside Git. +Preparatory target reuse is disclosed and does not establish a cold build. +It clears ambient Python optimization, records material Cargo/Rust/Python +overrides, uses locked Cargo commands and the declared two-job profile, and +requires clean unchanged HEAD before each top-level command. + +The native qualifier is unchanged and independently owns its source/receipt +guard, 18-command native/rational recipe and 1800-second subprocess timeouts. +The driver checks its passed status, source HEAD and command cardinality, +binds the actual exporter bytes, and builds the packet with that fresh receipt. +Both packet suites must report exactly 26 tests and final OK without skips. +Strict all-target Clippy and ordinary tests cover core-only, default and +desktop configurations. No `--ignored`, `--allow-dirty`, older receipt input, +threshold change, cloud-task action or earlier artifact retrieval occurs. + +Raw logs and a progressive command journal retain exit/failure context. +Cargo `Running ... (path)` entries identify retained test executables, and +the exporter is retained separately. Source hashes and retained executable +copies are rechecked before success. These checks do not claim exhaustive +identity of every operating-system process (for example the Python interpreter, +rustdoc's temporary executables or a child adapter), process/RSS resource bounds +or native graphical behavior. The outer driver supplies no additional timeout +for feature suites; the protocol does not select a numerical campaign or rely +on such a bound for scientific authorization. + +Final log/ELF archive sealing, CRC/member audit, independent actual-result +review, hosted checks and exact-head normal merge verification are subsequent +protocol steps, not results established by this prospective review. A driver +exception must remain a failed attempt with its retained journal/logs; no +partial run may be promoted using a later run's outcomes. No execution or merge +acceptance is conferred by this document. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/review.md b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/review.md new file mode 100644 index 00000000..7ecd2490 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/review.md @@ -0,0 +1,137 @@ +# Independent PR142 completion source review + +Reviewed on 2026-10-21, read-only production source review by the delegated +`pr142_source_review` reviewer. The serial integration owner retains authority +for source edits, admission metadata, execution and normal merge. + +## Exact subject and complete closure + +The subject is the stable composed working source with retained PR142 parent +`4f2d55323825c8907cf9209914f29130ec7de511` and fetched main parent +`15026a966265cf9eaedf464e2b5a066bd0fef3d8`. This is a prospective source review, +not a clean committed-source execution receipt. The exact selected bytes are +bound in [source-map.json](source-map.json), [source.sha256](source.sha256) and +the individual [per-path dispositions](per-path-review.md). + +The unchanged `docs/education/aligned_strain_packet.py::reviewed_native_paths` +selects all 152 current source/build/qualification paths. Its file SHA256 is +`361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a` and it +is byte-identical to both parents. Nothing was excluded from this conservative +closure. The parent inventory union equals the current path set, but was used +only to check closure and lineage, never as automatic source admission. + +| Current byte identity | Paths | Disposition | +| --- | ---: | --- | +| Identical to both parents | 94 | Retained transitive context; each actual byte hash checked against both committed blobs and prior pins. | +| Identical to main | 24 | Retained force/UI owner and tests; composition reviewed at their actual call and recording boundaries. | +| Identical to PR142 | 27 | Retained workflow, closed projection, periodic volume and borrowed family owners/tests; composition reviewed at actual consumer boundaries. | +| Different from both | 7 | Six composed production files plus the isolated fixture/test repair; reviewed explicitly below. | + +Every prior PR142 inventory pin (140 paths) and main inventory pin (136 paths) +matches its own committed source blob; both original bound review digests +validate. This verifies retained lineage, not transfer of execution acceptance. +The exact unchanged-path justifications and both parent hashes are recorded for +every path, including build, qualifier, oracle and numerical context. + +## Composed behavior + +No material source defect remains in the reviewed composition. + +`src/simulation.rs` retains `workflow`, `fields` and `projection` in the same +private `StepDomains` owner. Native force constructors explicitly pass no +workflow/projection; liquid configured observation passes no authored fields; +closed projection passes no workflow/fields. Existing domain refusals and +workspace checks remain. Both interval-pressure inspection stamps invalidate +before attempts and commit, and the force-aware stamp is restored only after +the accepted force update. No caller can accidentally route authored fields +through the configured workflow observer or substitute projection receipts. + +`src/lib.rs` retains both public additions without changing a solver route or +target guard. `src/recording.rs` retains the force codec/module and the separate +projection/workflow codecs. Force run/step association is checked on append and +read; its absence remains valid for legacy and configured/projection records. +Neither SQL schema nor existing hash algorithms are changed by composition. + +The composed `inspector.rs` uses force-bound constructor/accepted adapters for +native carrier and material capture and RCP4/RCT2 for configured workflow +capture. Selection/audit failures clear cached numerical and workflow values. +Native projection archives explicitly refuse the old desktop graph profile. +`comparison.rs` keeps exact selected-side workflow identity and invalidation +and adds the force metadata difference label. These routes do not infer graph +evidence from a plain force archive. + +The composed desktop root preserves main's Scene/setup/timeline behavior and +immutable per-track force requests and PR142's workflow actions/termination. +Worker preflight rejects unsupported authored/configured combinations and +checks saved-track force binding before dispatch. Native/material execution +passes each frozen snapshot to its numerical owner and corresponding recording +adapter. Workflow inspection uses the configured carrier inspector or explicit +unavailable evidence; it does not run a provider during paint or silently use a +newer selected publication. These source conclusions are not native-window +interaction acceptance. + +Retained PR142 projection code binds the actual provisional request, qualifies +pressure and corrected velocity at the host, and accepts only representable +native selection/fallback facts. Candidate carrier/volume fields and receipt +sealing complete before infallible owner swaps. Failed attempt receipts remain +distinct from accepted publications and Session quota. Separate projection +codec versions and typed readers preserve their inspection boundary. Existing +configured workflow wrappers preserve legacy representations and bind prior +state, frozen request and terminal facts. The borrowed native-family facade +checks family/run/generation before delegating to real owners and refuses +cross-family conversion. Periodic volume checks matching seam velocities and +copies a single wrapped upwind transfer to the duplicate seam; the original +inlet path is preserved. All these files have exact PR142 parent identity. + +Retained main force code keeps validation in `freeze`, immutable snapshots, +SI support/time/units and explicit supported-target eligibility. Accepted +recording custody uses actual controls and reports; MAC scratch inspection +invalidates on a later attempt while particle accepted diagnostics retain their +own publication lifetime. The composition does not broaden supported paths. + +`cpu_contract_tests.rs` is the seventh changed file. Its test-only fixture uses +process ID, the supplied timestamp, an atomic sequence and exclusive directory +creation. `AlreadyExists` retries; other errors fail. Thus a coarse clock, +parallel test thread or stale directory does not create shared mutable fixture +ownership. The added 32-thread same-timestamp regression observes distinct +paths and successful cleanup. A wrapping sequence still cannot claim an +existing path because `create_dir` owns the final decision. No production +source is changed by this repair. Dynamic regression results belong to the +integration owner's execution record; this reviewer ran no Cargo tests. + +## Review history, standards and limits + +The bound review retains the common 72,250-byte prefix and each complete +divergent parent suffix. Their concatenation preserves both original review +histories without treating an old review as approval of this unseen source. +Original parent review SHA256 values are +`a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b` +and `32e81e49279b1a0f0fb7f0f35d3264f504099a856d8c09375af3215b6d424e9a`. +The machine map records the preservation check. This reviewer changed only the +authored files in this source-review directory; no production source, Git ref, +historical inventory, historical receipt or denied artifact was modified or +retrieved. + +Applied Coding Standards Core/router and relevant verification/documentation, +Rust/API, persistence, contract/evolution, concurrency and immutable-result +rules. The concurrent-plan profile was inspected; this delegated read-only +report with one serial integration owner does not itself authorize a second +shared-state integration writer. No automated standards certificate is claimed. + +## Source admission recommendation + +Approve an explicit refresh of the existing v3 inventory to exactly the 152 +hashes in `source-map.json`, preserving v1/v2, both histories and all historical +receipts. The source map SHA256 is +`ae828885a18fbf5c986b73d65353197a85194f7496337080e88e6198e5558421`; +the `source.sha256` file SHA256 is +`a35485c155d472ac5bc2b6287c645cd05d9821b28792d45bddcbe8e258e08bc1`. +This recommendation admits fresh clean committed-source native/rational and +ordinary feature-contract qualification only. The actual appended review and +v3 binding still require final metadata comparison, and any selected source +edit requires renewed review. Existing stale-inventory refusal must remain. + +No numerical campaign, GUI-window, physical accuracy, model deployment, +performance, release-artifact or whole-application production acceptance is +inferred. Fresh exact-source execution/results and applicable hosted checks +remain required before the serial owner normally merges PR142. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source-map.json b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source-map.json new file mode 100644 index 00000000..34cf4894 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source-map.json @@ -0,0 +1,2325 @@ +{ + "disposition_counts": { + "identical-both-parents": 94, + "identical-main": 24, + "identical-pr142": 27, + "reviewed-composition-or-fixture-repair": 7 + }, + "entries": [ + { + "bytes": 104189, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "pr142": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c" + }, + "parent_sha256": { + "main": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c", + "pr142": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c" + }, + "path": "Cargo.lock", + "sha256": "3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c" + }, + { + "bytes": 2332, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae", + "pr142": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e" + }, + "parent_sha256": { + "main": "f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae", + "pr142": "10a7b438ec5e7bdb2c8eb95137cf5a42d1cd35687ed47bf63b05a3e42dc1674e" + }, + "path": "Cargo.toml", + "sha256": "f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae" + }, + { + "bytes": 8135, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "pr142": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547" + }, + "parent_sha256": { + "main": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "pr142": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547" + }, + "path": "examples/aligned_strain.rs", + "sha256": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547" + }, + { + "bytes": 86, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "pr142": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800" + }, + "parent_sha256": { + "main": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "pr142": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800" + }, + "path": "rust-toolchain.toml", + "sha256": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800" + }, + { + "bytes": 8961, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "pr142": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849" + }, + "parent_sha256": { + "main": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "pr142": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849" + }, + "path": "src/advection.rs", + "sha256": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849" + }, + { + "bytes": 22750, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "pr142": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f" + }, + "parent_sha256": { + "main": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "pr142": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f" + }, + "path": "src/aligned_strain.rs", + "sha256": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f" + }, + { + "bytes": 14382, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "pr142": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d" + }, + "parent_sha256": { + "main": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "pr142": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d" + }, + "path": "src/bin/desktop/README.md", + "sha256": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d" + }, + { + "bytes": 986, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "pr142": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31" + }, + "parent_sha256": { + "main": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "pr142": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31" + }, + "path": "src/bin/desktop/accepted_session.rs", + "sha256": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31" + }, + { + "bytes": 11005, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "pr142": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc" + }, + "parent_sha256": { + "main": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "pr142": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc" + }, + "path": "src/bin/desktop/ai_comparison/accepted_provider.rs", + "sha256": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc" + }, + { + "bytes": 27732, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "pr142": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729" + }, + "parent_sha256": { + "main": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "pr142": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729" + }, + "path": "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs", + "sha256": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729" + }, + { + "bytes": 23364, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "pr142": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237" + }, + "parent_sha256": { + "main": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "pr142": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237" + }, + "path": "src/bin/desktop/ai_comparison/accepted_provider_tests.rs", + "sha256": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237" + }, + { + "bytes": 36460, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "pr142": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942" + }, + "parent_sha256": { + "main": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "pr142": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942" + }, + "path": "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs", + "sha256": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942" + }, + { + "bytes": 26707, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "pr142": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2" + }, + "parent_sha256": { + "main": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "pr142": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2" + }, + "path": "src/bin/desktop/ai_comparison/adapter.rs", + "sha256": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2" + }, + { + "bytes": 13613, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 workflow producer/consumer retained: actual attempt observations, immutable selected publication, explicit terminal reads and frozen-intent checks. No paint-time provider execution or substitution of newer state.", + "parent_inventory_pin": { + "main": "3959018b52697ef072884864c01de4682d1b4cd351c273426d914d02f0641fa1", + "pr142": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117" + }, + "parent_sha256": { + "main": "3959018b52697ef072884864c01de4682d1b4cd351c273426d914d02f0641fa1", + "pr142": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117" + }, + "path": "src/bin/desktop/ai_comparison/configured_track.rs", + "sha256": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117" + }, + { + "bytes": 29183, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "pr142": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c" + }, + "parent_sha256": { + "main": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "pr142": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c" + }, + "path": "src/bin/desktop/ai_comparison/configured_track_tests.rs", + "sha256": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c" + }, + { + "bytes": 15702, + "disposition": "reviewed-composition-or-fixture-repair", + "justification": "Differs from both named parents; exact composed source reviewed. Reviewed local fixture isolation repair: process ID plus AtomicU64 sequence and exclusive create_dir ownership; AlreadyExists retries stale/competing names. Same-timestamp 32-thread regression checks distinct directories and cleanup. No production behavior changes.", + "parent_inventory_pin": { + "main": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "pr142": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e" + }, + "parent_sha256": { + "main": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "pr142": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e" + }, + "path": "src/bin/desktop/ai_comparison/cpu_contract_tests.rs", + "sha256": "e268555e0ebde7080f0ea8b2e8e398721fd1a65ec60f1925a314ace5f73d3488" + }, + { + "bytes": 21835, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "pr142": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c" + }, + "parent_sha256": { + "main": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "pr142": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c" + }, + "path": "src/bin/desktop/ai_comparison/diagnostic_runs.rs", + "sha256": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c" + }, + { + "bytes": 36493, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "pr142": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2" + }, + "parent_sha256": { + "main": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "pr142": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2" + }, + "path": "src/bin/desktop/ai_comparison/diagnostic_view.rs", + "sha256": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2" + }, + { + "bytes": 14292, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "pr142": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b" + }, + "parent_sha256": { + "main": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "pr142": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b" + }, + "path": "src/bin/desktop/ai_comparison/diagnostic_worker.rs", + "sha256": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b" + }, + { + "bytes": 27017, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "pr142": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8" + }, + "parent_sha256": { + "main": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "pr142": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8" + }, + "path": "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs", + "sha256": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8" + }, + { + "bytes": 32246, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "pr142": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55" + }, + "parent_sha256": { + "main": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "pr142": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55" + }, + "path": "src/bin/desktop/ai_comparison/engine.rs", + "sha256": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55" + }, + { + "bytes": 10907, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "pr142": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad" + }, + "parent_sha256": { + "main": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "pr142": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad" + }, + "path": "src/bin/desktop/ai_comparison/engine_typed_tests.rs", + "sha256": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad" + }, + { + "bytes": 28365, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "pr142": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076" + }, + "parent_sha256": { + "main": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "pr142": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076" + }, + "path": "src/bin/desktop/ai_comparison/mod.rs", + "sha256": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076" + }, + { + "bytes": 40530, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "pr142": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d" + }, + "parent_sha256": { + "main": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "pr142": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d" + }, + "path": "src/bin/desktop/ai_comparison/model_process.rs", + "sha256": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d" + }, + { + "bytes": 12980, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "pr142": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3" + }, + "parent_sha256": { + "main": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "pr142": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3" + }, + "path": "src/bin/desktop/ai_comparison/prediction_contract_tests.rs", + "sha256": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3" + }, + { + "bytes": 7107, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "pr142": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d" + }, + "parent_sha256": { + "main": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "pr142": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d" + }, + "path": "src/bin/desktop/ai_comparison/record.rs", + "sha256": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d" + }, + { + "bytes": 5274, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "pr142": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321" + }, + "parent_sha256": { + "main": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "pr142": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321" + }, + "path": "src/bin/desktop/ai_comparison/scene.rs", + "sha256": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321" + }, + { + "bytes": 9171, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "pr142": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d" + }, + "parent_sha256": { + "main": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "pr142": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d" + }, + "path": "src/bin/desktop/ai_comparison/view.rs", + "sha256": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d" + }, + { + "bytes": 18705, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "pr142": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b" + }, + "parent_sha256": { + "main": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "pr142": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b" + }, + "path": "src/bin/desktop/ai_comparison/worker.rs", + "sha256": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b" + }, + { + "bytes": 9299, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "pr142": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff" + }, + "parent_sha256": { + "main": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "pr142": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff" + }, + "path": "src/bin/desktop/archive_view.rs", + "sha256": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff" + }, + { + "bytes": 987, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "pr142": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b" + }, + "parent_sha256": { + "main": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "pr142": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b" + }, + "path": "src/bin/desktop/build_identity.rs", + "sha256": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b" + }, + { + "bytes": 3055, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "pr142": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d" + }, + "parent_sha256": { + "main": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "pr142": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d" + }, + "path": "src/bin/desktop/camera.rs", + "sha256": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d" + }, + { + "bytes": 8697, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Native/configured saved execution owner retained; immutable specification, per-track force identity, cold archive binding and explicit unsupported combinations stay owned by their existing boundaries.", + "parent_inventory_pin": { + "main": "c4455879373fc71eaaf398fdaa230c4d0b115dc7ff0a9da6356afeb24cba23b2", + "pr142": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e" + }, + "parent_sha256": { + "main": "c4455879373fc71eaaf398fdaa230c4d0b115dc7ff0a9da6356afeb24cba23b2", + "pr142": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e" + }, + "path": "src/bin/desktop/carrier_execution.rs", + "sha256": "c4455879373fc71eaaf398fdaa230c4d0b115dc7ff0a9da6356afeb24cba23b2" + }, + { + "bytes": 7895, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "pr142": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204" + }, + "parent_sha256": { + "main": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "pr142": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204" + }, + "path": "src/bin/desktop/collision_ui.rs", + "sha256": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204" + }, + { + "bytes": 50508, + "disposition": "reviewed-composition-or-fixture-repair", + "justification": "Differs from both named parents; exact composed source reviewed. Composes PR142 immutable workflow selection/key invalidation with main ForceMetadata difference label. Workflow comparisons retain exact side/publication identity; force intent difference stays visible.", + "parent_inventory_pin": { + "main": "27ad4b88db848430a68f5f9fae796fa10eab1df26af9dbae73386e55c9b5c74f", + "pr142": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099" + }, + "parent_sha256": { + "main": "27ad4b88db848430a68f5f9fae796fa10eab1df26af9dbae73386e55c9b5c74f", + "pr142": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099" + }, + "path": "src/bin/desktop/comparison.rs", + "sha256": "cf8be77bcc46e192d0fcf44e8206d1e0a54a88deefcd178083ff39263ad957dc" + }, + { + "bytes": 19518, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "pr142": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9" + }, + "parent_sha256": { + "main": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "pr142": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9" + }, + "path": "src/bin/desktop/comparison_archive.rs", + "sha256": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9" + }, + { + "bytes": 32998, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "pr142": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82" + }, + "parent_sha256": { + "main": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "pr142": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82" + }, + "path": "src/bin/desktop/comparison_field_view.rs", + "sha256": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82" + }, + { + "bytes": 31956, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "pr142": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46" + }, + "parent_sha256": { + "main": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "pr142": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46" + }, + "path": "src/bin/desktop/configured_comparison_tests.rs", + "sha256": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46" + }, + { + "bytes": 37252, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review.", + "parent_inventory_pin": { + "main": "5463e18b3b5a139c448dd327b23318605664e90aea4690187981177e7f68e60b", + "pr142": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36" + }, + "parent_sha256": { + "main": "5463e18b3b5a139c448dd327b23318605664e90aea4690187981177e7f68e60b", + "pr142": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36" + }, + "path": "src/bin/desktop/configured_controls.rs", + "sha256": "5463e18b3b5a139c448dd327b23318605664e90aea4690187981177e7f68e60b" + }, + { + "bytes": 17651, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "pr142": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb" + }, + "parent_sha256": { + "main": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "pr142": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb" + }, + "path": "src/bin/desktop/configured_producer_exit_tests.rs", + "sha256": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb" + }, + { + "bytes": 23479, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "06a9e7f5724b73c101a38dcc2c966d37b640900495643ea7bc04c13f4630f278", + "pr142": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38" + }, + "parent_sha256": { + "main": "06a9e7f5724b73c101a38dcc2c966d37b640900495643ea7bc04c13f4630f278", + "pr142": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38" + }, + "path": "src/bin/desktop/configured_worker_tests.rs", + "sha256": "06a9e7f5724b73c101a38dcc2c966d37b640900495643ea7bc04c13f4630f278" + }, + { + "bytes": 5728, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "pr142": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9" + }, + "parent_sha256": { + "main": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "pr142": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9" + }, + "path": "src/bin/desktop/emitter_controls.rs", + "sha256": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9" + }, + { + "bytes": 32960, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "pr142": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d" + }, + "parent_sha256": { + "main": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "pr142": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d" + }, + "path": "src/bin/desktop/engineering.rs", + "sha256": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d" + }, + { + "bytes": 2539, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "pr142": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d" + }, + "parent_sha256": { + "main": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "pr142": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d" + }, + "path": "src/bin/desktop/export_ui.rs", + "sha256": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d" + }, + { + "bytes": 1303, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review.", + "parent_inventory_pin": { + "main": "cbb784c1cc403cfd524b715a52144c662f428b302014af1794bb3131d09bb97a", + "pr142": null + }, + "parent_sha256": { + "main": "cbb784c1cc403cfd524b715a52144c662f428b302014af1794bb3131d09bb97a", + "pr142": null + }, + "path": "src/bin/desktop/force_run_policy.rs", + "sha256": "cbb784c1cc403cfd524b715a52144c662f428b302014af1794bb3131d09bb97a" + }, + { + "bytes": 7457, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "99d6b9e8b2a98eceab0514510d3f54873da50fdabc7626dd3896d45dd3c53383", + "pr142": null + }, + "parent_sha256": { + "main": "99d6b9e8b2a98eceab0514510d3f54873da50fdabc7626dd3896d45dd3c53383", + "pr142": null + }, + "path": "src/bin/desktop/force_run_policy_tests.rs", + "sha256": "99d6b9e8b2a98eceab0514510d3f54873da50fdabc7626dd3896d45dd3c53383" + }, + { + "bytes": 14703, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "04ba4f5883e48c5548cb420e17b6a6736436871d8e6c7792487939bfe5ed29a6", + "pr142": null + }, + "parent_sha256": { + "main": "04ba4f5883e48c5548cb420e17b6a6736436871d8e6c7792487939bfe5ed29a6", + "pr142": null + }, + "path": "src/bin/desktop/force_runtime_integration_tests.rs", + "sha256": "04ba4f5883e48c5548cb420e17b6a6736436871d8e6c7792487939bfe5ed29a6" + }, + { + "bytes": 15874, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "92475c2b577510a8f8fc11217f7eb1a5361dcaef20ade99f198f60d5b654966c", + "pr142": null + }, + "parent_sha256": { + "main": "92475c2b577510a8f8fc11217f7eb1a5361dcaef20ade99f198f60d5b654966c", + "pr142": null + }, + "path": "src/bin/desktop/force_runtime_ui_tests.rs", + "sha256": "92475c2b577510a8f8fc11217f7eb1a5361dcaef20ade99f198f60d5b654966c" + }, + { + "bytes": 21523, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "pr142": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821" + }, + "parent_sha256": { + "main": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "pr142": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821" + }, + "path": "src/bin/desktop/history.rs", + "sha256": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821" + }, + { + "bytes": 429, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "pr142": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184" + }, + "parent_sha256": { + "main": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "pr142": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184" + }, + "path": "src/bin/desktop/identity.rs", + "sha256": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184" + }, + { + "bytes": 50287, + "disposition": "reviewed-composition-or-fixture-repair", + "justification": "Differs from both named parents; exact composed source reviewed. Composes configured RCP4/RCT2 workflow capture and explicit cached selection with main force-bound material/carrier capture. Constructor and accepted force metadata use their own adapters. Projection profiles remain explicitly unavailable to the old workflow graph. Read/audit failures clear cached workflow and numerical selections.", + "parent_inventory_pin": { + "main": "7a6582faf9bfff755d7fade624f6b11cca06813c75310fba25ccbfabff1d2aae", + "pr142": "54c68139c0aee8d8bcb24ea3fa303ecff6405ce75689fb440ef3184a75bcbe69" + }, + "parent_sha256": { + "main": "7a6582faf9bfff755d7fade624f6b11cca06813c75310fba25ccbfabff1d2aae", + "pr142": "54c68139c0aee8d8bcb24ea3fa303ecff6405ce75689fb440ef3184a75bcbe69" + }, + "path": "src/bin/desktop/inspector.rs", + "sha256": "2e6a9f4f44e4a3843bc1c16953e1fc2f182a08b3a25e70f968084b454af8a438" + }, + { + "bytes": 11635, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "8ce8efa63afbe0d09e22996ec00478de331fcbda7a5ac83882f2ed3fff0d8ea1", + "pr142": null + }, + "parent_sha256": { + "main": "8ce8efa63afbe0d09e22996ec00478de331fcbda7a5ac83882f2ed3fff0d8ea1", + "pr142": null + }, + "path": "src/bin/desktop/native_presentation_harness.rs", + "sha256": "8ce8efa63afbe0d09e22996ec00478de331fcbda7a5ac83882f2ed3fff0d8ea1" + }, + { + "bytes": 8253, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "pr142": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2" + }, + "parent_sha256": { + "main": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "pr142": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2" + }, + "path": "src/bin/desktop/particle_view.rs", + "sha256": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2" + }, + { + "bytes": 5164, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "pr142": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b" + }, + "parent_sha256": { + "main": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "pr142": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b" + }, + "path": "src/bin/desktop/run_set_view.rs", + "sha256": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b" + }, + { + "bytes": 35607, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Native/configured saved execution owner retained; immutable specification, per-track force identity, cold archive binding and explicit unsupported combinations stay owned by their existing boundaries.", + "parent_inventory_pin": { + "main": "b25f07c5d9f4a27572922956043224c35dde35d9a0d987ab8af4f3f3151c91f0", + "pr142": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1" + }, + "parent_sha256": { + "main": "b25f07c5d9f4a27572922956043224c35dde35d9a0d987ab8af4f3f3151c91f0", + "pr142": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1" + }, + "path": "src/bin/desktop/run_sets.rs", + "sha256": "b25f07c5d9f4a27572922956043224c35dde35d9a0d987ab8af4f3f3151c91f0" + }, + { + "bytes": 30187, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Native/configured saved execution owner retained; immutable specification, per-track force identity, cold archive binding and explicit unsupported combinations stay owned by their existing boundaries.", + "parent_inventory_pin": { + "main": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "pr142": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9" + }, + "parent_sha256": { + "main": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "pr142": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9" + }, + "path": "src/bin/desktop/run_sets/configured.rs", + "sha256": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9" + }, + { + "bytes": 20092, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 workflow producer/consumer retained: actual attempt observations, immutable selected publication, explicit terminal reads and frozen-intent checks. No paint-time provider execution or substitution of newer state.", + "parent_inventory_pin": { + "main": "eb1d8e77019eb57afd9e5fd5f57af55f8ff320527ec8efc935945bd7ff477806", + "pr142": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2" + }, + "parent_sha256": { + "main": "eb1d8e77019eb57afd9e5fd5f57af55f8ff320527ec8efc935945bd7ff477806", + "pr142": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2" + }, + "path": "src/bin/desktop/run_sets/configured/archive.rs", + "sha256": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2" + }, + { + "bytes": 9660, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Native/configured saved execution owner retained; immutable specification, per-track force identity, cold archive binding and explicit unsupported combinations stay owned by their existing boundaries.", + "parent_inventory_pin": { + "main": "39e8982fffaf4e9adcd0ca0c60f49eabc96b829957bc6d9c05479c80eee99daf", + "pr142": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11" + }, + "parent_sha256": { + "main": "39e8982fffaf4e9adcd0ca0c60f49eabc96b829957bc6d9c05479c80eee99daf", + "pr142": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11" + }, + "path": "src/bin/desktop/run_sets/source.rs", + "sha256": "39e8982fffaf4e9adcd0ca0c60f49eabc96b829957bc6d9c05479c80eee99daf" + }, + { + "bytes": 35097, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review.", + "parent_inventory_pin": { + "main": "4818b85644a2891de562adc00fc203eb59c674bbf46aa88cd440bcab6477eb22", + "pr142": null + }, + "parent_sha256": { + "main": "4818b85644a2891de562adc00fc203eb59c674bbf46aa88cd440bcab6477eb22", + "pr142": null + }, + "path": "src/bin/desktop/scene_handles.rs", + "sha256": "4818b85644a2891de562adc00fc203eb59c674bbf46aa88cd440bcab6477eb22" + }, + { + "bytes": 47177, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review.", + "parent_inventory_pin": { + "main": "e98c8aa0449b8f1adac4eb8a5bdc9a0951bd0b054f4dd2575d31dee30990c922", + "pr142": null + }, + "parent_sha256": { + "main": "e98c8aa0449b8f1adac4eb8a5bdc9a0951bd0b054f4dd2575d31dee30990c922", + "pr142": null + }, + "path": "src/bin/desktop/scene_ui.rs", + "sha256": "e98c8aa0449b8f1adac4eb8a5bdc9a0951bd0b054f4dd2575d31dee30990c922" + }, + { + "bytes": 37630, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review.", + "parent_inventory_pin": { + "main": "d16851804c3aa727c7fdf658a821ef8c8cd2c167e853b72d02604f2a14dfa02f", + "pr142": null + }, + "parent_sha256": { + "main": "d16851804c3aa727c7fdf658a821ef8c8cd2c167e853b72d02604f2a14dfa02f", + "pr142": null + }, + "path": "src/bin/desktop/scene_view.rs", + "sha256": "d16851804c3aa727c7fdf658a821ef8c8cd2c167e853b72d02604f2a14dfa02f" + }, + { + "bytes": 46529, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review.", + "parent_inventory_pin": { + "main": "72a2e42de38100fa7cb517bfa7c1b9377975d23c3c4cd887615c296549c093c4", + "pr142": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660" + }, + "parent_sha256": { + "main": "72a2e42de38100fa7cb517bfa7c1b9377975d23c3c4cd887615c296549c093c4", + "pr142": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660" + }, + "path": "src/bin/desktop/settings.rs", + "sha256": "72a2e42de38100fa7cb517bfa7c1b9377975d23c3c4cd887615c296549c093c4" + }, + { + "bytes": 32595, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "278b7a20f5d48a4e8a6c8ee2a4b18f0377f09f78bd64b34cfb20d4545ebc2563", + "pr142": null + }, + "parent_sha256": { + "main": "278b7a20f5d48a4e8a6c8ee2a4b18f0377f09f78bd64b34cfb20d4545ebc2563", + "pr142": null + }, + "path": "src/bin/desktop/setup_ui_tests.rs", + "sha256": "278b7a20f5d48a4e8a6c8ee2a4b18f0377f09f78bd64b34cfb20d4545ebc2563" + }, + { + "bytes": 18103, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": "545e109f6d6808cc31482b8cffb4e21f8518d705424327728dc6c5d549a73df5", + "pr142": null + }, + "parent_sha256": { + "main": "545e109f6d6808cc31482b8cffb4e21f8518d705424327728dc6c5d549a73df5", + "pr142": null + }, + "path": "src/bin/desktop/timeline_ui_tests.rs", + "sha256": "545e109f6d6808cc31482b8cffb4e21f8518d705424327728dc6c5d549a73df5" + }, + { + "bytes": 6248, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing desktop integration context retained with exact parent identity; reviewed composition changes its callers only through the explicit worker, inspector and root surfaces above. Existing failure, cancellation and selected-publication contracts remain applicable.", + "parent_inventory_pin": { + "main": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "pr142": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8" + }, + "parent_sha256": { + "main": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "pr142": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8" + }, + "path": "src/bin/desktop/transport_view.rs", + "sha256": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8" + }, + { + "bytes": 47109, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main authoring/presentation owner retained: validated immutable force snapshots and supported-target policy remain distinct from retained results, configured Session execution and workflow evidence. No new capabilities are enabled by this review.", + "parent_inventory_pin": { + "main": "4a365fbb1a0f48bd016b3d673b30e635ad26390205cb22c24d25fa46738b6a08", + "pr142": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530" + }, + "parent_sha256": { + "main": "4a365fbb1a0f48bd016b3d673b30e635ad26390205cb22c24d25fa46738b6a08", + "pr142": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530" + }, + "path": "src/bin/desktop/viewport.rs", + "sha256": "4a365fbb1a0f48bd016b3d673b30e635ad26390205cb22c24d25fa46738b6a08" + }, + { + "bytes": 33985, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 workflow producer/consumer retained: actual attempt observations, immutable selected publication, explicit terminal reads and frozen-intent checks. No paint-time provider execution or substitution of newer state.", + "parent_inventory_pin": { + "main": null, + "pr142": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f" + }, + "parent_sha256": { + "main": null, + "pr142": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f" + }, + "path": "src/bin/desktop/workflow_inspector.rs", + "sha256": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f" + }, + { + "bytes": 50345, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. Desktop test/harness source retained with exact parent identity; existing discovery and fixture paths remain connected through the composed desktop root. Historical GUI or numerical results are not transferred to this composition.", + "parent_inventory_pin": { + "main": null, + "pr142": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922" + }, + "parent_sha256": { + "main": null, + "pr142": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922" + }, + "path": "src/bin/desktop/workflow_inspector_tests.rs", + "sha256": "1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922" + }, + { + "bytes": 5924, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "pr142": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9" + }, + "parent_sha256": { + "main": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "pr142": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9" + }, + "path": "src/bin/rheon-ai-compare.rs", + "sha256": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9" + }, + { + "bytes": 168317, + "disposition": "reviewed-composition-or-fixture-repair", + "justification": "Differs from both named parents; exact composed source reviewed. Composes main Scene/setup/timeline and immutable authored-force Request with PR142 workflow graph actions and WorkflowTermination. Worker validates force track/header binding and refuses configured authored presence before dispatch. Native/material execution uses per-track frozen force input. Workflow window selects configured carrier inspector or reports evidence unavailable; comparison graph identity is independently checked.", + "parent_inventory_pin": { + "main": "d74cff5459f52d1cb01512b6300d9466411352f73b014491e3678d514844d1b3", + "pr142": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c" + }, + "parent_sha256": { + "main": "d74cff5459f52d1cb01512b6300d9466411352f73b014491e3678d514844d1b3", + "pr142": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c" + }, + "path": "src/bin/rheon-desktop.rs", + "sha256": "6d16349502d2ce6bd3a2e07a5285cd1538703a48ec591215d7cb327d435a902a" + }, + { + "bytes": 11640, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "pr142": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51" + }, + "parent_sha256": { + "main": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "pr142": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51" + }, + "path": "src/bin/rheon.rs", + "sha256": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51" + }, + { + "bytes": 17346, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "pr142": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0" + }, + "parent_sha256": { + "main": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "pr142": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0" + }, + "path": "src/box_flux.rs", + "sha256": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0" + }, + { + "bytes": 5487, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "pr142": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b" + }, + "parent_sha256": { + "main": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "pr142": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b" + }, + "path": "src/box_flux_step.rs", + "sha256": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b" + }, + { + "bytes": 12262, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "pr142": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115" + }, + "parent_sha256": { + "main": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "pr142": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115" + }, + "path": "src/collision.rs", + "sha256": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115" + }, + { + "bytes": 35637, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "pr142": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84" + }, + "parent_sha256": { + "main": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "pr142": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84" + }, + "path": "src/column_mac.rs", + "sha256": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84" + }, + { + "bytes": 22078, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "pr142": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0" + }, + "parent_sha256": { + "main": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "pr142": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0" + }, + "path": "src/column_momentum.rs", + "sha256": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0" + }, + { + "bytes": 37106, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "pr142": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299" + }, + "parent_sha256": { + "main": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "pr142": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299" + }, + "path": "src/column_shear.rs", + "sha256": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299" + }, + { + "bytes": 15155, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "pr142": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0" + }, + "parent_sha256": { + "main": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "pr142": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0" + }, + "path": "src/column_surface.rs", + "sha256": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0" + }, + { + "bytes": 29786, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "pr142": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3" + }, + "parent_sha256": { + "main": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "pr142": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3" + }, + "path": "src/compressible.rs", + "sha256": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3" + }, + { + "bytes": 61268, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "pr142": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7" + }, + "parent_sha256": { + "main": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "pr142": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7" + }, + "path": "src/coupled_discrete.rs", + "sha256": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7" + }, + { + "bytes": 20084, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "pr142": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431" + }, + "parent_sha256": { + "main": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "pr142": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431" + }, + "path": "src/dense3d_sequence.rs", + "sha256": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431" + }, + { + "bytes": 16400, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "pr142": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84" + }, + "parent_sha256": { + "main": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "pr142": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84" + }, + "path": "src/emitter.rs", + "sha256": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84" + }, + { + "bytes": 3358, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "pr142": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4" + }, + "parent_sha256": { + "main": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "pr142": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4" + }, + "path": "src/emitter_controls.rs", + "sha256": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4" + }, + { + "bytes": 4681, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "pr142": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3" + }, + "parent_sha256": { + "main": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "pr142": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3" + }, + "path": "src/export.rs", + "sha256": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3" + }, + { + "bytes": 48528, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "pr142": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a" + }, + "parent_sha256": { + "main": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "pr142": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a" + }, + "path": "src/fitted_height.rs", + "sha256": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a" + }, + { + "bytes": 28202, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "pr142": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47" + }, + "parent_sha256": { + "main": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "pr142": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47" + }, + "path": "src/fixed_bottom_ale.rs", + "sha256": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47" + }, + { + "bytes": 14833, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main force domain/solver adapter retained: frozen validated scene, SI units/support/time activation and bounded force stage; MAC accepted pressure stamp and particle accepted-control custody retain their distinct failure lifetimes.", + "parent_inventory_pin": { + "main": "adecbc5f92b89179a2e38885be2acbcddd42df40061f00ffa5d758224ed045a5", + "pr142": null + }, + "parent_sha256": { + "main": "adecbc5f92b89179a2e38885be2acbcddd42df40061f00ffa5d758224ed045a5", + "pr142": null + }, + "path": "src/force_field.rs", + "sha256": "adecbc5f92b89179a2e38885be2acbcddd42df40061f00ffa5d758224ed045a5" + }, + { + "bytes": 10490, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main force domain/solver adapter retained: frozen validated scene, SI units/support/time activation and bounded force stage; MAC accepted pressure stamp and particle accepted-control custody retain their distinct failure lifetimes.", + "parent_inventory_pin": { + "main": "7b3b48c0813c995a937a44ca1b624411c59dde6419b62041b67456cde2d692d9", + "pr142": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb" + }, + "parent_sha256": { + "main": "7b3b48c0813c995a937a44ca1b624411c59dde6419b62041b67456cde2d692d9", + "pr142": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb" + }, + "path": "src/forces.rs", + "sha256": "7b3b48c0813c995a937a44ca1b624411c59dde6419b62041b67456cde2d692d9" + }, + { + "bytes": 3639, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "pr142": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e" + }, + "parent_sha256": { + "main": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "pr142": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e" + }, + "path": "src/free_surface.rs", + "sha256": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e" + }, + { + "bytes": 11743, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "pr142": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634" + }, + "parent_sha256": { + "main": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "pr142": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634" + }, + "path": "src/geometry.rs", + "sha256": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634" + }, + { + "bytes": 8499, + "disposition": "reviewed-composition-or-fixture-repair", + "justification": "Differs from both named parents; exact composed source reviewed. Additive union of workflow/native projection/native family APIs and authored-force APIs; existing target guards and native-only recording boundary retained. No dispatch, arithmetic, dependency version or selector change.", + "parent_inventory_pin": { + "main": "30f5b78a98f6d0c010955a25fc00cc2de4aadf159d260e95afd3f3143dc6f9c3", + "pr142": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6" + }, + "parent_sha256": { + "main": "30f5b78a98f6d0c010955a25fc00cc2de4aadf159d260e95afd3f3143dc6f9c3", + "pr142": "912ad100d2fa06be6172e660464893b8f7a56b2ad0a22a48b7607e79796f6fd6" + }, + "path": "src/lib.rs", + "sha256": "6a9f704b00321be1cb9699e4d81d953030a42e3794f5b5d03ce548490f51f7b5" + }, + { + "bytes": 36342, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 full interval composition retained: prepares carrier and volume in scratch, seals projection receipt or bounded workflow metadata before infallible pressure copy and owner swaps; failure preserves accepted fields and quota. Main authored-field entrypoints are separate.", + "parent_inventory_pin": { + "main": "f99dce6a99f6af8a9aef2436af7f33de58dac3be5998a48e9187fbdf2acc3f93", + "pr142": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d" + }, + "parent_sha256": { + "main": "f99dce6a99f6af8a9aef2436af7f33de58dac3be5998a48e9187fbdf2acc3f93", + "pr142": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d" + }, + "path": "src/liquid_step.rs", + "sha256": "d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d" + }, + { + "bytes": 34771, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 explicit periodic donor-volume boundary retained: only full-cell domain admitted; matching seam velocities required, one seam transfer copied exactly, wrapped upwind donors and zero external boundary budget; existing inlet path preserved.", + "parent_inventory_pin": { + "main": "24623038f62261ce6a17b034e9b6d82c5f0aba02dd0df7aad174c885ed2a8c96", + "pr142": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650" + }, + "parent_sha256": { + "main": "24623038f62261ce6a17b034e9b6d82c5f0aba02dd0df7aad174c885ed2a8c96", + "pr142": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650" + }, + "path": "src/liquid_volume.rs", + "sha256": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650" + }, + { + "bytes": 7103, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "pr142": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66" + }, + "parent_sha256": { + "main": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "pr142": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66" + }, + "path": "src/material.rs", + "sha256": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66" + }, + { + "bytes": 10964, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "pr142": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960" + }, + "parent_sha256": { + "main": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "pr142": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960" + }, + "path": "src/material_session.rs", + "sha256": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960" + }, + { + "bytes": 19695, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "pr142": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24" + }, + "parent_sha256": { + "main": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "pr142": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24" + }, + "path": "src/mesh_collision.rs", + "sha256": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24" + }, + { + "bytes": 24294, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "pr142": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890" + }, + "parent_sha256": { + "main": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "pr142": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890" + }, + "path": "src/mesh_import.rs", + "sha256": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890" + }, + { + "bytes": 6031, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "pr142": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea" + }, + "parent_sha256": { + "main": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "pr142": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea" + }, + "path": "src/motion.rs", + "sha256": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea" + }, + { + "bytes": 9748, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 borrowed native-family facade retained; request family and expected run/generation checked before delegation to real MAC/particle owners. Cross-family transfer remains explicitly unsupported.", + "parent_inventory_pin": { + "main": null, + "pr142": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5" + }, + "parent_sha256": { + "main": null, + "pr142": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5" + }, + "path": "src/native_family.rs", + "sha256": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5" + }, + { + "bytes": 25318, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 borrowed native-family facade retained; request family and expected run/generation checked before delegation to real MAC/particle owners. Cross-family transfer remains explicitly unsupported.", + "parent_inventory_pin": { + "main": null, + "pr142": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5" + }, + "parent_sha256": { + "main": null, + "pr142": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5" + }, + "path": "src/native_family/tests.rs", + "sha256": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5" + }, + { + "bytes": 6669, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "pr142": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee" + }, + "parent_sha256": { + "main": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "pr142": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee" + }, + "path": "src/observation.rs", + "sha256": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee" + }, + { + "bytes": 24077, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "pr142": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07" + }, + "parent_sha256": { + "main": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "pr142": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07" + }, + "path": "src/obstacle_pressure.rs", + "sha256": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07" + }, + { + "bytes": 16421, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "pr142": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f" + }, + "parent_sha256": { + "main": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "pr142": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f" + }, + "path": "src/obstacle_shear.rs", + "sha256": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f" + }, + { + "bytes": 29555, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "pr142": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38" + }, + "parent_sha256": { + "main": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "pr142": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38" + }, + "path": "src/operator.rs", + "sha256": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38" + }, + { + "bytes": 5488, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "pr142": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e" + }, + "parent_sha256": { + "main": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "pr142": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e" + }, + "path": "src/parallel.rs", + "sha256": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e" + }, + { + "bytes": 57483, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main force domain/solver adapter retained: frozen validated scene, SI units/support/time activation and bounded force stage; MAC accepted pressure stamp and particle accepted-control custody retain their distinct failure lifetimes.", + "parent_inventory_pin": { + "main": "538c498122bbc1045ae59d7363ff87e1dd9a40003fb48eeae835228ad4c65893", + "pr142": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f" + }, + "parent_sha256": { + "main": "538c498122bbc1045ae59d7363ff87e1dd9a40003fb48eeae835228ad4c65893", + "pr142": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f" + }, + "path": "src/particle_fluid.rs", + "sha256": "538c498122bbc1045ae59d7363ff87e1dd9a40003fb48eeae835228ad4c65893" + }, + { + "bytes": 28790, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "pr142": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5" + }, + "parent_sha256": { + "main": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "pr142": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5" + }, + "path": "src/pressure.rs", + "sha256": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5" + }, + { + "bytes": 11353, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "pr142": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8" + }, + "parent_sha256": { + "main": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "pr142": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8" + }, + "path": "src/pressure_session.rs", + "sha256": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8" + }, + { + "bytes": 46652, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added.", + "parent_inventory_pin": { + "main": null, + "pr142": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c" + }, + "parent_sha256": { + "main": null, + "pr142": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c" + }, + "path": "src/projection_step.rs", + "sha256": "51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c" + }, + { + "bytes": 3888, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": "79167b70a8d164a2367f43816feab443eefb41f23bc4bd940716dd5fd32d495b", + "pr142": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b" + }, + "parent_sha256": { + "main": "79167b70a8d164a2367f43816feab443eefb41f23bc4bd940716dd5fd32d495b", + "pr142": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b" + }, + "path": "src/provider_step.rs", + "sha256": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b" + }, + { + "bytes": 38946, + "disposition": "reviewed-composition-or-fixture-repair", + "justification": "Differs from both named parents; exact composed source reviewed. Additive module/export union for workflow, projection and force metadata. Main force run/step association validation is retained on append/read; absent metadata remains valid for legacy configured/projection paths. Existing SQL schema and byte hash algorithms are retained.", + "parent_inventory_pin": { + "main": "47b2b24bbe9af777ceafdefa6f0b82200a60cea590d0b64f326de1d50c6d7d2d", + "pr142": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66" + }, + "parent_sha256": { + "main": "47b2b24bbe9af777ceafdefa6f0b82200a60cea590d0b64f326de1d50c6d7d2d", + "pr142": "6e543c95f148e67c6b7a548548785d50084abde60ee079cbbbbb9d6aae0eac66" + }, + "path": "src/recording.rs", + "sha256": "4273be1af82f7a1ab9c0f141fc58b663354e5fc96e625835ad1dbcef2588af34" + }, + { + "bytes": 13424, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main accepted-force recording custody retained: bit-preserving bounded codec, validated freeze, exact run digest association and actual accepted-control stamp. Legacy absence is preserved and mismatched metadata fails.", + "parent_inventory_pin": { + "main": "5a9b10b929f650423ad9e58bd7047bfe80cc7bf18138d74bd628c2f3f17af711", + "pr142": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509" + }, + "parent_sha256": { + "main": "5a9b10b929f650423ad9e58bd7047bfe80cc7bf18138d74bd628c2f3f17af711", + "pr142": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509" + }, + "path": "src/recording/carrier.rs", + "sha256": "5a9b10b929f650423ad9e58bd7047bfe80cc7bf18138d74bd628c2f3f17af711" + }, + { + "bytes": 27711, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing recording consumer context retained; selected immutable fields, units/stage/time and bounded SQLite integrity remain governed by unchanged parent code.", + "parent_inventory_pin": { + "main": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "pr142": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307" + }, + "parent_sha256": { + "main": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "pr142": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307" + }, + "path": "src/recording/comparison.rs", + "sha256": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307" + }, + { + "bytes": 67253, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing recording consumer context retained; selected immutable fields, units/stage/time and bounded SQLite integrity remain governed by unchanged parent code.", + "parent_inventory_pin": { + "main": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "pr142": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f" + }, + "parent_sha256": { + "main": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "pr142": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f" + }, + "path": "src/recording/diagnostic.rs", + "sha256": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f" + }, + { + "bytes": 20485, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main accepted-force recording custody retained: bit-preserving bounded codec, validated freeze, exact run digest association and actual accepted-control stamp. Legacy absence is preserved and mismatched metadata fails.", + "parent_inventory_pin": { + "main": "2cf3ec9ec191c35c814d48ace301feaccd6cc73311a66970c9d112dad432c4a9", + "pr142": null + }, + "parent_sha256": { + "main": "2cf3ec9ec191c35c814d48ace301feaccd6cc73311a66970c9d112dad432c4a9", + "pr142": null + }, + "path": "src/recording/force_fields.rs", + "sha256": "2cf3ec9ec191c35c814d48ace301feaccd6cc73311a66970c9d112dad432c4a9" + }, + { + "bytes": 16944, + "disposition": "identical-main", + "justification": "Byte-identical to main; inherited owner inspected in composed call path. Main accepted-force recording custody retained: bit-preserving bounded codec, validated freeze, exact run digest association and actual accepted-control stamp. Legacy absence is preserved and mismatched metadata fails.", + "parent_inventory_pin": { + "main": "e72e256aa3af46fef9002822de5281caf1de66ba070eb2109f77b083e20ae6ce", + "pr142": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00" + }, + "parent_sha256": { + "main": "e72e256aa3af46fef9002822de5281caf1de66ba070eb2109f77b083e20ae6ce", + "pr142": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00" + }, + "path": "src/recording/material.rs", + "sha256": "e72e256aa3af46fef9002822de5281caf1de66ba070eb2109f77b083e20ae6ce" + }, + { + "bytes": 46836, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 separate typed native-projection profile retained: native fields, immutable intent/receipt binding and terminal custody use explicit RPS/RPP/RPT versions. Old G1 graph evidence remains unavailable; no restart or execution authentication promise.", + "parent_inventory_pin": { + "main": null, + "pr142": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588" + }, + "parent_sha256": { + "main": null, + "pr142": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588" + }, + "path": "src/recording/projection.rs", + "sha256": "49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588" + }, + { + "bytes": 46824, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 separate typed native-projection profile retained: native fields, immutable intent/receipt binding and terminal custody use explicit RPS/RPP/RPT versions. Old G1 graph evidence remains unavailable; no restart or execution authentication promise.", + "parent_inventory_pin": { + "main": null, + "pr142": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d" + }, + "parent_sha256": { + "main": null, + "pr142": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d" + }, + "path": "src/recording/projection_tests.rs", + "sha256": "5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d" + }, + { + "bytes": 52170, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/workflow codec retained: RCP4 wraps existing RCP2/RCP3 and RCT2 wraps RCT1; complete decoding, source/prior-state binding and legacy/unknown-version handling remain distinct from force metadata.", + "parent_inventory_pin": { + "main": "980ea5af7094016b13e7d0f39110aa2ff673b0173416e0fe583e6266b7c27f57", + "pr142": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826" + }, + "parent_sha256": { + "main": "980ea5af7094016b13e7d0f39110aa2ff673b0173416e0fe583e6266b7c27f57", + "pr142": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826" + }, + "path": "src/recording/provider.rs", + "sha256": "3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826" + }, + { + "bytes": 7457, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. PR142 configured/workflow codec retained: RCP4 wraps existing RCP2/RCP3 and RCT2 wraps RCT1; complete decoding, source/prior-state binding and legacy/unknown-version handling remain distinct from force metadata.", + "parent_inventory_pin": { + "main": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "pr142": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75" + }, + "parent_sha256": { + "main": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "pr142": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75" + }, + "path": "src/recording/provider/comparison.rs", + "sha256": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75" + }, + { + "bytes": 32119, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/workflow codec retained: RCP4 wraps existing RCP2/RCP3 and RCT2 wraps RCT1; complete decoding, source/prior-state binding and legacy/unknown-version handling remain distinct from force metadata.", + "parent_inventory_pin": { + "main": "d7b2a1f7cfa866b33887f7c8f804999058d6e70a1c9d71421372d151152ebccb", + "pr142": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381" + }, + "parent_sha256": { + "main": "d7b2a1f7cfa866b33887f7c8f804999058d6e70a1c9d71421372d151152ebccb", + "pr142": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381" + }, + "path": "src/recording/provider/runtime.rs", + "sha256": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381" + }, + { + "bytes": 80771, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/workflow codec retained: RCP4 wraps existing RCP2/RCP3 and RCT2 wraps RCT1; complete decoding, source/prior-state binding and legacy/unknown-version handling remain distinct from force metadata.", + "parent_inventory_pin": { + "main": null, + "pr142": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1" + }, + "parent_sha256": { + "main": null, + "pr142": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1" + }, + "path": "src/recording/workflow.rs", + "sha256": "020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1" + }, + { + "bytes": 6347, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "pr142": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf" + }, + "parent_sha256": { + "main": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "pr142": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf" + }, + "path": "src/sampling.rs", + "sha256": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf" + }, + { + "bytes": 15224, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "pr142": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411" + }, + "parent_sha256": { + "main": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "pr142": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411" + }, + "path": "src/scheduling.rs", + "sha256": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411" + }, + { + "bytes": 18461, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", + "pr142": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b" + }, + "parent_sha256": { + "main": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", + "pr142": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b" + }, + "path": "src/session.rs", + "sha256": "fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b" + }, + { + "bytes": 16754, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": "d99ae990e9c7ddc956f95f414a25832411a4dc84ab434df95ff9f8f68cf52a83", + "pr142": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4" + }, + "parent_sha256": { + "main": "d99ae990e9c7ddc956f95f414a25832411a4dc84ab434df95ff9f8f68cf52a83", + "pr142": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4" + }, + "path": "src/session/configured.rs", + "sha256": "25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4" + }, + { + "bytes": 13897, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added.", + "parent_inventory_pin": { + "main": null, + "pr142": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4" + }, + "parent_sha256": { + "main": null, + "pr142": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4" + }, + "path": "src/session/projection.rs", + "sha256": "b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4" + }, + { + "bytes": 48330, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added.", + "parent_inventory_pin": { + "main": null, + "pr142": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d" + }, + "parent_sha256": { + "main": null, + "pr142": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d" + }, + "path": "src/session/projection_tests.rs", + "sha256": "58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d" + }, + { + "bytes": 14651, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "pr142": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d" + }, + "parent_sha256": { + "main": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "pr142": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d" + }, + "path": "src/sgs.rs", + "sha256": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d" + }, + { + "bytes": 53095, + "disposition": "reviewed-composition-or-fixture-repair", + "justification": "Differs from both named parents; exact composed source reviewed. Conflict resolved additively: StepDomains carries workflow, fields and projection. Native field constructors explicitly set workflow/projection None; configured liquid path sets fields None and threads workflow; projection path sets fields/workflow None. Both inspection stamps invalidate before attempts and commit. Force application, projection choice, candidate-only preparation and final commit retain their owning parent behavior.", + "parent_inventory_pin": { + "main": "c08ede6330c4bf6ed7e858e556806ec80628522ceb42286cf52714bf7430c9a1", + "pr142": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18" + }, + "parent_sha256": { + "main": "c08ede6330c4bf6ed7e858e556806ec80628522ceb42286cf52714bf7430c9a1", + "pr142": "c8ee3c84cb0dbdcc4768c560ca66741ec581866e6239d87c4be9e505944e3e18" + }, + "path": "src/simulation.rs", + "sha256": "0abf525a7535e48f04acd3ef408c15c7d93242906195f778fb0e1e8646dff254" + }, + { + "bytes": 12820, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": "0ab7db08a9016e73d664c730e4ff513d42599a84c680ea061e6604859432a5a5", + "pr142": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838" + }, + "parent_sha256": { + "main": "0ab7db08a9016e73d664c730e4ff513d42599a84c680ea061e6604859432a5a5", + "pr142": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838" + }, + "path": "src/solver_provider.rs", + "sha256": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838" + }, + { + "bytes": 3713, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": null, + "pr142": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef" + }, + "parent_sha256": { + "main": null, + "pr142": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef" + }, + "path": "src/solver_provider/composition.rs", + "sha256": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef" + }, + { + "bytes": 22377, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added.", + "parent_inventory_pin": { + "main": null, + "pr142": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3" + }, + "parent_sha256": { + "main": null, + "pr142": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3" + }, + "path": "src/solver_provider/composition/projection.rs", + "sha256": "c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3" + }, + { + "bytes": 39648, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 closed projection implementation/evidence retained: immutable provisional input binding; host pressure/corrected-velocity qualification; clean native fallback; independent failed-attempt receipt; full carrier/volume and receipt sealing before owner swaps. No authored-field path or arbitrary runtime is added.", + "parent_inventory_pin": { + "main": null, + "pr142": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e" + }, + "parent_sha256": { + "main": null, + "pr142": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e" + }, + "path": "src/solver_provider/composition/projection_tests.rs", + "sha256": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e" + }, + { + "bytes": 11454, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": null, + "pr142": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb" + }, + "parent_sha256": { + "main": null, + "pr142": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb" + }, + "path": "src/solver_provider/composition_tests.rs", + "sha256": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb" + }, + { + "bytes": 10720, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": "124ca65dd1dec3a8a89043198fb085453a42ca8aff0dc87c67b04b6a986109be", + "pr142": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392" + }, + "parent_sha256": { + "main": "124ca65dd1dec3a8a89043198fb085453a42ca8aff0dc87c67b04b6a986109be", + "pr142": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392" + }, + "path": "src/solver_provider/configured.rs", + "sha256": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392" + }, + { + "bytes": 6332, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "pr142": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693" + }, + "parent_sha256": { + "main": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "pr142": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693" + }, + "path": "src/solver_provider/context.rs", + "sha256": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693" + }, + { + "bytes": 6061, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "pr142": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796" + }, + "parent_sha256": { + "main": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "pr142": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796" + }, + "path": "src/solver_provider/modal.rs", + "sha256": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796" + }, + { + "bytes": 18098, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "pr142": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080" + }, + "parent_sha256": { + "main": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "pr142": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080" + }, + "path": "src/static_obstacle.rs", + "sha256": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080" + }, + { + "bytes": 9936, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "pr142": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae" + }, + "parent_sha256": { + "main": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "pr142": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae" + }, + "path": "src/tracer_barrier.rs", + "sha256": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae" + }, + { + "bytes": 29473, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "pr142": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163" + }, + "parent_sha256": { + "main": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "pr142": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163" + }, + "path": "src/translated_viscous.rs", + "sha256": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163" + }, + { + "bytes": 15726, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "pr142": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa" + }, + "parent_sha256": { + "main": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "pr142": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa" + }, + "path": "src/viscosity.rs", + "sha256": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa" + }, + { + "bytes": 21304, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Existing numerical or host context retained with exact parent identity. No local arithmetic or boundary edit is introduced; composed entrypoints preserve its existing contract. This identity disposition does not transfer prior numerical, physical or performance acceptance.", + "parent_inventory_pin": { + "main": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "pr142": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e" + }, + "parent_sha256": { + "main": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "pr142": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e" + }, + "path": "src/vtk_export.rs", + "sha256": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e" + }, + { + "bytes": 30244, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": null, + "pr142": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9" + }, + "parent_sha256": { + "main": null, + "pr142": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9" + }, + "path": "src/workflow.rs", + "sha256": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9" + }, + { + "bytes": 15862, + "disposition": "identical-pr142", + "justification": "Byte-identical to pr142; inherited owner inspected in composed call path. PR142 configured/session observation closure retained: accepted state and pressure history stay owned by Session; bounded workflow metadata follows the real attempt and publication. Preferred candidate qualification and native fallback remain at the pressure owner.", + "parent_inventory_pin": { + "main": null, + "pr142": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5" + }, + "parent_sha256": { + "main": null, + "pr142": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5" + }, + "path": "src/workflow/tests.rs", + "sha256": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5" + }, + { + "bytes": 12213, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "pr142": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16" + }, + "parent_sha256": { + "main": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "pr142": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16" + }, + "path": "tests/aligned_strain_contract.rs", + "sha256": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16" + }, + { + "bytes": 17654, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "pr142": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020" + }, + "parent_sha256": { + "main": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "pr142": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020" + }, + "path": "tests/obstacle_flow_contract.rs", + "sha256": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020" + }, + { + "bytes": 9794, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "pr142": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de" + }, + "parent_sha256": { + "main": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "pr142": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de" + }, + "path": "tests/static_obstacle_contract.rs", + "sha256": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de" + }, + { + "bytes": 19002, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "pr142": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5" + }, + "parent_sha256": { + "main": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "pr142": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5" + }, + "path": "tools/aligned_strain_oracle.py", + "sha256": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5" + }, + { + "bytes": 9126, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "pr142": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba" + }, + "parent_sha256": { + "main": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "pr142": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba" + }, + "path": "tools/qualify_aligned_strain.py", + "sha256": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba" + }, + { + "bytes": 12003, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "pr142": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f" + }, + "parent_sha256": { + "main": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "pr142": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f" + }, + "path": "tools/test_aligned_strain_oracle.py", + "sha256": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f" + }, + { + "bytes": 4547, + "disposition": "identical-both-parents", + "justification": "Byte-identical to both named parents; retained transitive context, no new source delta. Qualification/build authority retained: exact parent bytes preserve toolchain, dependencies, native specimen and independent rational/rejection oracles. No threshold, selector, receipt or qualification semantics are inferred or relaxed.", + "parent_inventory_pin": { + "main": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "pr142": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "parent_sha256": { + "main": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db", + "pr142": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "path": "tools/test_qualify_aligned_strain.py", + "sha256": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + } + ], + "parent_inventory_checks": { + "main": { + "every_pin_matches_parent_blob": true, + "path_count": 136, + "review_binding_valid": true, + "review_sha256": "32e81e49279b1a0f0fb7f0f35d3264f504099a856d8c09375af3215b6d424e9a" + }, + "pr142": { + "every_pin_matches_parent_blob": true, + "path_count": 140, + "review_binding_valid": true, + "review_sha256": "a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b" + } + }, + "path_count": 152, + "prior_review_preservation": { + "both_complete_divergent_histories_preserved": true, + "common_prefix_bytes": 72250, + "common_prefix_sha256": "60d006b75bcbf7f709900530e02f9526e0b02f4f35b8b69c1f24f3339a2a2ada", + "parent_review_sha256": { + "main": "32e81e49279b1a0f0fb7f0f35d3264f504099a856d8c09375af3215b6d424e9a", + "pr142": "a4e27e367c0604fc24c9b3020110832fc7ef85c902fcdd35ad2c5c684de9b97b" + } + }, + "schema": "rheon-pr142-independent-completion-source-review-v1", + "scope": "Unchanged reviewed_native_paths(): all src/.cargo/rust-toolchain and existing qualification inputs; no source selector narrowing.", + "selector": { + "path": "docs/education/aligned_strain_packet.py", + "sha256": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "unchanged_from_both_parents": true + }, + "source_parents": { + "main": "15026a966265cf9eaedf464e2b5a066bd0fef3d8", + "pr142": "4f2d55323825c8907cf9209914f29130ec7de511" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source.sha256 b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source.sha256 new file mode 100644 index 00000000..99768b13 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr142-completion-20261021/source-review/source.sha256 @@ -0,0 +1,152 @@ +3b5836a7be9f1290c698cadaff010e11b93e33b4af839c8549391c23e7d8ec0c Cargo.lock +f925dae7a0d74e6024e6e0d64962a275ae4f28fedec5b016341671021b8239ae Cargo.toml +11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547 examples/aligned_strain.rs +09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800 rust-toolchain.toml +0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849 src/advection.rs +1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f src/aligned_strain.rs +46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d src/bin/desktop/README.md +7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31 src/bin/desktop/accepted_session.rs +922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc src/bin/desktop/ai_comparison/accepted_provider.rs +643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729 src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs +11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237 src/bin/desktop/ai_comparison/accepted_provider_tests.rs +6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942 src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs +7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2 src/bin/desktop/ai_comparison/adapter.rs +c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117 src/bin/desktop/ai_comparison/configured_track.rs +a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c src/bin/desktop/ai_comparison/configured_track_tests.rs +e268555e0ebde7080f0ea8b2e8e398721fd1a65ec60f1925a314ace5f73d3488 src/bin/desktop/ai_comparison/cpu_contract_tests.rs +80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c src/bin/desktop/ai_comparison/diagnostic_runs.rs +1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2 src/bin/desktop/ai_comparison/diagnostic_view.rs +a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b src/bin/desktop/ai_comparison/diagnostic_worker.rs +fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8 src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs +610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55 src/bin/desktop/ai_comparison/engine.rs +584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad src/bin/desktop/ai_comparison/engine_typed_tests.rs +83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076 src/bin/desktop/ai_comparison/mod.rs +bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d src/bin/desktop/ai_comparison/model_process.rs +088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3 src/bin/desktop/ai_comparison/prediction_contract_tests.rs +2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d src/bin/desktop/ai_comparison/record.rs +c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321 src/bin/desktop/ai_comparison/scene.rs +568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d src/bin/desktop/ai_comparison/view.rs +6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b src/bin/desktop/ai_comparison/worker.rs +9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff src/bin/desktop/archive_view.rs +a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b src/bin/desktop/build_identity.rs +b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d src/bin/desktop/camera.rs +c4455879373fc71eaaf398fdaa230c4d0b115dc7ff0a9da6356afeb24cba23b2 src/bin/desktop/carrier_execution.rs +78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204 src/bin/desktop/collision_ui.rs +cf8be77bcc46e192d0fcf44e8206d1e0a54a88deefcd178083ff39263ad957dc src/bin/desktop/comparison.rs +813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9 src/bin/desktop/comparison_archive.rs +ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82 src/bin/desktop/comparison_field_view.rs +e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46 src/bin/desktop/configured_comparison_tests.rs +5463e18b3b5a139c448dd327b23318605664e90aea4690187981177e7f68e60b src/bin/desktop/configured_controls.rs +7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb src/bin/desktop/configured_producer_exit_tests.rs +06a9e7f5724b73c101a38dcc2c966d37b640900495643ea7bc04c13f4630f278 src/bin/desktop/configured_worker_tests.rs +d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9 src/bin/desktop/emitter_controls.rs +9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d src/bin/desktop/engineering.rs +1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d src/bin/desktop/export_ui.rs +cbb784c1cc403cfd524b715a52144c662f428b302014af1794bb3131d09bb97a src/bin/desktop/force_run_policy.rs +99d6b9e8b2a98eceab0514510d3f54873da50fdabc7626dd3896d45dd3c53383 src/bin/desktop/force_run_policy_tests.rs +04ba4f5883e48c5548cb420e17b6a6736436871d8e6c7792487939bfe5ed29a6 src/bin/desktop/force_runtime_integration_tests.rs +92475c2b577510a8f8fc11217f7eb1a5361dcaef20ade99f198f60d5b654966c src/bin/desktop/force_runtime_ui_tests.rs +e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821 src/bin/desktop/history.rs +df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184 src/bin/desktop/identity.rs +2e6a9f4f44e4a3843bc1c16953e1fc2f182a08b3a25e70f968084b454af8a438 src/bin/desktop/inspector.rs +8ce8efa63afbe0d09e22996ec00478de331fcbda7a5ac83882f2ed3fff0d8ea1 src/bin/desktop/native_presentation_harness.rs +75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2 src/bin/desktop/particle_view.rs +ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b src/bin/desktop/run_set_view.rs +b25f07c5d9f4a27572922956043224c35dde35d9a0d987ab8af4f3f3151c91f0 src/bin/desktop/run_sets.rs +45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9 src/bin/desktop/run_sets/configured.rs +c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2 src/bin/desktop/run_sets/configured/archive.rs +39e8982fffaf4e9adcd0ca0c60f49eabc96b829957bc6d9c05479c80eee99daf src/bin/desktop/run_sets/source.rs +4818b85644a2891de562adc00fc203eb59c674bbf46aa88cd440bcab6477eb22 src/bin/desktop/scene_handles.rs +e98c8aa0449b8f1adac4eb8a5bdc9a0951bd0b054f4dd2575d31dee30990c922 src/bin/desktop/scene_ui.rs +d16851804c3aa727c7fdf658a821ef8c8cd2c167e853b72d02604f2a14dfa02f src/bin/desktop/scene_view.rs +72a2e42de38100fa7cb517bfa7c1b9377975d23c3c4cd887615c296549c093c4 src/bin/desktop/settings.rs +278b7a20f5d48a4e8a6c8ee2a4b18f0377f09f78bd64b34cfb20d4545ebc2563 src/bin/desktop/setup_ui_tests.rs +545e109f6d6808cc31482b8cffb4e21f8518d705424327728dc6c5d549a73df5 src/bin/desktop/timeline_ui_tests.rs +e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8 src/bin/desktop/transport_view.rs +4a365fbb1a0f48bd016b3d673b30e635ad26390205cb22c24d25fa46738b6a08 src/bin/desktop/viewport.rs +4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f src/bin/desktop/workflow_inspector.rs +1a007629254e7145d6b9a2fca505f42630d05a38e3f9dc4af4f65b23c4fe7922 src/bin/desktop/workflow_inspector_tests.rs +00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9 src/bin/rheon-ai-compare.rs +6d16349502d2ce6bd3a2e07a5285cd1538703a48ec591215d7cb327d435a902a src/bin/rheon-desktop.rs +5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51 src/bin/rheon.rs +554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0 src/box_flux.rs +e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b src/box_flux_step.rs +101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115 src/collision.rs +40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84 src/column_mac.rs +373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0 src/column_momentum.rs +bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299 src/column_shear.rs +cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0 src/column_surface.rs +dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3 src/compressible.rs +b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7 src/coupled_discrete.rs +90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431 src/dense3d_sequence.rs +57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84 src/emitter.rs +47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4 src/emitter_controls.rs +afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3 src/export.rs +0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a src/fitted_height.rs +3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47 src/fixed_bottom_ale.rs +adecbc5f92b89179a2e38885be2acbcddd42df40061f00ffa5d758224ed045a5 src/force_field.rs +7b3b48c0813c995a937a44ca1b624411c59dde6419b62041b67456cde2d692d9 src/forces.rs +f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e src/free_surface.rs +712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634 src/geometry.rs +6a9f704b00321be1cb9699e4d81d953030a42e3794f5b5d03ce548490f51f7b5 src/lib.rs +d78dc80351771ac257f2643017c138709ea174d0e6dc4c4f7e1b92911babb41d src/liquid_step.rs +7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650 src/liquid_volume.rs +49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66 src/material.rs +4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960 src/material_session.rs +71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24 src/mesh_collision.rs +3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890 src/mesh_import.rs +8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea src/motion.rs +070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5 src/native_family.rs +6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5 src/native_family/tests.rs +2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee src/observation.rs +b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07 src/obstacle_pressure.rs +745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f src/obstacle_shear.rs +cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38 src/operator.rs +ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e src/parallel.rs +538c498122bbc1045ae59d7363ff87e1dd9a40003fb48eeae835228ad4c65893 src/particle_fluid.rs +39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5 src/pressure.rs +ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8 src/pressure_session.rs +51fe13c95772d1e3b68f2c261b50d5e2ec49bbc7adf8ff2573e3f36c2c34df1c src/projection_step.rs +20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b src/provider_step.rs +4273be1af82f7a1ab9c0f141fc58b663354e5fc96e625835ad1dbcef2588af34 src/recording.rs +5a9b10b929f650423ad9e58bd7047bfe80cc7bf18138d74bd628c2f3f17af711 src/recording/carrier.rs +5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307 src/recording/comparison.rs +279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f src/recording/diagnostic.rs +2cf3ec9ec191c35c814d48ace301feaccd6cc73311a66970c9d112dad432c4a9 src/recording/force_fields.rs +e72e256aa3af46fef9002822de5281caf1de66ba070eb2109f77b083e20ae6ce src/recording/material.rs +49323046bc72879a80fae248a3f5f05018f461df4d26c185b7458a05fe225588 src/recording/projection.rs +5b53bd71f5d4ca21cb51286d059d8041fecc400b3743e02ff22f28eb5fd7ce8d src/recording/projection_tests.rs +3daa4c37b3f78dcc1c02454e00d5586b3e859c1671766ae0f7fc6984190b7826 src/recording/provider.rs +90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75 src/recording/provider/comparison.rs +2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381 src/recording/provider/runtime.rs +020b8cd9d63dc5afedfb1b99b316fe584a5f226241abe4be159af960b13d2cc1 src/recording/workflow.rs +6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf src/sampling.rs +21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411 src/scheduling.rs +fffdcf8728bcc959db384c4567ad8200ec59be800fcb343a7324e208a776088b src/session.rs +25a3478d1408ee98f55fc072fcef97631df5283bd01f13e3ac81d947450e5ce4 src/session/configured.rs +b94b144d441730a50f641656dbfd069e7182b8471a73e8aba8b4df17c53cf0a4 src/session/projection.rs +58fb6694b80e8b87d7fff889c5e3a5adf801f1a2b3e671d37e352c01bbf8053d src/session/projection_tests.rs +0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d src/sgs.rs +0abf525a7535e48f04acd3ef408c15c7d93242906195f778fb0e1e8646dff254 src/simulation.rs +204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838 src/solver_provider.rs +f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef src/solver_provider/composition.rs +c122744dfc3b4fccd4c5755df10fef1c12033e51d87c191d73efdb0cdaab28a3 src/solver_provider/composition/projection.rs +1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e src/solver_provider/composition/projection_tests.rs +363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb src/solver_provider/composition_tests.rs +e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392 src/solver_provider/configured.rs +763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693 src/solver_provider/context.rs +c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796 src/solver_provider/modal.rs +df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080 src/static_obstacle.rs +1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae src/tracer_barrier.rs +6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163 src/translated_viscous.rs +3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa src/viscosity.rs +56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e src/vtk_export.rs +5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9 src/workflow.rs +5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5 src/workflow/tests.rs +d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16 tests/aligned_strain_contract.rs +7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020 tests/obstacle_flow_contract.rs +fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de tests/static_obstacle_contract.rs +902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5 tools/aligned_strain_oracle.py +5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba tools/qualify_aligned_strain.py +4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f tools/test_aligned_strain_oracle.py +48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db tools/test_qualify_aligned_strain.py diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery-review.md b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery-review.md new file mode 100644 index 00000000..6b851e9e --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery-review.md @@ -0,0 +1,56 @@ +# Independent exact CI budget recovery review + +Reviewed committed subject `79d5a82f1f14879aa249590212dd1683b06a4ef7` plus the +pending authored recovery documents. Reviewed document identities: + +| File | SHA256 | +| --- | --- | +| `ci-budget-recovery.md` | `8d371af8479734cb474a6e290d645a21844fc149b55930bcb6c8eda32f5c01a0` | +| `ci-budget-recovery.json` | `ce2407fe84e51042288a8e6d8dba83736bc752e00acc223694acf08fb844eee9` | +| `hosted-ci-failure-39692570591.json` | `86f1534ae6067d2ab137a442ca0981791bd89c848d9eac0cf26f508fbf317cb9` | +| Pending `plan.md` | `860ebb3c3464901537f2ee4dfadef3d1d0dfb0e0f27eff454e958a841cdbed81` | + +The retained decoded executable log has exact SHA256 +`971e1790afe431ab5e9535bbf23feecfc422e90d13f9929e09d2c0f26384b8cd`. +It identifies checkout `7e99fa3bc06ed032ead003ea0b4557642a8ccee5` and shows +219 tests, two errors and 27 skips. Both error traces identify the exact feature +header comparison in `verify_split_ci_budget`. A read-only GitHub commit API +lookup independently confirms that checkout's tree +`21b9d6fba7713215f835d4c505fa70aca7d393ac` equals the actual tree of failed +head `41c68c80`. The failure remains a failure; other jobs are not inferred passed. + +I inspected the actual 15-line helper/test diff. AST comparisons establish that +every prior top-level method outside the helper/class and every old +`CiBudgetContract` test method is unchanged. Within `verify_split_ci_budget`, +only the exact feature-header string changes: the reviewed two comments and +60-minute value replace 30. The remaining helper AST is identical. The sole new +test first accepts the actual exact header and then rejects 30, 59, 61 and a +missing value through the existing strict prefix comparison. There is no +normalization, range admission, assertion weakening or numerical-method change. + +Current guard SHA256 is +`46a9d538ef4680e983099a3dfdcb6eb98b7ca87a5f8c8ec80e02d64508142960`. +Workflow SHA256 remains +`80f732505778a8f7746ca42c52e919c5d7d2cbdf0fe2432c8695079663c8e300`. +All 152 selected input hashes remain exact; production, Cargo, qualifiers, +private examples/tests, CV3 preparation payloads and admission records have no +delta against ordinary executed source `31c19585`. The changed source-only +workflow guard is outside that native admission selection. + +Both retained local guard logs have their recorded SHA256 +`8b1e10158d32c5c32e8b421ca010cadb069fa0183e175a960d0020ce21215aad` +and report four passing cases with zero skips. The recovery record separately +attributes normal and `-O` argv; identical log bytes do not independently prove +distinct invocations, and are not treated as such. The owner records the separate +executions. Source inspection confirms these four class methods create no +numerical fixture or Cargo/scientific workload. This review reran no test. + +No blocking source, custody or reporting finding remains for this bounded +recovery. Approve committing the reviewed recovery documentation and publishing +the resulting head for fresh ordinary hosted qualification. This does not +accept the failed old head, transfer the `31c19585` receipt to changed source, +or authorize scientific execution. If the known-failed old run is still active, +its status must be checked after the new reviewed head is published before +scoped cancellation; every failure and cancellation stays recorded. Verified +PR142-then-PR138 main integration, final exact-head review, required hosted gates +and sole lead merge authority remain outstanding. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery.json b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery.json new file mode 100644 index 00000000..1d1f1224 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery.json @@ -0,0 +1,56 @@ +{ + "schema": "rheon-pr143-exact-ci-budget-contract-recovery-v1", + "source_head": "79d5a82f1f14879aa249590212dd1683b06a4ef7", + "source_tree": "0d2983529be4e9f13d933519cb104ccb17b89162", + "lead_repair": "3cd735fde7655aedffbd0ffb2f041ca6994961a4", + "failure_record": "hosted-ci-failure-39692570591.json", + "failure_record_sha256": "86f1534ae6067d2ab137a442ca0981791bd89c848d9eac0cf26f508fbf317cb9", + "guard_source_sha256": "46a9d538ef4680e983099a3dfdcb6eb98b7ca87a5f8c8ec80e02d64508142960", + "workflow_sha256": "80f732505778a8f7746ca42c52e919c5d7d2cbdf0fe2432c8695079663c8e300", + "native_selected_inputs": 152, + "native_admission_changed": false, + "private_preparation_source_changed": false, + "python": "3.12.14", + "Pillow_import_version": "12.3.0", + "commands": [ + { + "argv": [ + "python3", + "-m", + "unittest", + "test_column_interface_verifier.CiBudgetContract", + "-v" + ], + "environment": { + "PYTHONDONTWRITEBYTECODE": "1", + "PYTHONPATH": "tools" + }, + "exit": 0, + "cases": 4, + "skips": 0, + "log": "/workspace/pr143-ci-budget-contract-normal.log", + "log_sha256": "8b1e10158d32c5c32e8b421ca010cadb069fa0183e175a960d0020ce21215aad" + }, + { + "argv": [ + "python3", + "-O", + "-m", + "unittest", + "test_column_interface_verifier.CiBudgetContract", + "-v" + ], + "environment": { + "PYTHONDONTWRITEBYTECODE": "1", + "PYTHONPATH": "tools" + }, + "exit": 0, + "cases": 4, + "skips": 0, + "log": "/workspace/pr143-ci-budget-contract-optimized.log", + "log_sha256": "8b1e10158d32c5c32e8b421ca010cadb069fa0183e175a960d0020ce21215aad" + } + ], + "scope": "Exact reviewed60min feature-header expectation plus strict30/59/61/missing negatives; frozen baseline, all old workload/numerical test methods, commands, matrix, runner, other budgets and gates unchanged. No numerical fixture or selected campaign invocation.", + "remaining": "Independent recovery/publication review, fresh actual-head full hosted CI, verified142 then138 main revalidation and final exact-head review/lead merge." +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery.md b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery.md new file mode 100644 index 00000000..5b63e237 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/ci-budget-recovery.md @@ -0,0 +1,33 @@ +# Exact CI budget contract recovery + +PR143 head `41c68c80d1d4a64b219c10dd280d2544ef439ea3` produced a retained +hosted executable failure in [run39692570591/job119542065950](https://github.com/MrScripty/Rheon/actions/runs/39692570591/job/119542065950). +Actual checkout `7e99fa3bc06ed032ead003ea0b4557642a8ccee5` has exactly the head's +tree `21b9d6fba7713215f835d4c505fa70aca7d393ac`. The harness ran 219 cases, +with two errors and 27 conditional skips. Both errors compare the full feature +job prefix against the old 30-minute header; the reviewed workflow uses 60. +The source-bound [failure record](hosted-ci-failure-39692570591.json) retains the +decoded log identity and exact case names. No result is relabelled as a pass. + +Normal merge of lead-reviewed repair `3cd735fde7655aedffbd0ffb2f041ca6994961a4` +is `79d5a82f1f14879aa249590212dd1683b06a4ef7`. Its only executable source change +updates the exact expected header and adds strict feature-budget mutations for +30, 59, 61 and missing values. Existing numerical-verifier methods, old test +methods, frozen eight-step baseline, commands, matrix, runner, other budgets and +aggregate gates remain unchanged. No range matcher, normalization or skip was +added. The source-only helper is outside the unchanged 152-input admission. + +On that actual clean merge subject, all four `CiBudgetContract` tests pass +normally and under Python `-O`, zero skips. The class creates no numerical +fixture; no Cargo command or scientific campaign was run for this repair. +Python 3.12.14 and the existing Pillow 12.3.0 import were observed. Both logs +happen to be byte-identical; their commands and interpreter flags are recorded +separately in [recovery custody](ci-budget-recovery.json). + +The original successful ordinary qualification remains bound to `31c1958` and +its own scope. The failed composed hosted run remains failed; other job outcomes +are observed separately. Publish the reviewed repair on a new head for fresh +ordinary hosted qualification, then verify actual PR142-then-PR138 main, +complete source/admission identity and final exact-head review before the sole +lead's normal merge. Original cancelled attempts, preparation seals and scientific +limits remain unchanged; no CV3 scientific or production acceptance follows. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/execution-review.md b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/execution-review.md new file mode 100644 index 00000000..7702547c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/execution-review.md @@ -0,0 +1,96 @@ +# Independent ordinary execution and result review + +Actual executed subject is clean commit +`31c1958545a7f29bde4e8aa15c991ede4ade4643`, tree +`d5cfe181c0d55b8b8b9287bcb11a52b864a312f8`. I audited existing source objects, +external logs, receipts, packet and retained binaries read-only. I ran no Rust +or native test, selected oracle import, numerical campaign or evidence retry. + +Reviewed result documents, before adding this review: + +| Path | Bytes | SHA256 | +| --- | ---: | --- | +| `qualification.md` | 5307 | `19a832927a127f08388e46d251289b483083a8762c728fa179c3b4fb2e9c715d` | +| `qualification.json` | 12672 | `7e803424f574ed9fd94a7efed82b63317ae6aff3f4ef65a6dbb2197762e461ea` | + +## Independently checked custody + +The journal records terminal `passed`, clean source, the exact subject/tree and +11 commands with exit zero. The unchanged native qualifier's separate receipt +records the same clean subject/tree and all 18 commands with exit zero. Both +full source maps equal the 2,029 actual committed Git blobs, independently +read through `git cat-file`, as well as all present tracked source bytes. The +canonical compact sorted full-map SHA256 equals the result manifest. No later +reporting bytes are represented as part of the executed subject. + +All 53 journal artifact paths exist, the roster is complete and every SHA256 +matches the journal and compact result manifest. Journal SHA256 is +`0049f6c7a8093b083de6974e6e77110990d7c5aefc629558f568d07f67546d1c`; +native receipt SHA256 is +`6ada052ec414fad2823c69946061b8c58103e1ec2b0e2c84f362b7f24c43f9b0`. +The repaired recorder has reviewed SHA256 +`3217f552ee1c9d6a2db39abd07f0c3427efb47739aa9b3285006f5752c2c6c12`; +its external driver log has SHA256 +`1b45d3c7c88d33eada791361f16721126ed48a02fdfe8e7fefa1b1bdac0ec96d`. +The 11 command events in that raw log agree with the journal and end in the +same terminal passed subject. This is persisted completion evidence; the later +reported unknown process-session lookup is a transport observation, not a test +failure or an independent reason to repeat completed work. + +The actual `Running ... (ELF)` log identities name the seven Rust test binaries; +the exporter is the eighth executing binary. Every original executable exists +with ELF magic, recorded size and SHA256, and each retained external copy is +byte-identical. The exporter hash agrees with the new native receipt and real +packet receipt. The packet has exactly the four required files; its embedded +primary qualification is byte-for-byte the new native receipt, and all packet +file hashes match. Packet receipt source head/tree and selected source map bind +the actual execution, rather than an earlier binary or receipt. + +The admission log verifies 152 current paths on the actual executed commit. +The reviewed full selected map, active v3 inventory and bound review are already +inside the independently verified complete source map. Their bytes remain +exactly those approved in `source-protocol-review.md`; no pin refresh or selector +change was used. The normal no-default dependency log contains none of the Q2 +development rational crates. Rust/Cargo version logs show 1.92.0; the journal +records Python 3.12.14, jobs 2, incremental zero and dev/test debug zero. These +are ordinary warm-cache integration observations, not build reproducibility or +performance claims. + +## Direct outcome observations + +- Native Rust logs show 7 + 16 + 10 + 2 = 35 passed, zero failures or ignores. + All five fresh native/rational summary files exist; each retains all eleven + targeted rejection labels, and all five comparison command exits are zero. +- Gate Python logs show 5 normal and 5 optimized tests, both `OK`. Native-oracle + logs show 10 normal and 10 optimized tests, both `OK`. +- Both real-packet logs show exact count 26, all 26 run and `OK`, without any + skipped result. The inspected recorder additionally rejects nonzero skips. +- Strict no-default all-target Clippy completed successfully with warnings + denied; the raw log reports the real crate check and completed dev profile. +- Coupled, variational and static private adapter logs show 15 + 10 + 13 passed, + zero failures. Exactly the three original CV3 preparation numerical contracts + remain ignored with their frozen execution-admission reason. Ordinary inherited + unit checks did execute; they are separate from the sealed campaigns. + +The executed argv matches the approved ordinary protocol and unchanged qualifier. +No `--ignored`, private example `main`, CV3 case driver, selected scientific +oracle or scientific control invocation appears. The original root preparation +freeze still has solely the previously reviewed current Cargo.toml variance; +all 16 current oracle snapshot entries match. Original source maps, failures, +cancelled CI outcomes and scientific caps were not rewritten by this attempt. + +## Disposition + +No blocking execution/custody/reporting finding was identified. The reviewed +result documents accurately describe a passed preliminary ordinary qualification +on their exact subject and retain its material limitations. The original +attempt-1/attempt-2 hosted cancellations and aggregate failures remain separate +outcomes. This local pass does not replace current-head hosted checks. + +Final PR142-then-PR138 merged-main identities, comparison of the actual complete +closure and private source with this executed subject, final exact-head review, +required hosted gates and serial lead merge authority remain pending. Any +selected-source or admission change needs a newly reviewed disposition. No CV3 +scientific result, physical accuracy, generic cut stability, moving geometry/GCL, +hardware/native-window, performance or whole-application production acceptance +is established by these ordinary passes. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/hosted-ci-failure-39692570591.json b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/hosted-ci-failure-39692570591.json new file mode 100644 index 00000000..811b4a4b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/hosted-ci-failure-39692570591.json @@ -0,0 +1,26 @@ +{ + "schema": "rheon-pr143-hosted-failure-v1", + "head": "41c68c80d1d4a64b219c10dd280d2544ef439ea3", + "checkout": "7e99fa3bc06ed032ead003ea0b4557642a8ccee5", + "tree": "21b9d6fba7713215f835d4c505fa70aca7d393ac", + "checkout_tree_matches_head": true, + "run_id": 39692570591, + "attempt": 1, + "job_id": 119542065950, + "job_name": "executable-contracts", + "job_conclusion": "failure", + "job_url": "https://github.com/MrScripty/Rheon/actions/runs/39692570591/job/119542065950", + "decoded_log": "/workspace/pr143-hosted-failure-39692570591-executable.log", + "decoded_log_sha256": "971e1790afe431ab5e9535bbf23feecfc422e90d13f9929e09d2c0f26384b8cd", + "harness_cases": 219, + "errors": 2, + "conditional_skips": 27, + "failing_cases": [ + "CiBudgetContract.test_ci_budget_preserves_every_existing_job_check", + "CiBudgetContract.test_only_exact_reviewed_isolated_setup_and_additive_contracts_are_allowed" + ], + "diagnosis": "Exact source-only prefix verifier still requires old30min feature header; reviewed workflow uses60min plus two comments. Both errors are runner/budget/matrix/dependencies: feature-contracts at verifier line102.", + "disposition": "Preserve failure. Adopt independently reviewed lead-owned exact-header contract repair with unchanged workloads/matrix/gates and strict negative budget controls; then publish a new head for fresh ordinary CI. No automatic retry of this failed head.", + "scientific_campaign_or_ignored_cv3_tests_run": false, + "other_jobs": "Still running at failure inspection; no pass inferred. Later outcomes must be recorded separately." +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/plan.md b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/plan.md new file mode 100644 index 00000000..ff4a0b19 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/plan.md @@ -0,0 +1,161 @@ +# PR143 preparation integration + +Status: preliminary ordinary qualification and independent execution review pass; +dependency/hosted-gated for final readiness. +Owner: PR143 worker. Serial integration owner: PR142 lead. Operation: retain the +complete existing PR143 preparation through ordinary reviewed merge, after PR142 +then PR138. Current target inspected: main +`15026a966265cf9eaedf464e2b5a066bd0fef3d8`. + +## Authority and scope + +The user requested completion and merge of the five remaining PRs on 2026-10-21. +This task owns PR143, original head +`c7f76ec45eeceff1d6e63eef16f868323556b418`, branch +`implementation/q2-static-mms-pilot-20261020`. The CV3-A source is preparation +only. Its nine-case scientific campaign, selected numerical contracts and oracle +execution remain unrun and outside this integration task. The preparation and +source-bound failures, cancellations, reviews and receipts retain their original +identities. No old numerical result becomes a result for this composition. + +Integration work is isolated at `/workspace/Rheon-pr143`, local branch +`integration/pr143-current-main`. All original branches and workspaces are +preserved. Normal merge commits retain ancestry; no rebase, force push, branch +deletion or unrelated implementation is selected. Once final qualification and +independent exact-head review pass, publish the exact ready head on PR143 for the +lead. Merge only after verified lead authorization, or leave merging to the lead. + +The bounded integration write set is this report directory, appended native +admission review and its complete v3 inventory if the actual dependency delta +requires them. The frozen CV3 plan remains an original source record; this +integration report supplies current status without changing its frozen payload. +Frozen preparation payloads and their SHA256 manifests are immutable. Shared CI +timeout repair belongs to the lead; PR143 does not race that workflow edit. + +## Source admission and validation + +1. Inspect current repository instructions and standards, actual PR/source + histories, original preparation seals and the recorded cancelled job. +2. After verified PR142 then PR138 integration, merge fresh main into this + isolated branch; reconcile overlaps while preserving their owners and reviews. +3. Compare every selected native/build input against the actual admitted v3 + inventory, classify added/changed/unchanged/removed paths and dependencies, + and independently review any explicit admission extension before committing. + Preserve all predecessor inventory/review bytes and selectors. +4. On the clean committed source run the existing admission checker. If a new + admission is required, run unchanged fresh native/rational qualification and + real packet normal/optimized rejection tests, with fresh external outputs. + Required ordinary CI remains binding. Do not rerun sealed numerical campaigns + to clear CI, import selected CV3 oracle modules or select ignored CV3 tests. +5. Obtain independent review of the exact ready head and actual outcomes; post + source, dependencies, tests, limits and review on PR143. Recheck target/head + before serial merge and check actual post-merge CI and ancestry. + +The next slice is dependency reconciliation after PR142 then PR138. Preliminary +compile-only checks can run before that event but are not transferred as final +composed qualification. Failed commands retain their output and require diagnosis +before a justified bounded retry. Existing cloud task reads/resumes and the denied +artifact download remain excluded; Git and admitted GitHub actions are used. + +The lead subsequently froze PR142's selected source at +`dbd49d3e41c482a753884abc8aaaff7d1b0d0653` and allowed isolated preliminary +dependency preparation/testing while its long ordinary checks run. PR138 owns +its bounded admission refresh. PR143 requests that exact reviewed preliminary +head for downstream composition, with final admission/ready status still gated +on actual verified PR142 then PR138 landing. A clean normal preparatory merge of +frozen PR142 is `7a0f5f006ef766523bf72b422ca11ee985f99d12`: 150 of its 152 selected +pins remain exact, with only inherited Q2 dev-reference Cargo.toml/lock differing. +No PR142 source was edited. Compile-only +`cargo check --locked --no-default-features --all-targets` passes on that subject +in 15.88 seconds. No native qualification or numerical campaign was executed. + +PR138 then published independently reviewed preliminary composition +`91c4f4bd8bb29e9862f6ee29cd8bdead79e0d57e`, explicitly available for downstream +isolated preparation/testing. Its normal merge into this branch is +`3e43f6080e8e0e4b7d77ac7d8c81a10c6eb643e4`. There is no source, Cargo or selected +qualifier delta against that dependency. The unchanged native admission checker +now passes all 152 paths with the exact PR138 v3 inventory/review unchanged; +no new admission record or pin refresh is needed. The next slice is clean-source +ordinary qualification under [protocol.md](protocol.md), independently reviewed +in [source-protocol-review.md](source-protocol-review.md). Final ready status +still waits verified PR142 then PR138 merged-main identity and final gates. + +The reviewed ordinary attempt passed on clean `31c1958545a7f29bde4e8aa15c991ede4ade4643`. +The separate [result report](qualification.md), [compact manifest](qualification.json) +and [independent execution audit](execution-review.md) retain exact source and +actual counts: 18 unchanged native commands, 35 native Rust contracts, five real +specimens, gate 5+5, oracle 10+10, real packet 26+26 with zero skips, strict Clippy +and 38 private contracts with the three original CV3 numerical ignores retained. +All 2,029 source hashes, 53 artifact identities and eight actual executing ELF +copies were independently checked. No scientific campaign or retry occurred. +The next slice is actual dependency/main revalidation, the lead-owned shared CI +budget repair plus required hosted gates, and final exact ready-head review. + +The lead's exact 30-to-60 outer CI budget was adopted at `41c68c8` without any +selected/private/admission change and published to the original draft PR branch +by normal fast-forward. Hosted run39692570591 then failed its executable path: +two exact source-header guards still expected the old 30-minute prefix. The +[failure and recovery](ci-budget-recovery.md) preserve that outcome and log. +The independently reviewed strict guard repair from lead/`3cd735f` was normally +merged at `79d5a82`; all four source-only guard cases pass normally and optimized, +with added 30/59/61/missing negatives. Full 152-input admission and all private +preparation bytes remain unchanged. No automatic retry or campaign occurred. +The next slice is independent recovery/publication review and new-head ordinary +hosted CI, followed by actual dependency/main revalidation and final ready review. + +Preliminary subject `286df732106717d056330b276d6f563e79a447b8` passes +`cargo fmt --all --check` and +`cargo check --locked --no-default-features --all-targets` with Rust/Cargo 1.92.0. +The latter completed in 45.04 seconds; it executes no Rust tests or examples. +`cargo clippy --locked --no-default-features --all-targets -- -D warnings` passes +in 19.84 seconds. `cargo build --locked --release --no-default-features --example +grid_static_mms_reference` passes in 1 minute 22 seconds; its executable was not +run. These build checks are preliminary and preserve the preparation-only scope. +The [independent preliminary review](review-preliminary.md) verifies the original +54 root freeze, 16 oracle and 25 source-review entries, plus AST-only parsing of +14 Python files. Integrated `Cargo.toml` adds main's `force-serde` feature and is +the sole variance in those frozen selections. Original seals remain unchanged. + +The unchanged `docs/education/check_native_admission.py` refuses the preliminary +composition with exit 1: `changed qualified native source Cargo.lock`. This +expected source-identity failure is retained; it is not a numerical comparison +failure. Final admission must consume the lead's reviewed PR142 then PR138 +composition. No selector, pin or old receipt was changed to clear the failure. + +## Recorded CI diagnosis + +[Run 39377493085](https://github.com/MrScripty/Rheon/actions/runs/39377493085), +attempt 2, desktop job 119483887509, checked out historical synthetic merge +`ea5aa6d8edcec956eebeb6956230aeadfdeb5eed`: original c7f76ec into PR139/902f609, +not the current main composition. The job starts at 21:07:18Z and is cancelled +at 21:37:33Z, matching the workflow's 30-minute whole-job limit. Strict Clippy +passed. Ordinary tests reached `submarine_stokes_contract` with no observed +assertion failure before runner cancellation. Default, core-only and executable +jobs passed, while the aggregate failed because desktop did not finish. This +does not prove that remaining contracts pass. Attempt 1 and attempt 2 outcomes +are preserved; no stale run retry is selected. A fresh ordinary CI attempt needs +the reviewed resource-budget repair and actual composed source. + +The [check-run annotations](https://api.github.com/repos/MrScripty/Rheon/check-runs/119483887509/annotations) +explicitly confirm: `The job has exceeded the maximum execution time of 30m0s`. +Attempt 2 API metadata records `cancelled`, job start 21:07:17Z and completion +21:37:36Z. Attempt 1 desktop job 118478799152 also remains cancelled, with its +aggregate failure retained. Neither attempt is a pass or fresh qualification. + +## Standards and evidence boundary + +No ancestor or repository AGENTS.md was found. Coding-Standards current main is +`0fc92a24279f3a4574c80af0a2f31ea347a21597`. Core and Router select Implementation, +Verification, Development Proportionality, Planning, Commit, Documentation, Build +and Tooling; Rust and dependency/tooling mechanisms apply to composed Cargo +admission, and Dependencies/Licensing apply if identities change. Concurrent Plan +Integration applies to the shared native inventory and serial PR prerequisites. +The source/output policy keeps logs, binaries and generated fields outside Git. +This is source-guided standards application, not an automated conformance claim. + +Preparation integration establishes preservation and ordinary source/dependency +compatibility. It supplies no CV3 numerical results, uncertainty certificate, +rank, norm, spectrum, convergence order, physical accuracy, moving geometry/GCL, +generic cut stability, mesh-water, GPU/native-window or production acceptance. +The frozen command file still describes its original historical binaries and +paths; it is not an executable admission for the newly composed source. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/protocol.md b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/protocol.md new file mode 100644 index 00000000..8da00746 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/protocol.md @@ -0,0 +1,98 @@ +# PR143 ordinary integration qualification + +This protocol permits preliminary ordinary integration tests on the independently +reviewed dependency composition. Final ready status still requires verified +PR142 then PR138 merged-main identities, final exact-head review and hosted gates. +The lead owns normal main merges. No selected CV3 scientific execution is admitted. + +## Source and admission + +Pre-protocol composition is `3e43f6080e8e0e4b7d77ac7d8c81a10c6eb643e4`, retaining +original PR143/c7f76ec, frozen PR142/dbd49d3 and independently reviewed preliminary +PR138/91c4f4b by normal merge ancestry. There is no `src`, Cargo or selected +qualifier delta against PR138. The unchanged native admission checker verifies +all 152 selected paths. The existing complete v3 admission is reused unchanged: + +- Canonical selected map SHA256, compact sorted JSON without newline: + `9a10497158827e189fe505f65e1aa203cd8a28fe894c469408977071b055375f`. +- Active inventory SHA256: + `e3ac26c5c62b909aa1ef1384b8e0baffb5587e14c1794f02f0e68ae655d14195`. +- Bound review SHA256: + `b4e7fcaf0c33b9e220fc7626d04969a95b31767897e9779eee850a9cfd71d0f9`. + +Verify the actual complete selector, all 152 current hashes and admission bytes +against that dependency; do not infer coverage by unioning parents or narrowing +selection. No new pin, selector, qualifier, oracle, threshold or admission record +is created. Preserve original CV1/CV2 results/failures and CV3 preparation seals. +The 54-entry original preparation freeze is historical: current Cargo.toml adds +main's existing force-serde feature, while the other 53 entries remain exact. +All 16 oracle snapshot and 25 original review entries remain attributable to the +original source; the review list likewise has only the Cargo.toml variance on +integration. The old command file and copied binary describe their old subject. + +The only implementation delta against PR138 is the retained private CV1/CV2 and +CV3 example/test preparation. Source-check the new guarded ceilings and loads, +their original independent reviews, and absence of production imports. No selected +oracle import, nine-case campaign, ignored CV3 contract or scientific control runs. + +## Fresh clean-source execution + +After independent source/protocol review, commit the protocol/review and execute +only on a clean committed head. Record that exact head/tree, full committed file +digests, commands, environment, exit codes, actual exporter/test ELF identities +and retained raw outputs. Keep results in separate authored reports; freeze the +executed protocol/admission bytes. Source changes require diagnosis and fresh +review rather than receipt refresh or dirty execution. + +Use Rust/Cargo 1.92.0 and Python 3.12.14; task-owned external target +`/workspace/pr143-target`, jobs 2, incremental 0, dev/test debug 0 and unchanged +default optimization/debug assertions. Use normal pinned Cargo dependencies and +existing task environment caches without a cold-build or reproducibility claim. +Clear ambient PYTHONOPTIMIZE and disable Python bytecode writes. New external +evidence root `/workspace/pr143-qualification-1` owns a journal, environment, +command logs, unchanged qualifier output and real packet. Do not reuse an output +directory, delete a failed attempt or access the denied artifact/cloud task routes. + +1. Require clean source, full native admission, locked Cargo metadata, core-only + normal dependency graph and formatting. The rational dependencies remain + dev-only and the graph must retain their existing accepted identities. +2. Run unchanged `tools/qualify_aligned_strain.py` into a new `native` output: + 18 ordinary commands, 35 Rust contracts, five real native/rational/adversarial + specimens, normal/optimized gate 5+5 and oracle 10+10. Record actual counts; + none of these is the CV3 nine-case campaign. +3. Retain the actual exporter and verify its hash against that new receipt. + Build a new four-file real packet using that exporter/receipt, and execute + all 26 existing packet tests normally and under `-O`, requiring zero skips. +4. Run strict no-default all-target Clippy and the three existing private adapters: + `grid_cut_variational_reference_contract`, `grid_cut_coupled_reference_contract` + and `grid_static_mms_reference_contract`. Preserve the three explicit ignored + CV3 numerical contracts and all current assertions. Ordinary CI must still + execute its unchanged default, core-only, desktop and executable paths; the + lead owns the independently reviewed outer CI budget repair. +5. Verify unchanged clean head/source/admission, original preparation/oracle + hashes and actual output identities. Retain all raw output outside Git and + author a compact source-bound result manifest. Independent execution/result + review must distinguish this executed subject from later reporting commits. + +No new persistent harness is introduced. A task-local external driver may record +existing commands and fail closed on count, skip, exit, source or output mismatch. +Each command retains its output on failure; a later bounded retry requires a +diagnosed recoverable cause and a new output, never automatic repetition. The +unchanged qualifier's existing command limits apply; the outer local driver has +a 30-minute command limit and owned-child termination/reap on timeout. Scientific +resource caps, interpreter modes and scientific criteria remain unchanged/unrun. + +## Final integration checks + +Re-read actual main, PR142 and PR138 merge states and source identities. Compare +the entire actual selected closure and private preparation bytes with the tested +subject, then obtain final exact-head independent review and required hosted +checks. Any selected source, dependency or admission change requires a new +reviewed execution disposition. Publish exact ready head, dependencies, actual +outcomes and limits on PR143 for the lead. No merge before verified lead authority. +After normal merge verify commit/ancestry, retained branches and post-merge CI. + +This integrates preserved preparation. It does not establish the prospective +physical errors, uncertainty certificates, rank, norms, spectra or orders, generic +cut stability, moving geometry/GCL, mesh water, hardware/GPU/native-window, +performance, whole-application production or broader numerical acceptance. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/qualification.json b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/qualification.json new file mode 100644 index 00000000..2ae7d5be --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/qualification.json @@ -0,0 +1,186 @@ +{ + "schema": "rheon-pr143-ordinary-integration-result-v1", + "status": "preliminary-ordinary-qualification-passed-final-integration-pending", + "executed_head": "31c1958545a7f29bde4e8aa15c991ede4ade4643", + "executed_tree": "d5cfe181c0d55b8b8b9287bcb11a52b864a312f8", + "clean_executed_source": true, + "committed_source_files": 2029, + "committed_source_map_sha256": "aa2f26c9e2c8943a93c6863f72eebe5f61c9f9c1530d57a1c1d78493f0200152", + "dependency_pr142": "dbd49d3e41c482a753884abc8aaaff7d1b0d0653", + "dependency_pr138": "91c4f4bd8bb29e9862f6ee29cd8bdead79e0d57e", + "selected_source_count": 152, + "selected_source_map_sha256": "9a10497158827e189fe505f65e1aa203cd8a28fe894c469408977071b055375f", + "inventory_sha256": "e3ac26c5c62b909aa1ef1384b8e0baffb5587e14c1794f02f0e68ae655d14195", + "bound_review_sha256": "b4e7fcaf0c33b9e220fc7626d04969a95b31767897e9779eee850a9cfd71d0f9", + "environment": { + "CARGO_HOME": "/workspace/.rheon-tools/cargo", + "RUSTUP_HOME": "/workspace/.rheon-tools/rustup", + "RUSTUP_TOOLCHAIN": "1.92.0-x86_64-unknown-linux-gnu", + "CARGO_TARGET_DIR": "/workspace/pr143-target", + "CARGO_BUILD_JOBS": "2", + "CARGO_INCREMENTAL": "0", + "CARGO_PROFILE_DEV_DEBUG": "0", + "CARGO_PROFILE_TEST_DEBUG": "0", + "PYTHONDONTWRITEBYTECODE": "1" + }, + "python": "3.12.14 (main, Aug 25 2026, 14:00:49) [Clang 22.1.3 ]", + "external_evidence_root": "/workspace/pr143-qualification-1", + "journal_sha256": "0049f6c7a8093b083de6974e6e77110990d7c5aefc629558f568d07f67546d1c", + "native_receipt_sha256": "6ada052ec414fad2823c69946061b8c58103e1ec2b0e2c84f362b7f24c43f9b0", + "driver": { + "path": "/workspace/pr143-run-qualification.py", + "sha256": "3217f552ee1c9d6a2db39abd07f0c3427efb47739aa9b3285006f5752c2c6c12", + "log": "/workspace/pr143-qualification-driver-1.log", + "log_sha256": "1b45d3c7c88d33eada791361f16721126ed48a02fdfe8e7fefa1b1bdac0ec96d", + "pre_execution_review": "Signal cleanup race found and repaired before execution; no initial driver attempt occurred." + }, + "results": { + "driver_commands": 11, + "driver_commands_exit_zero": true, + "native_qualifier_commands": 18, + "native_rust_passed": 35, + "native_specimens": 5, + "gate_python_normal_passed": 5, + "gate_python_optimized_passed": 5, + "oracle_python_normal_passed": 10, + "oracle_python_optimized_passed": 10, + "packet_python_normal_passed": 26, + "packet_python_optimized_passed": 26, + "packet_skipped": 0, + "strict_no_default_all_target_clippy": "passed", + "private_contracts": [ + { + "target": "grid_cut_coupled_reference_contract", + "passed": 15, + "failed": 0, + "ignored": 0 + }, + { + "target": "grid_cut_variational_reference_contract", + "passed": 10, + "failed": 0, + "ignored": 0 + }, + { + "target": "grid_static_mms_reference_contract", + "passed": 13, + "failed": 0, + "ignored": 3 + } + ], + "scientific_campaign_executed": false, + "selected_cv3_numerical_contracts_executed": false + }, + "packet_sha256": { + "data.json": "90a1336fce739d2072e440777a776d47783c7ef2fccc74bffc354035ba80a2ff", + "native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "primary-qualification.json": "6ada052ec414fad2823c69946061b8c58103e1ec2b0e2c84f362b7f24c43f9b0", + "qualification.json": "dd439716863737514fad77adbad027d70f92802ff9867cc64eb1fcc8f5b48a9c" + }, + "executing_elfs": { + "/workspace/pr143-qualification-1/aligned_strain": { + "sha256": "ca6a6e62a6177b73b6445b4665b00727569f695228bd89b2706b61199ece4397", + "bytes": 1482248, + "retained": "/workspace/pr143-qualification-1/executing-elfs/0-aligned_strain" + }, + "/workspace/pr143-target/debug/deps/aligned_strain_contract-8b1d73643b8c4d13": { + "sha256": "a50699377e52c439ee222cd5ab3f4e353ebf3f6518552fa381c56cfc3c6af05f", + "bytes": 2147472, + "retained": "/workspace/pr143-qualification-1/executing-elfs/1-aligned_strain_contract-8b1d73643b8c4d13" + }, + "/workspace/pr143-target/debug/deps/grid_cut_coupled_reference_contract-61551b69e08101f3": { + "sha256": "7f91a10335f3b52ac1dc78cfc8b713e1c51b2396a236a153f48bcb5dd2fbd71e", + "bytes": 2775768, + "retained": "/workspace/pr143-qualification-1/executing-elfs/2-grid_cut_coupled_reference_contract-61551b69e08101f3" + }, + "/workspace/pr143-target/debug/deps/grid_cut_variational_reference_contract-bda665bccad4bb7c": { + "sha256": "f97ac600dfc6041327f9c350dba085b329b4d5b1243e5654e5fbb9cc61403862", + "bytes": 2801816, + "retained": "/workspace/pr143-qualification-1/executing-elfs/3-grid_cut_variational_reference_contract-bda665bccad4bb7c" + }, + "/workspace/pr143-target/debug/deps/grid_static_mms_reference_contract-566d53d766edbc43": { + "sha256": "0f26c8ebf98541372949dd296a40fa84c298c468e7433264c3af0502488898e7", + "bytes": 2663016, + "retained": "/workspace/pr143-qualification-1/executing-elfs/4-grid_static_mms_reference_contract-566d53d766edbc43" + }, + "/workspace/pr143-target/debug/deps/obstacle_flow_contract-d7d69af958e2eaf4": { + "sha256": "7a6c5fd6de741219c5a6e4d98257fb8675597abaa44bbc3286e31dbb7f487da4", + "bytes": 2696496, + "retained": "/workspace/pr143-qualification-1/executing-elfs/5-obstacle_flow_contract-d7d69af958e2eaf4" + }, + "/workspace/pr143-target/debug/deps/static_obstacle_contract-29c0888cbc55cc5f": { + "sha256": "117adc358df9b5636efc219a2f124c626633ed0e1a20f9e76acb81871c40369b", + "bytes": 2044176, + "retained": "/workspace/pr143-qualification-1/executing-elfs/6-static_obstacle_contract-29c0888cbc55cc5f" + }, + "/workspace/pr143-target/debug/examples/aligned_strain-c2ddba1c2ef90e45": { + "sha256": "651b7e29c40e6afca84e763aaac8b2d86358a952c32d0185f4696866d594b8b9", + "bytes": 1604704, + "retained": "/workspace/pr143-qualification-1/executing-elfs/7-aligned_strain-c2ddba1c2ef90e45" + } + }, + "retained_artifact_count": 53, + "retained_artifacts_sha256": { + "core-normal-dependency-tree.log": "81868e815dfe6f14ab7e4490e8ceb8e1c889865a9c6dd04a36ca1a076bb3f5fc", + "strict-core-all-target-clippy.log": "58b6cd4e082938aa888d944b4748d8b49e8a6609976010b7ae49d1808a61d680", + "native-qualifier.log": "a30714e799197418247b7007c3c99eca6a4cd9f93bf0e8d4f470bd7ed9fe8fcb", + "metadata.log": "84418f13340b5585b41be29a6f2e118f6d643dbf294e8ef29a554492b0cacaca", + "rustc-version.log": "8f97c91e920ce0d02680e3d01eb87afa0c77290dcd5d19eb901ae194d4700d90", + "aligned_strain": "ca6a6e62a6177b73b6445b4665b00727569f695228bd89b2706b61199ece4397", + "packet-tests-optimized.log": "484e65914682738ea8b82f818c02969f3ac36b33ee18462aae22194b608a0acd", + "private-reference-contracts.log": "5a3437e7872ec66ba1bc96d208efa571997680dfd38bfc36cb954d7fe9d5f6bb", + "packet-tests.log": "44154ea5b8e67fbd4c47e8687409e851de0a8af075cf478cc7ac7d4a50ce6454", + "build-real-packet.log": "6610cfaf4e4967e8795b1b1fadb5b7fa568fd9eba3d455d89470912b76a00de0", + "cargo-version.log": "eb24d517cda02ee331f0f23f3da8150456969a12bcd3f07b531c45a44f67d9aa", + "admission.log": "d7771f2f3cb0cbcdf27312f94b51e50e8110247e7eb45e2ee88d14b853b73be3", + "native/rust-clippy.log": "b00fe92e24293712deb324b6fbd768015373486301484282f5cf3cef7606bfd2", + "native/rust-build.log": "f0b2131f0618225a35e1af290813e8b524190abc8b619b2074c60d28cf23bfee", + "native/large-origin-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native/large-origin-nonmidpoint.tsv": "38405a03996ba2be5dc952b85b1d7e0b0e7df4d115e30b9bdfe14852e55c3628", + "native/native-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native/reflected-anisotropic-oracle-summary.json": "01817b248b5d93e7e7904dc7c75bde3f97914d907b0d1e0dfed951cfb98e43e5", + "native/oracle-tests.log": "70adcdc200e9f596e6a2e91c4059e202b5be5f8e23b7e1a6ca819574ba21a93d", + "native/large-origin-nonmidpoint-oracle-comparison.log": "9cd2dd863062aa97c56f292e3434e56a0be9ee11c3f5485d259775d52078880f", + "native/unit-center-cube-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native/unit-center-cube.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "native/qualification.json": "6ada052ec414fad2823c69946061b8c58103e1ec2b0e2c84f362b7f24c43f9b0", + "native/represented-nonmidpoint.tsv": "c7eed9042d4806d437a573ddae91817c692c8cbd77b32e2df296b0e0b38d96f2", + "native/native.tsv": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45", + "native/qualification-gate-tests.log": "72c88d7fbef769295b96afd9944622f92d5c71a6a9cb5767d115b5f86961a4a2", + "native/unit-center-cube-oracle-summary.json": "f7a5e0c78e0c8f41de6cee2a3a3158c840542070648776b6c0ab2f6d5870de77", + "native/format.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native/represented-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native/oracle-tests-optimized.log": "0cde6658e613a1e83c69dc70ef256dcf3ceee355d0ef3d773b7b32f68f3669dc", + "native/native-oracle-comparison.log": "75ea8a6ed6a9c30e0906210295d2e39a83096618117e9fd992b635ec776a5c12", + "native/reflected-anisotropic-oracle-comparison.log": "01817b248b5d93e7e7904dc7c75bde3f97914d907b0d1e0dfed951cfb98e43e5", + "native/native-oracle-summary.json": "75ea8a6ed6a9c30e0906210295d2e39a83096618117e9fd992b635ec776a5c12", + "native/represented-nonmidpoint-oracle-comparison.log": "9f8323de5402ef1bf32e7b59b55e32ca08dfdfd5860beb1f60ce7f3b15b1fea1", + "native/large-origin-nonmidpoint-oracle-summary.json": "9cd2dd863062aa97c56f292e3434e56a0be9ee11c3f5485d259775d52078880f", + "native/reflected-anisotropic.tsv": "04821a0128a562dc796b5ec369e552eff2b867d09c55a7d1333cdfb35048b4d3", + "native/unit-center-cube-oracle-comparison.log": "f7a5e0c78e0c8f41de6cee2a3a3158c840542070648776b6c0ab2f6d5870de77", + "native/reflected-anisotropic-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native/qualification-gate-tests-optimized.log": "ae9dc6137b4ceace82ead8af34ea04c7aae40dc0404ead18bcd92ad09ef71100", + "native/represented-nonmidpoint-oracle-summary.json": "9f8323de5402ef1bf32e7b59b55e32ca08dfdfd5860beb1f60ce7f3b15b1fea1", + "native/rust-contracts.log": "c56d114980be78ccf5c1a04f9c10677510d0472d9e70ba5af1df3e21ba1c2c25", + "executing-elfs/4-grid_static_mms_reference_contract-566d53d766edbc43": "0f26c8ebf98541372949dd296a40fa84c298c468e7433264c3af0502488898e7", + "executing-elfs/7-aligned_strain-c2ddba1c2ef90e45": "651b7e29c40e6afca84e763aaac8b2d86358a952c32d0185f4696866d594b8b9", + "executing-elfs/1-aligned_strain_contract-8b1d73643b8c4d13": "a50699377e52c439ee222cd5ab3f4e353ebf3f6518552fa381c56cfc3c6af05f", + "executing-elfs/2-grid_cut_coupled_reference_contract-61551b69e08101f3": "7f91a10335f3b52ac1dc78cfc8b713e1c51b2396a236a153f48bcb5dd2fbd71e", + "executing-elfs/5-obstacle_flow_contract-d7d69af958e2eaf4": "7a6c5fd6de741219c5a6e4d98257fb8675597abaa44bbc3286e31dbb7f487da4", + "executing-elfs/0-aligned_strain": "ca6a6e62a6177b73b6445b4665b00727569f695228bd89b2706b61199ece4397", + "executing-elfs/3-grid_cut_variational_reference_contract-bda665bccad4bb7c": "f97ac600dfc6041327f9c350dba085b329b4d5b1243e5654e5fbb9cc61403862", + "executing-elfs/6-static_obstacle_contract-29c0888cbc55cc5f": "117adc358df9b5636efc219a2f124c626633ed0e1a20f9e76acb81871c40369b", + "packet/data.json": "90a1336fce739d2072e440777a776d47783c7ef2fccc74bffc354035ba80a2ff", + "packet/qualification.json": "dd439716863737514fad77adbad027d70f92802ff9867cc64eb1fcc8f5b48a9c", + "packet/native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "packet/primary-qualification.json": "6ada052ec414fad2823c69946061b8c58103e1ec2b0e2c84f362b7f24c43f9b0" + }, + "transport_note": "Environment reported starting then ready after execution; former process session70038 was unavailable. Persisted journal, native receipt, logs and all53 artifact hashes plus8 retained ELFs confirm successful completion. No retry occurred.", + "remaining_gates": [ + "verified PR142 then PR138 merged-main identities and complete source revalidation", + "required exact-head hosted CI including shared lead-owned budget repair", + "independent execution/result and final exact-ready-head review", + "serial lead merge and post-merge checks" + ], + "claim": "Ordinary source/dependency/private-preparation integration only; no CV3 campaign, numerical/physical, hardware/native-window, performance or whole-application production acceptance." +} diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/qualification.md b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/qualification.md new file mode 100644 index 00000000..fb837f68 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/qualification.md @@ -0,0 +1,82 @@ +# PR143 preliminary ordinary qualification result + +The reviewed ordinary attempt passed on clean committed +`31c1958545a7f29bde4e8aa15c991ede4ade4643`, tree +`d5cfe181c0d55b8b8b9287bcb11a52b864a312f8`. This is the actual execution subject, +not a result for later reporting commits or unverified main. It retains frozen +PR142/dbd49d3 and reviewed preliminary PR138/91c4f4b. Verified PR142 then PR138 +main integration, final exact-head review and hosted checks remain pending. + +## Observed outcomes + +| Existing qualification path | Actual result | +| --- | --- | +| Complete native admission | All 152 paths match the unchanged PR138 v3 map/review | +| Locked metadata and core-only normal dependency graph | Pass; no Q2 rational development crate appears in the normal graph | +| Unchanged native qualifier | All 18 commands exit 0; 35 Rust contracts pass; five real native specimens independently compared with rational/adversarial oracles | +| Qualification gate and native-oracle Python tests | 5 normal + 5 optimized gate; 10 normal + 10 optimized oracle, all pass | +| Fresh real packet | Exact four-file roster; newly built exporter and actual new native receipt | +| Packet tests | 26 normal + 26 optimized pass, zero skips | +| Strict no-default all-target Clippy | Pass with warnings denied | +| Private coupled / variational / static preparation adapters | 15 + 10 + 13 pass; zero failures; three explicit CV3 numerical contracts remain ignored | + +The three ignored contracts are the original n16 ceiling, degree-four trace rule +and continuum-field numerical contracts. Their ignore reasons and assertions were +unchanged. No private example `main`, CV3 case, selected scientific oracle import, +rank/norm/spectrum, uncertainty certificate, refinement series or scientific +control was executed. The ordinary inherited unit contracts are separate from +the fixed scientific campaigns and do not relabel their prior failures/results. + +## Source, environment and custody + +The unchanged selector and admission remain exactly PR138's reviewed 152 inputs; +there is zero selected source, Cargo, qualifier or admission delta. Full execution +custody records all 2,029 committed-file hashes. Rust/Cargo 1.92.0, Python 3.12.14, +jobs 2, incremental 0, dev/test debug 0 and unchanged default optimization/debug +assertions were used. Python bytecode and ambient optimization were disabled. +This is not cold-build, deterministic-build or application-performance evidence. + +Fresh external root `/workspace/pr143-qualification-1` retains the unchanged +native receipt, real packet, logs, full source map and eight actual executing +ELF copies. The 53 recorded artifact hashes and all eight retained ELF hashes +were checked after completion with no mismatch. The compact +[result manifest](qualification.json) records exact source/tree, admission, +environment, command/count outcomes, raw/journal/driver hashes, packet roster and +actual ELF identities. No old binary/receipt was substituted. The historical +54/16/25 preparation/review seals remain unchanged; only current Cargo.toml has +the already-reviewed main feature addition relative to that historical freeze. + +Before execution, independent recorder review found a pending-signal window +between process creation and the protected wait. The task-local recorder was +repaired to terminate/reap the active group in its outer exception handler before +clearing ownership, then independently rechecked at SHA256 +`3217f552ee1c9d6a2db39abd07f0c3427efb47739aa9b3285006f5752c2c6c12`. +No driver execution occurred before that repair. The recorder is outside Git and +introduces no application or permanent verification framework. + +After the attempt, the environment briefly reported starting then ready. The +former process-session lookup returned `Unknown process id 70038`; this was a +transport lookup failure. Persisted journal and raw driver log both record the +successful clean-source terminal result, and native receipt/artifact/ELF checks +confirm it. The result was checked before any retry; no command was rerun. + +## Remaining integration gates and limits + +The original CI run39377493085 attempts 1 and 2 cancellations/aggregate failures +remain preserved. Attempt 2's annotation confirms its 30-minute desktop job +timeout. This ordinary local result does not erase those outcomes or replace +required current-head default/core/desktop/executable CI. The lead owns the +independently reviewed outer job-budget repair; per-case/scientific caps remain +unchanged. PR143 has not merged and has no merge authorization. + +Next verify actual PR142 then PR138 merged-main identity, recheck the complete +closure/private preparation bytes, obtain independent execution/result and final +exact-head review, satisfy hosted gates, and publish the exact ready head for the +serial lead. A selected-source or admission change requires a new reviewed +qualification disposition, rather than refreshing this receipt. Normal merge and +post-merge checks remain with the lead unless explicitly authorized otherwise. + +These passes support preserved preparation and ordinary integration. They do +not establish CV3 scientific results, physical accuracy, generic cut stability, +moving geometry/GCL, mesh-water, GPU/native-window, performance, full C1-family +replacement or whole-application production acceptance. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/review-preliminary.md b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/review-preliminary.md new file mode 100644 index 00000000..7987ab1d --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/review-preliminary.md @@ -0,0 +1,89 @@ +# Independent PR143 preparation integration review + +Reviewed subject: `286df732106717d056330b276d6f563e79a447b8`, the isolated +merge of original PR143 `c7f76ec45eeceff1d6e63eef16f868323556b418` with main +`15026a966265cf9eaedf464e2b5a066bd0fef3d8`. This is a preliminary source +review, not the final exact-head merge review. Required integration of PR142 +then PR138 and the resulting complete source/dependency admission remain pending. + +This independent reviewer read Core, Verification and Concurrent Plan +Integration guidance from Coding-Standards `0fc92a24279f3a4574c80af0a2f31ea347a21597` +and Rheon's source/output policy. No applicable AGENTS.md was supplied or found +by the task owner. The reviewed outcome is preservation of preparation source; +it does not authorize or accept the prospective nine-case scientific campaign. + +## Custody observations + +Standard-library-only hashing rechecks all 54 root freeze entries against the +original PR143 source: 54 match. On this integrated subject 53 match, with the +sole mismatch `Cargo.toml`: current main adds the existing `force-serde` feature. +The root freeze remains an exact historical source record and must not be +rewritten to relabel the composed source. All 16 oracle snapshot entries match +both original and integrated source. All 25 native/resource review entries +match original source; the same sole Cargo.toml variance occurs on integration. +All 14 prospective Python files parse with AST-only inspection; no selected +module was imported or executed. A first one-off hash command interpreted the +oracle's relative paths from repository root and stopped at missing analyze.py; +the corrected check used the oracle directory and verified all 16 entries. +That tooling-path correction produced no numerical execution or result. + +Original source/review/resource/command identities and binary custody remain +historical. A later integrated binary must have its own identity and cannot +inherit the old release binary receipt. No archive download was attempted. + +## Source findings + +No blocking source defect was identified within this preliminary inspection: + +- Relative to exact dependency `902f609`, existing private helper changes are + the n16/544 velocity/256 pressure ceilings and checked dense allocations. + Solver factorization/refinement arithmetic and its three correction steps + remain unchanged; the actual CV3 executable selects only that solver. +- The continuum velocity is divergence-free, pressure remains absolute and + nonconstant, and body force has the signs for `(rho/dt)u - div(sigma)`. + Boundary traction multiplies the outward normal measure. The separate load + owner uses three-point edge integration, and H1 assembly uses value plus + both derivative products. The fixed length/depth/time/rho values are one; + the independent formulas consistently specialize those fixed primitives. +- The candidate-free oracle derives exact represented-source geometry and + operators, separate continuum loads, original-coordinate inverse-defect + certificates, exact-moment L2 and enclosing Bernstein L1 bounds. Rank and + acceptance gates are explicit refusals or exact comparisons, rather than + tolerance rank, optimized-away asserts, or precision-agreement surrogates. + The 5% finest and 0.9 order criteria, 1% uncertainty budget and 1e-10 native + gates remain fixed. +- Resource drivers launch no selected work on import, require fixed source and + executable identities, own child process groups and reap children on stop, + retain partial outputs/refusals, and contain no automatic retry or backend + fallback. Source inspection does not establish runtime feasibility under + their existing caps. +- The three new numerical contracts remain explicitly ignored. No selected + case, numerical contract, spectrum, rank, norm, uncertainty certificate, + scientific control or scientific result was run by this review. + +## Ordinary CI timeout disposition + +The recorded attempt-2 desktop job for run `39377493085` was reported by the +task owner's decoded job-log inspection as starting 21:07:18Z and cancelled +21:37:33Z while ordinary contracts were running, after successful strict +Clippy. The checked workflow gives compilation, linting and tests one 30-minute +job budget. This timing is consistent with job timeout; it does not establish +an assertion failure or a scientific result. Its checkout was historical merge +`ea5aa6d8edcec956eebeb6956230aeadfdeb5eed`, not this integration subject. + +A bounded increase to 60 minutes for the feature-contract job is a proportionate +repair supported by the recorded timeout, if the ordinary commands, feature +matrix, strict warnings and aggregate success requirement remain unchanged. +Splitting lint and test budgets is also valid but introduces duplicate build +cost without a demonstrated need. Neither option should introduce `--ignored`, +skip contracts, weaken assertions, alter scientific caps, or rerun this stale +attempt. Fresh ordinary CI must bind the final composed head. + +## Disposition + +Preparation preservation is suitable to continue. Merge readiness remains +pending PR142 then PR138 integration, fresh complete source/dependency admission, +ordinary CI on the resulting source, final independent exact-head review and +the serial lead's verified authorization. These observations establish no +whole-application production, physical accuracy, moving geometry/GCL, generic +cut stability, hardware/GPU or native-window acceptance. diff --git a/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/source-protocol-review.md b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/source-protocol-review.md new file mode 100644 index 00000000..ea0db1d9 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/pr143-integration-20261021/source-protocol-review.md @@ -0,0 +1,105 @@ +# Independent source and ordinary qualification protocol review + +Review subject is exact clean committed composition +`3e43f6080e8e0e4b7d77ac7d8c81a10c6eb643e4`, plus the separately inspected +untracked `protocol.md` of 6,297 bytes and SHA256 +`81548cedc8c8f8c34850417ee48fb5bde428b34219ef307f0464be84ef1736d4`. +The protocol and this review must be committed before ordinary execution. +This review does not claim that the later commit was already executed. + +## Complete admission and dependency observations + +I read the actual selector in `aligned_strain_packet.py`, including all +`QUALIFICATION_INPUTS`, complete `src/` and `.cargo/` traversal and +`rust-toolchain*` selection. A separate standard-library-only check reconstructed +that exact selection from current paths and the literal qualification tuple. +The resulting 152 paths equal the active v3 inventory's exact key set; every +current SHA256 equals the admitted value. This verifies the complete current +selection, rather than a union of parent inventories or an assumed numerical +dependency subset. + +Canonical compact sorted JSON map SHA256 is +`9a10497158827e189fe505f65e1aa203cd8a28fe894c469408977071b055375f`; +active inventory SHA256 is +`e3ac26c5c62b909aa1ef1384b8e0baffb5587e14c1794f02f0e68ae655d14195`; +bound review SHA256 is +`b4e7fcaf0c33b9e220fc7626d04969a95b31767897e9779eee850a9cfd71d0f9`. +Both historical predecessor inventory hashes remain exact. I checked that +none of these 152 selected paths, the active inventory or bound review differs +from independently reviewed PR138 subject `91c4f4b`. In particular, Cargo and +production sources have zero delta. No new admission epoch, refreshed pins, +selector narrowing or changed qualifier is necessary for this composition. + +Git ancestry retains original PR143, frozen PR142 `dbd49d3` and reviewed +preliminary PR138 `91c4f4b`. This preliminary branch composition does not prove +that PR142 then PR138 have actually merged to main. Final integration must +verify those merge identities and compare the complete actual closure anew. + +## Retained preparation source and custody + +Against original PR143 `c7f76ec`, all 54 preparation hashes and all 16 oracle +snapshot hashes still match their recorded historical sources. Current +integration preserves 53 of 54 preparation payloads byte-for-byte; Cargo.toml +has main's existing force-serde feature addition. All 16 current oracle payloads +match. The 25-entry original source review likewise has only that Cargo.toml +variance on integration. The historical manifests, command file, copied binary +identity and original execution/failure records remain unchanged and cannot +describe a newly built binary or confer new execution authority. + +The preliminary review's private n16/544-velocity/256-pressure ceilings, checked +allocation guards, unchanged solver arithmetic, continuum load and independent +oracle observations remain applicable because their source bytes are unchanged. +The CV1 and CV2 entrypoints and private helpers are retained, including the +full physical/Cartesian trace bridge, original matrix/work checks, prior-state +export on correction refusal and fixed criteria. Their existing source reviews +are preserved. New preparation does not relabel their earlier results or +failures or establish generic conditioning/stability/PDE acceptance. + +The actual delta against PR138 is the private CV1/CV2/CV3 example/test source +and associated authored preparation records. No production source imports any +of the three private example modules. The test adapters include those real +example modules rather than substituted implementations. Ordinary Cargo test +selection executes their inherited focused unit contracts; their `main` +campaign entrypoints are not test entrypoints. The three new CV3 numerical +contracts retain explicit `#[ignore]` attributes. This review ran no Rust test, +native exporter, private executable, selected oracle import or scientific case. + +## Prospective ordinary execution disposition + +The inspected protocol is approved for its stated preliminary ordinary +qualification after a clean commit. It directly checks composition through the +unchanged native qualifier, real packet consumer and real private test adapters. +I inspected `tools/qualify_aligned_strain.py`: its 18 ordinary non-Lean commands +include the unchanged three Rust contract targets and aligned-strain example, +build/lint/format, five fresh native specimens each with independent rational +comparison, normal/optimized gate tests and normal/optimized oracle tests. +This is the existing aligned-strain integration qualifier, not CV1/CV2 or CV3's +sealed scientific campaigns. Existing command timeouts and scientific thresholds +are unchanged. + +A new packet must use the actual newly built exporter and new clean-source +qualification receipt. The packet tests must receive that real packet, so all +26 execute normally and under `-O` with zero skips. Counts and exit codes are +observations to record, not prospective passes. The additional three private +adapter targets must keep every current assertion and explicit CV3 ignore; +neither `--ignored` nor any campaign invocation is admitted. Strict no-default +all-target Clippy compiles the real preparation sources without evaluating +scientific results. Complete committed source, ELF/output, admission, command +and environment custody must bind the actual clean execution commit, which +will differ from this pre-protocol subject. + +The external evidence/target roots, fresh-output refusal, preserved failed +attempts, 30-minute outer command bound and owned termination/reap keep the +one-off driver within ordinary test scope. No permanent duplicate verifier is +introduced. A failure requires diagnosis; this approval does not authorize an +automatic retry, scientific fallback or new source receipt on dirty inputs. + +## Boundary and final gate + +There is no source/protocol blocker to the described clean committed ordinary +attempt. Actual results, independent execution/result review, final verified +PR142-then-PR138 main composition, exact ready-head review, required hosted +gates and serial lead authorization are still required before merge. This +review establishes neither a pass for unexecuted commands nor CV3 numerical, +physical, hardware/native-window, performance or whole-application production +acceptance. diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-protocol-spacing-followup.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-protocol-spacing-followup.json new file mode 100644 index 00000000..a4991569 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-protocol-spacing-followup.json @@ -0,0 +1,25 @@ +{ + "all135_selected_inputs_unchanged": true, + "approved_sha256": "9281169f3111421173df205c7a5a9b8188d66c6e1d6194282d9dc2663ae09465", + "committed_admission_head": "ba16197ed6820815db2ec29568265861d3c64052", + "committed_admission_tree": "acd72fdc4fc925b63ec04e333c703ece09d4d9da", + "decision": "APPROVED_EXACT_SINGLE_LINE_FORMATTING_FOLLOWUP", + "exact_delta": "Add space after first count comma and remove trailing space on the same prose line; no semantic/recipe change.", + "execution_performed": false, + "findings": [], + "original_full_review_json_sha256": "cf7d3accfa44c6a3f7b1edba3fae3e15c419cf105163d575578456cc1f1c706b", + "original_sha256": "110814b8796aacc3d3c0a979611c814ce49e73b98ca3629e21f05cb35cbf96a0", + "other_seven_approved_pins_unchanged": { + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "49f7d8e32e29886a22d91b8310e99b961a5e611a0b75f670c1f280e7da29f497", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "fce71cd78045159972f4bd4500bf4f67305ecc074db9a450ef3f3327d2421a09", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/dependency-review.json": "955f26fb049e3f676fccef5165210e7056e56e95e0ea03d7496293ac67cd2408", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr132-source-pins.json": "9e828e48dd678c0409b37fb6980b657c70ae373484d64bead442dcaf4cf24ffb", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr134-source-pins.json": "cf53e3a36be99bd292f0e03c6ef2872f50c632d92321e40ccb48582cff5d1119", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.json": "f75b30d119b71d526f59bd729753ec16c6c409d783d3796c495e5b4a6c06ab5e", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md": "c0ea7f43124b43e5eb37188ac683d4fe718faf28c6e81b95354079d9f9804c6f" + }, + "path": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/protocol.md", + "repository_mutation_performed": false, + "schema": "rheon-independent-protocol-spacing-followup-v1", + "selected_map_sha256": "c1baa8b487bdacaa746446a0e21540b9605232c39131b32148253909249cb8f1" +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-review.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-review.json new file mode 100644 index 00000000..481555ba --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-review.json @@ -0,0 +1,323 @@ +{ + "changed_selected_inputs": { + "Cargo.lock": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "Cargo.toml": "fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409" + }, + "counts": { + "added": 0, + "changed": 2, + "removed": 0, + "total": 135, + "unchanged": 133 + }, + "decision": "APPROVED_EXACT_PREPARED_BYTES_FOR_CLEAN_COMMIT_AND_FRESH_QUALIFICATION", + "dependency_archive_and_license_verification": [ + { + "actual_archive_sha256": "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367", + "actual_license_text_sha256": { + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2", + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" + }, + "defaults": [ + "std" + ], + "license": "MIT OR Apache-2.0", + "lock_sha256": "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367", + "no_root_build_rs_or_build_dependencies": true, + "official_archive_url": "https://static.crates.io/crates/num-bigint/num-bigint-0.4.8.crate", + "package": "num-bigint-0.4.8" + }, + { + "actual_archive_sha256": "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b", + "actual_license_text_sha256": { + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2", + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" + }, + "defaults": [ + "std" + ], + "license": "MIT OR Apache-2.0", + "lock_sha256": "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b", + "no_root_build_rs_or_build_dependencies": true, + "official_archive_url": "https://static.crates.io/crates/num-integer/num-integer-0.1.47.crate", + "package": "num-integer-0.1.47" + }, + { + "actual_archive_sha256": "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824", + "actual_license_text_sha256": { + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2", + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" + }, + "defaults": [ + "num-bigint", + "std" + ], + "license": "MIT OR Apache-2.0", + "lock_sha256": "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824", + "no_root_build_rs_or_build_dependencies": true, + "official_archive_url": "https://static.crates.io/crates/num-rational/num-rational-0.4.2.crate", + "package": "num-rational-0.4.2" + } + ], + "execution_performed": false, + "findings": [], + "local_link_checks": [ + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/recording-compressible-integration/reports/dependency-licenses.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/approved-pins.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/preflight-followup.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/domain-density/preflight-approved-pins.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/provisional-readiness.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/iteration-repair-34e2e73-review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/native-admission-20261020/review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/dependency-review.json" + }, + { + "exists": true, + "source": "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md", + "target": "../plans/fluid-accuracy-composition/reports/q2-admission-20261020/protocol.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/protocol.md", + "target": "source-review/readiness-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md", + "target": "dependency-review.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md", + "target": "readiness-review.json" + } + ], + "mutations": "Only outside-Git review artifacts; no source/admission/ref/PR edits or builds/tests/campaigns.", + "next_requirements": [ + "Commit exact approved inventory/review/protocol/copies, then verify clean exact source.", + "Fresh18-command native/rational qualifier, real packet26normal+26optimized zero skips, existing72 focused contracts and two private-reference test adapters.", + "No campaign rerun, source requalification transfer, default/desktop/Lean/physical claim or blocked public-merge retry." + ], + "prepared_path_sha256": { + "docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md": "49f7d8e32e29886a22d91b8310e99b961a5e611a0b75f670c1f280e7da29f497", + "docs/education/aligned-strain-native-sources-integration-20261014.json": "fce71cd78045159972f4bd4500bf4f67305ecc074db9a450ef3f3327d2421a09", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/protocol.md": "110814b8796aacc3d3c0a979611c814ce49e73b98ca3629e21f05cb35cbf96a0", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/dependency-review.json": "955f26fb049e3f676fccef5165210e7056e56e95e0ea03d7496293ac67cd2408", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr132-source-pins.json": "9e828e48dd678c0409b37fb6980b657c70ae373484d64bead442dcaf4cf24ffb", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr134-source-pins.json": "cf53e3a36be99bd292f0e03c6ef2872f50c632d92321e40ccb48582cff5d1119", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.json": "f75b30d119b71d526f59bd729753ec16c6c409d783d3796c495e5b4a6c06ab5e", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md": "c0ea7f43124b43e5eb37188ac683d4fe718faf28c6e81b95354079d9f9804c6f" + }, + "preserved_mechanism_sha256": { + "docs/education/aligned-strain-native-sources-runtime-20261013.json": "6ada2133501aab449ed7ee73f802d8a4593db50c857f0a8f8ce2af4507721d6d", + "docs/education/aligned-strain-native-sources.json": "84c036618b32de66623d8ded24ae8cf95194457e36b9a130087a9c2bf3bd3f6a", + "docs/education/aligned_strain_packet.py": "361ec0530ad64bbb0f698463a0553ab1c3b4964af3e9cbce547a327456cb8b3a", + "docs/education/check_native_admission.py": "fa315c21355a5eca90f0692f01b4d3a2c1c936cbd6a8e0f8e192d06beac847b2", + "docs/education/test_aligned_strain_packet.py": "d53b4a44943782288868bfd2bcab56ca2f24220990a62a749e63a9148550a5f9", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "previous_bound_review_prefix_unchanged": true, + "required_ancestry": { + "21d4122c3d0edb2ca5c3ce089175c70035d737a3": true, + "8bf542eddd8198008b6d77d52e009e9384998f18": true, + "e6525a116a07af486e4a682cc2b157241d6b9150": true, + "f75cd66c6dc4167ad1ec3febb72e6fb2aa6b4d0b": true, + "f84f65104d6a0f6f8f1a9b903412b1e5155f72a2": true + }, + "schema": "rheon-independent-q2-reference-admission-review-v1", + "scope": "Separate dependent Cargo-source admission only. Prior9c/fixed133 evidence is immutable historical qualification. PR132 fixed-corpus exact predicates and PR134 aligned coupled algebra remain limited private reference claims; general cut/free-surface spaces, extension, boundary lift, topology/DOF/B/M/S/W/PDE/physical promotion remain unaccepted.", + "selected_source_map_sha256": "c1baa8b487bdacaa746446a0e21540b9605232c39131b32148253909249cb8f1", + "selected_source_sha256": { + "Cargo.lock": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "Cargo.toml": "fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409", + "examples/aligned_strain.rs": "11910f4536bbb0057bd7462864f4d2af07d37dcd02103f41d1b93674dcca4547", + "rust-toolchain.toml": "09ff66fa19e0cb8bbad00b6032e28f1cf77b0a37a73013648177b35297f98800", + "src/advection.rs": "0163a872c314b2b3bb7f732348aafdbfa7b162dceea74807b7e7e3eb60ab0849", + "src/aligned_strain.rs": "1541bc444d1b098c5a59a221b7068538b013362db46ed66e37eb4931ad425e4f", + "src/bin/desktop/README.md": "46c12612d5527989d1472711967bf798a88113a7cc662c0185b9749ac572f83d", + "src/bin/desktop/accepted_session.rs": "7a42a42bbe8d044f703c2c52d488bf8a4e8e3b3fb1448851efcfb04599d5bf31", + "src/bin/desktop/ai_comparison/accepted_provider.rs": "922c98958bec45dbd4dee199e0bbdbdd6e3fe4ac52d7a70472ce8132461416fc", + "src/bin/desktop/ai_comparison/accepted_provider_contract_tests.rs": "643636776b009337fb80dfdf3d5dbee975e06ed7f7a7cf3f534c07301b61c729", + "src/bin/desktop/ai_comparison/accepted_provider_tests.rs": "11ae34ba76dc93a87f15c8ce9f745403b2d22d0194987d945cf2edc53c624237", + "src/bin/desktop/ai_comparison/accepted_recording_contract_tests.rs": "6cfddefe84a64c89f126598b817d22afe6d1b5731e1d533ea92cecbd1870c942", + "src/bin/desktop/ai_comparison/adapter.rs": "7038fb09ef2bd33a17495414c4c0986a6fb63ba949fe440e9d19927baca712b2", + "src/bin/desktop/ai_comparison/configured_track.rs": "c1dbb4053031065563762b1f538acb4959f30662bd98e646cf9e74ac94752117", + "src/bin/desktop/ai_comparison/configured_track_tests.rs": "a0dcc1c09d188ad14fc42e78535cd51bcb9bacae0522f4f95262340e4bd86b7c", + "src/bin/desktop/ai_comparison/cpu_contract_tests.rs": "6232225760a7646d2b6759f3df7bd2fee34bed00c6a3a1058e68a96fced4311e", + "src/bin/desktop/ai_comparison/diagnostic_runs.rs": "80559d9d69d8164c24b8dd45f71c51b972fc8af9349c9e56b3e36b14b827b41c", + "src/bin/desktop/ai_comparison/diagnostic_view.rs": "1e6b8011f945ba05ce04c8e4c7f88de23bd53fc99c776311fd30d3021a1c7fe2", + "src/bin/desktop/ai_comparison/diagnostic_worker.rs": "a75e78beff3c85dec528c54c15a29c6ce6db7c918279bda2af7b5af91104991b", + "src/bin/desktop/ai_comparison/diagnostic_worker_tests.rs": "fd39822957fed70fac97bf5025cdb57028817c414175320b901119dac4fa50a8", + "src/bin/desktop/ai_comparison/engine.rs": "610ba29f66eb91083f9bbd26b823b14e4bde4887eb057e929c089d6cd4592e55", + "src/bin/desktop/ai_comparison/engine_typed_tests.rs": "584b5fd3dc9307f6fbf758474cd3f02e6ffcefb00e90ca3f068b838c15c786ad", + "src/bin/desktop/ai_comparison/mod.rs": "83f8864382f0c0c8c454b54dc0e9c389654a325849c6802b7205a2b031040076", + "src/bin/desktop/ai_comparison/model_process.rs": "bbbe43744cad1791038e07895967f744b86bb77fa9642d0fc80e4b00bee2204d", + "src/bin/desktop/ai_comparison/prediction_contract_tests.rs": "088668d3b29f3650c2145f09199d7ff8cbf38e1de78b1c4d73c882e8fc1610b3", + "src/bin/desktop/ai_comparison/record.rs": "2464e347414d3c75e7568dda6a5fd102896c5f194cf3ba8b3bb34961566fce0d", + "src/bin/desktop/ai_comparison/scene.rs": "c8817ed933ff31c4e9cdd7c0eb2e4c35f50a6868568496e2c67444e11ad80321", + "src/bin/desktop/ai_comparison/view.rs": "568f7b852a21714405e37d55ba00a56b3f4b07e58037ed26f8a67cfd4fbd268d", + "src/bin/desktop/ai_comparison/worker.rs": "6fb6c5b49cf57a473f9911d89965e8812c5d9915ecc1d3b654ca2f7ecfa8cc6b", + "src/bin/desktop/archive_view.rs": "9f96f1d6b11b46e7fd523825e19a8fc0e0ec862669acd129f5e39e91f83c89ff", + "src/bin/desktop/build_identity.rs": "a94fea1f039a49f8d0eb79b019b3fbd0f2c9da1762ba854d10cba1e5fd87a25b", + "src/bin/desktop/camera.rs": "b6bcc84a45bd5979de357c965c84426c25e81161ee1f06022e57a93a46643f7d", + "src/bin/desktop/carrier_execution.rs": "0d96fb2acdfd63374e5f0004d9ead8b43d9fe2f6959c0d01f9c828458ae1799e", + "src/bin/desktop/collision_ui.rs": "78d7be8e49798e2420ebac5c3fb756e1b195e43ef113ae03ce1b2d3362009204", + "src/bin/desktop/comparison.rs": "6adcccf8e85204703de9fd0bcd952b69c9520acacce4657ef96a3dd49eece099", + "src/bin/desktop/comparison_archive.rs": "813cc86187ef7313deacbe9d9cd15340f37ecdf62f5234a45f033909415459b9", + "src/bin/desktop/comparison_field_view.rs": "ec8ea0799522d5a7fadac47b06b42f26717f935bbb9a1677fc5052f096c1cc82", + "src/bin/desktop/configured_comparison_tests.rs": "e6716e8c707f30cc20304b16e3201f8fb1fd838650bd08a43a95ab4d68cbbf46", + "src/bin/desktop/configured_controls.rs": "05d317554c4db033dd35c5e153dceaea34367eed33125ec8c7f59466f83ede36", + "src/bin/desktop/configured_producer_exit_tests.rs": "7560ff5395acbd50ce111b1e50ae5e8aca1b1bab5356ec195929eec0994f24bb", + "src/bin/desktop/configured_worker_tests.rs": "81e24d69cd5838de3becbc31453ce0a10947e7fe956287862957fcc06eae6e38", + "src/bin/desktop/emitter_controls.rs": "d5eaf6358b037d1f11177abbbd83bfa8aa18c263b195c3911b8f183b3334fba9", + "src/bin/desktop/engineering.rs": "9fc4eaafd1118abda50b70d1cc71c843fc1ca71d420d2cd47f16a20fcc9e8e9d", + "src/bin/desktop/export_ui.rs": "1702f437b17dd42d2bf1311ca14d0301a53712392abc6591ab8962b48cba511d", + "src/bin/desktop/history.rs": "e4be154bbbf40a36f370b68ec9e15fea663fb589d476a43eb298c0e8c0f0d821", + "src/bin/desktop/identity.rs": "df451a986476b9df252a9a4dbc1e33218bf5ab3cb268b83fa78b47dfffdae184", + "src/bin/desktop/inspector.rs": "4753401d42674f6fc3a4990dc9acf534ef3b9d1c425c605375f74072fe334068", + "src/bin/desktop/particle_view.rs": "75208acd210d4558a34127b98cf77f2c898a560f991f6bed3bee3a4eb160b9a2", + "src/bin/desktop/run_set_view.rs": "ab2c841612f39b16f5bd1a363593eae5388bf4a81ec495dfb89e43bd7436580b", + "src/bin/desktop/run_sets.rs": "e194a48350954edf13cdcd01371d320cc210069b4256ba955f2ddd1132301cc1", + "src/bin/desktop/run_sets/configured.rs": "45fa8cf6976da7f8ab3eff27fd69ba5511c98c4be541739eefcdf762826abac9", + "src/bin/desktop/run_sets/configured/archive.rs": "c790e634ff8f46fb4b3513530321bf34ad00f80ab717fa66a1afcb003485aef2", + "src/bin/desktop/run_sets/source.rs": "c948c24fbe3d0bbb4d281c427244f7908a16506236c0f24b194490c64033cd11", + "src/bin/desktop/settings.rs": "d66735427fc8b6be57d93812d30fb4b8c357419acd70b7b0564aa48216bb2660", + "src/bin/desktop/transport_view.rs": "e8c3d5cc588d4efac9918544fc5012696a05bdfa7adcba7ce18b07c5a260f6b8", + "src/bin/desktop/viewport.rs": "599046403df150499064337c2ce3b6996f1ece69f4e876f882200f079b7cd530", + "src/bin/desktop/workflow_inspector.rs": "4176efb859e9ed2e0041a6ca7b9f87c5590ed2aa7541a83fc225ce6e795ddd6f", + "src/bin/desktop/workflow_inspector_tests.rs": "577bc23f06a8cd794b16d42cd347a024d627443f3d1cf5d4a6230b21c76a24e2", + "src/bin/rheon-ai-compare.rs": "00000ec93161c04d9ff0515e5ae2ab6855a5467f56f23a4d6fc6c1059ef8ada9", + "src/bin/rheon-desktop.rs": "cd57bc2c39b6c16b9b92768be2614ec40ce02adbafc5d4992664af2ba291d66c", + "src/bin/rheon.rs": "5116a121256c8bb57d086caedbda8151f3593cb99d3e84b1d04fea25b12dfb51", + "src/box_flux.rs": "554b3cdc916e7527bbfdbd6a54b8cf7e27549c3c661015b259c8b2d18784bbb0", + "src/box_flux_step.rs": "e2ef3afcd8adffe0f79c0030eb56e5bb55943775e474a1dab2a7fe78ac38441b", + "src/collision.rs": "101c91ced5efc250f3a12bc47d5bbf04b812096caf8580c0229362e959839115", + "src/column_mac.rs": "40b86c5bab2d458c8b31b1f8def21c5f715acecb37813fb57417f7fe363aca84", + "src/column_momentum.rs": "373f63ac001fe8e9f8017a912033b3cc431169c6e4c86c2e6b514ee945f1f9b0", + "src/column_shear.rs": "bd2a20a11f927c2a886b524a4a45791100f9c3e8119b7648153b7775cb6a3299", + "src/column_surface.rs": "cd58d4d7d1c3d94092374ebd65fd191e3cf58f7ae68caeaf30ca15d36df666e0", + "src/compressible.rs": "dc0f2a3a8ebcb108c6a094ec59a467f1390b846dd27c505b16248a64dc1031b3", + "src/coupled_discrete.rs": "b296021b8dd2f763b6eeab1e49e78bf06ec2ec801ac9595441e9e3920235d8e7", + "src/dense3d_sequence.rs": "90e9249fd82cc829a84cea9162d680971e660bfc6c32619355b353d17b25a431", + "src/emitter.rs": "57ea2badaeb329fe91647df98be60bff8dbe693e41076979eda4b79ad8f48f84", + "src/emitter_controls.rs": "47d0b180dafc7e57ad1b205f2a12c5a472a78c1d60a7c3f7521ec470211a89c4", + "src/export.rs": "afe2b79d11f1b8c0ccd16dcaae51a22c8d35ba2e7a23c362729fe907b208f0d3", + "src/fitted_height.rs": "0181db7ffbad932b7e3492ce1a8e260736389e4ded3472c81fe2697861f6777a", + "src/fixed_bottom_ale.rs": "3cc724d376d115fccd8b6c658d7f26b6436f4d13d105a5ae8416fd9c04b17a47", + "src/forces.rs": "c5585940330096890016ff68f25645aa12cdaec2b796a8b234c138e88dd892bb", + "src/free_surface.rs": "f43fd9a71da6aac985dfcfb6cc471318227c1727d6e0dad8e2a5feb5b3728a8e", + "src/geometry.rs": "712d04f27d55d7e77f17effefbf2660ca3b8a000de5b7aa51b42b89fe5d3b634", + "src/lib.rs": "c208229fd3f1d15a1597a2f85ec95c51a305b92232a1bfdd18a30d57e45f5510", + "src/liquid_step.rs": "b707f32f0a5c1102ebbde0776316fc5e7daddb23247c2a07e2d2f69355325baa", + "src/liquid_volume.rs": "7f98c25b5e0990a0a9097aa1d3d656f4441123271e5ee1801ee2055de9eed650", + "src/material.rs": "49874ff972f16a972d706236b34e62f83e994c57e39b642c6d94a1a6f4b7fb66", + "src/material_session.rs": "4e18e446ad82f10523f72bae1b7cc6007f2ecf5ad05407bb666be3e2ae9be960", + "src/mesh_collision.rs": "71503d2c5939dbb59946bc157eedafecdedd0831f1e81d29e794fba7290dfd24", + "src/mesh_import.rs": "3e8f2d79e59b3f27c7ffeeacc83d9b7d08faafa2fffa7de81dfd8665b36a6890", + "src/motion.rs": "8ab9f26199f36d76cb2f5e4cb58d40905205f0d6fc90988549f7e389c489a3ea", + "src/native_family.rs": "070721db5250b429bf6f1147b71de1b84fd010eceb17d0814f9b9d299c9a09e5", + "src/native_family/tests.rs": "6904cbfa816d754410f18fe4281d29729e492ac47e2905474afa30cb97edb7d5", + "src/observation.rs": "2c6d4cd75cdb0f2d560d0f79df4e53914e10f340de0740b939311d8cc35d5dee", + "src/obstacle_pressure.rs": "b45262632483ce08773924b407eeffbe99bd62663094ce6fd71b24d132026b07", + "src/obstacle_shear.rs": "745da07d5e949276a2e0cb7ac4bdde4aedf557bf6189d5a51581d8ce79b1dc1f", + "src/operator.rs": "cd98684d5204908e5344b2628a8f93ea2a55a90c6678e03a71f2d75ab1f2be38", + "src/parallel.rs": "ee5420673a59ae4fb247b3542878e74902f7a87056744d4303fb400be074677e", + "src/particle_fluid.rs": "ed4ab916e602a55b2245beba5bdbff268fcb704b67fa41248d47ad2598f2468f", + "src/pressure.rs": "39ddb79dd3de196e83545679e556c0cd8ce9afae9db9282161f54b8f22f713a5", + "src/pressure_session.rs": "ae687a8822dd6cfeadf5dc6e13e7983d8d1afcdf9e5db1857d4dce64cd0e3fb8", + "src/provider_step.rs": "20cb23abcb30802dbebd6a32f599d20986982bf7aaa9e69e5287e4e448bac54b", + "src/recording.rs": "08a85d909ef6c566335675fddadbfdc245c42b4c894edf72aa41198036b0cd5f", + "src/recording/carrier.rs": "b9c83015df214b426315f1840cbd2029d3f4b85525aef2fc8592e97468d54509", + "src/recording/comparison.rs": "5a82201f4583cf9eb4cc38d43c7ee88bc54d10a84df46272c2dd84091aa4a307", + "src/recording/diagnostic.rs": "279aff886f1354af203429a2e43cce73cdb485ee5ddd90201d1498e5e7872b7f", + "src/recording/material.rs": "e01a730b04fd34d7fdc797ede735cb45fa743101dd51e8fd406b02bacdd43d00", + "src/recording/provider.rs": "ca4abfb98c364cda5d3d830930ebe6773020e0d35aae756a33c718662e239b3d", + "src/recording/provider/comparison.rs": "90c1230c2cbfb2415c74e5d3c9b66e74f68c7b2096bf4063c5513ac2c6feaa75", + "src/recording/provider/runtime.rs": "2cff480b60cdae14107541ce07d72afe2e1627684b82d427211df1bff023d381", + "src/recording/workflow.rs": "caa2f224796f8ad6e92fb78d547c70df7dd88fe666843a715e90bd9257a36d34", + "src/sampling.rs": "6bf158f71f795078b5a88a5662ec2169693508e555f0f98d539657873aaabbcf", + "src/scheduling.rs": "21fa031c06eeff8c2f722beb5553af9ba86d0afab479f4036916480338dc1411", + "src/session.rs": "367c370e2257e35de09943e8dc3e1257b994c5e01d1409af1a989682f41c583e", + "src/session/configured.rs": "b5c8978e20cf6d1ed2b183a2cb506dc7a15041049b1dfb91935cac954f8070a2", + "src/sgs.rs": "0b4140af63144df8ff1839782b3c70295c18b96decc67aba348a37a33e9f996d", + "src/simulation.rs": "00740d13df6f3ab88e362504bf63b833d693e51c05c95b189c677d2460520a18", + "src/solver_provider.rs": "204682fc6540cb812d7d9200dd61085e5dcb827a6c77981e081046ef353c0838", + "src/solver_provider/composition.rs": "f8cceb5a953e45627c2297b9393e557519b3099c4533b5aa1045b0dd0c6a96ef", + "src/solver_provider/composition/projection.rs": "e9a717ffc318c2345a4863369ff426c1f6d86f6ae4c3a5d312f2bfc459d33e4d", + "src/solver_provider/composition/projection_tests.rs": "1136781800cb14e301521fe4093fe042f59d17b7e149136dc24ba73bf4500a3e", + "src/solver_provider/composition_tests.rs": "363b5f5192225d7187cf64bd458f9691e3f041ef8ed1282babc5c5c2a9eb2adb", + "src/solver_provider/configured.rs": "e75eff2c8c0147b00a07e10e4a2b686b0fcf6a46248dbbcb346c5d485ce93392", + "src/solver_provider/context.rs": "763debfefc6f9375849c8f503995e20660fc25efef9e827d5942d980e14fe693", + "src/solver_provider/modal.rs": "c597450ad73a4dede64a1fedcc65a0b4d5551f594f29b2d0cf7c85b0e2e14796", + "src/static_obstacle.rs": "df50f3761fd7258ca42026ba852d2c326a1a5efa42daa4021967b799493b1080", + "src/tracer_barrier.rs": "1007f35400b5e1b3206653b9f9ccaafbc169617ad896aec54f94fc792eba2fae", + "src/translated_viscous.rs": "6fa240053738411bb93b3e365def39fdc8a93597cd0c0523dcd1af39cbc68163", + "src/viscosity.rs": "3cb7643d321fa94957fafdc101abf0ee9ef273f99c9a512938124e72f32178aa", + "src/vtk_export.rs": "56c3f03d957df0a7fd0c00a1af229f47f1c21cdf53cbf3770656a9bb0b66735e", + "src/workflow.rs": "5d902d075f784c9c062d1d5372873b76844d1f8afb06218bff5c619c9d006eb9", + "src/workflow/tests.rs": "5c42f4ed32454e3de1c9638bdab24a9e8309c73b9eea3095b434a16570c00eb5", + "tests/aligned_strain_contract.rs": "d2270f86bd04c36501b59f01772656bda264d2c70b8613429701a268a305da16", + "tests/obstacle_flow_contract.rs": "7e5318ca45b6932818accfc748cc70ae6cf1719f6047c2d2f9343eb8cedcd020", + "tests/static_obstacle_contract.rs": "fcc7546886b865ada1641dd7ee3549534f2273d908c19047d886c49a048157de", + "tools/aligned_strain_oracle.py": "902fbbf5fc94b93cfc490a9646eaa4e2233262e704121ea49f4fe6a5ab9744a5", + "tools/qualify_aligned_strain.py": "5b907d7d65f688b41b5c56a2c2f3f2f4cc4a4b7958a4bb3af1a7df5ac448e5ba", + "tools/test_aligned_strain_oracle.py": "4dff74ceef758cc492d6a67f0ef0598a4221b87183f6fb033db591611aca3a3f", + "tools/test_qualify_aligned_strain.py": "48e0f89d4a12e4d2b8a4a374b36a8bdcf8b2d0250ab449df93ca188d410673db" + }, + "source_review_copies_byte_exact": true, + "subject": { + "git_status": " M docs/education/NATIVE_ADMISSION_INTEGRATION_REVIEW.md\n M docs/education/aligned-strain-native-sources-integration-20261014.json\n?? docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/\n", + "metadata_uncommitted": true, + "source_checkpoint": "cd21a9952dc411e01b77f58e3aae67aff1e473fd", + "source_tree": "0447da683eecce1330adb563f1ca6e5dabfc0a62" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-review.md b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-review.md new file mode 100644 index 00000000..7c796bd1 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-review.md @@ -0,0 +1,29 @@ +# Independent dependent-Q2 source-admission review — 2026-10-20 + +Approved the exact eight prepared metadata/protocol/source-review paths for a clean commit and fresh qualification. No material finding remains in this admission scope. This neither approves a public merge nor qualifies the scientific reference or a production PDE solver. + +The source checkpoint is `cd21a9952dc411e01b77f58e3aae67aff1e473fd`, tree `0447da683eecce1330adb563f1ca6e5dabfc0a62`. Prepared admission documents are intentionally uncommitted at this review. The complete unchanged selector yields135 regular nonsymlink inputs: **0 added,2 changed,133 unchanged,0 removed** relative to the fixed reviewed stage. All135 SHA256 identities match both committed checkpoint blobs and current files. Canonical sorted compact map SHA256 is `c1baa8b487bdacaa746446a0e21540b9605232c39131b32148253909249cb8f1`. + +Only Cargo.toml and Cargo.lock change in the selected map. The new manifest adds exactly two pinned dev requirements, num-rational0.4.2 and num-traits0.2.19; removing that new table restores the previous parsed root manifest. The latter identity was already locked. The lock adds only num-bigint0.4.8, num-integer0.1.47 and num-rational0.4.2; no prior registry package record, checksum or edge changes, and no identity is removed. The sole prior package-record change is the root's two dev edges. There is no new project-root build.rs, build-dependency, production Rust/formula/domain or selector change. This is bounded CPU reference dependency admission, not a security/performance/WASM assurance. + +I independently hashed the three retained official-download crate archives against their exact lock checksums and reviewed manifests, without executing package code or extracting files into the workspace. Each archive includes the declared MIT OR Apache-2.0 license and actual license texts matching the source-review hashes. New package manifests contain no root build.rs or build-dependencies; std/BigInt defaults agree with the declared dependency graph. Archive/license/default identities are recorded in review.json. Hash integrity is not authenticity or reproducibility. + +The composed checkpoint retains exact PR132 `e6525a116a07af486e4a682cc2b157241d6b9150`, PR134 `f84f65104d6a0f6f8f1a9b903412b1e5155f72a2` and fixed PR133 ancestry. All28 copied component source pins match current files and original component-head blobs. All five source-review files equal their original external review receipts byte-for-byte. The private reference examples/tests are outside the unchanged selector's explicit aligned qualification inputs; they remain actual committed source requiring separate focused execution, not missing Rust-library modules to omit silently. Composing owner deltas preserves all unrelated G1/C1 inputs. + +The old bound review, SHA256 `9e583b31ed051f388c636879c90ecb84e4e31b177de42dc39ca7b8acebaa796c`, is an exact retained prefix. The established explicit v3 refresh remains sufficient: schema/base/predecessor identities, immutable primary ancestry/tree, v1/v2 bytes and selector/checker/qualifier/oracle/packet refusal source remain unchanged. Inventory differences are limited to scope, source map and appended review digest. All local links in the prepared scope resolve and Markdown fences are balanced. + +Approved prepared inventory SHA256: +`fce71cd78045159972f4bd4500bf4f67305ecc074db9a450ef3f3327d2421a09`. + +Approved appended admission review SHA256: +`49f7d8e32e29886a22d91b8310e99b961a5e611a0b75f670c1f280e7da29f497`. + +The protocol correctly preserves fixed PR133/9c04278 and requires a new clean committed subject, fresh external target/output, unchanged18-command native/rational qualification, a newly generated real packet with26 normal and26 optimized tests without skips, and separate existing composed plus two private-reference test targets. Old scientific campaigns are not rerun or relabelled. Prior qualification does not transfer across changed Cargo inputs. Commit the exact approved inventory and bound review together, then freeze them throughout qualification; report outcomes separately. + +PR132's fixed-corpus exact represented-source positivity and PR134's eight tiny aligned coupled-algebra cases are retained as separately reviewed private-reference claims. They do not select general cut/free-surface velocity spaces, extension, physical traction/boundary lift or production topology/DOF/B/M/S/W/PDE acceptance. Original failed fields and finite-error budgets remain historical. Further numerical method selection stays with its owner. New default/desktop, GUI, performance, Lean, learned or physical acceptance requires separate evidence. + +Public merge authority remains separately blocked for the rejected PR121 action; no retry or alternate path is authorized by this review. Reviewer wrote only outside-Git receipts and performed source/hash/archive inspections: no builds, tests, simulations, campaigns, dependency code, refs, PRs or repository edits. + +## Post-commit protocol formatting follow-up + +Admission commit `ba16197ed6820815db2ec29568265861d3c64052` retains the approved eight initial paths. Before qualification, the owner corrected one prose line in protocol.md: comma spacing and trailing whitespace only. The exact replacement was independently verified; new protocol SHA256 is `9281169f3111421173df205c7a5a9b8188d66c6e1d6194282d9dc2663ae09465`, superseding its original `110814b8796aacc3d3c0a979611c814ce49e73b98ca3629e21f05cb35cbf96a0` for the follow-up. All135 source inputs and the other seven approved file identities remain unchanged. The original eight-pin JSON remains immutable; protocol-spacing-followup.json records this bounded new approval. Commit normally before freezing the clean qualification subject; no history rewrite or earlier receipt relabeling. diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/protocol.md b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/protocol.md new file mode 100644 index 00000000..df7e4f45 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/protocol.md @@ -0,0 +1,75 @@ +# Dependent Q2 reference admission and qualification protocol + +Freeze a separate dependent checkpoint after fixed PR133; do not alter PR133's +source, admission, receipt or reported execution at `9c04278`. Branch +`integration/q2-reference-admission-20261020`, source checkpoint +`cd21a9952dc411e01b77f58e3aae67aff1e473fd`, tree +`0447da683eecce1330adb563f1ca6e5dabfc0a62`, composes PR132/e6525a1 and +PR134/f84f651 while retaining all previous G1/C1/Q1 owners and evidence. The lead +owns only admission/review and result/status documentation. No numerical method +implementation, new source campaign, model training, user-data change or merge +is performed by this protocol. Standards pin `0fc92a2` remains applicable. + +## Complete source boundary + +The unchanged selector contains 135 regular inputs: 0 added, 2 changed, 133 unchanged, +0 removed versus the reviewed fixed stage. Only Cargo.toml and Cargo.lock change; +all 133 Rust/toolchain/qualification identities remain exact. Complete canonical +sorted compact map SHA256 is +`c1baa8b487bdacaa746446a0e21540b9605232c39131b32148253909249cb8f1`. +The [source and dependency review](source-review/readiness-review.md) retains +exact component/tested heads, proposed-input pins, official crate checksums and +actual license texts' hashes. That bounded review alone was not composed-source +admission. Require independent verification of this complete composed source and +prepared append-only metadata before committing the refreshed v3 map. + +PR132 adds dev-only num-rational 0.4.2 and num-traits 0.2.19 requirements. The latter +is already locked. New lock identities are num-bigint 0.4.8, num-integer 0.1.47 and +num-rational 0.4.2; previous identities/checksums are unchanged. Three official +crate archives match the lock and include MIT OR Apache-2.0 texts; no new root +build.rs or build-dependency is introduced. PR134 adds private example/test/report +files but changes no additional selected native input. Owner patches must be +composed by ancestry, not by replacing the complete branch snapshot: their branch +lacks unrelated G1/C1 files that remain in the existing stage. + +## Fixed execution recipe and limits + +After explicit independent approval, commit the inventory and appended bound +review together with this protocol. Preserve the v3 schema/base, immutable primary +tree, all previous review text and v1/v2 bytes/digests. No automatic pin refresh, +selector weakening, old receipt transfer or allow-dirty qualification. Retain any +failed run into its own fresh external output before correction. Outcomes go in +a separate result report, never appended to the bound review after qualification. + +Use pinned Rust/Cargo 1.92, fresh external target +`/workspace/rheon-q2-reference-admission-20261020-build`, jobs 2, incremental 0, +dev/test debug information 0, default opt-level 0/debug assertions, bytecode writes +disabled and ambient PYTHONOPTIMIZE cleared for normal Python. Record the actual +interpreter/environment. Execute unchanged native admission checker and +`tools/qualify_aligned_strain.py` into a new external output with no optional Lean +or dirty override. Require all 18 commands, five actual native/rational/adversarial +specimens, normal/optimized guard and oracle tests, clean source/binary identity. + +Construct a new real packet from that new receipt/executable. Run all 26 packet +tests normally and all 26 under `-O` with RHEON_ALIGNED_PACKET pointing to that actual +packet, requiring zero skips. Retain its exact four-file roster and all hashes. +Separately run existing no-default workflow, native-family, composition, +represented-volume and borrow-doctest contracts, plus the focused +`grid_geometry_reference_contract` and `grid_coupled_reference_contract` test +adapters. These are existing fixed tests, not a rerun of scientific campaigns. +Previous owner debug/release/field/oracle evidence keeps its original source. + +Aligned native/rational export qualification does not establish Q2 topology or PDE +accuracy. PR132 reports fixed-corpus exact positivity with zero mismatches on 76,384 faces +and 152,780 regions; PR134 reports eight tiny aligned coupled-algebra cases. Their +original source/manifest/independent field reviews remain attributed. General +cut/free-surface active spaces, velocity extension, traction/boundary lift, +small-cell conditioning and coupled MMS/hydrostatic/physical gates are unresolved +method-selection work with the numerical owner. No full Stokes/production-water, +new native-window/performance, learned/GPU or physical acceptance follows. + +Public merge authorization is a separate execution blocker: PR121's single retry +was rejected because automatic approval still applies the original trusted +no-merge delegation and treats the later confirmation as tool-relayed. Do not +retry that action or use another path. This protocol continues only the separate +authorized source-admission/qualification work; hosted gates remain independent. diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.json new file mode 100644 index 00000000..506a0793 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.json @@ -0,0 +1,135 @@ +{ + "schema": "rheon-dependent-q2-qualification-independent-audit-v1", + "status": "APPROVED_EXACT_EXECUTED_RECEIPTS_AND_BOUNDED_COUNTS", + "reviewed_at_utc": "2026-10-20T03:54:47.528219+00:00", + "executed_source_head": "9a9904f3c6f0f96cbe2af9210a0c578f825ccee0", + "executed_source_tree": "488ab45ed7151d20d17adba519d587550b1e983e", + "source_receipt_hashes_verified": 1472, + "selected_closure_count": 135, + "selected_map_sha256": "c1baa8b487bdacaa746446a0e21540b9605232c39131b32148253909249cb8f1", + "selected_delta_from_9c": { + "Cargo.lock": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "Cargo.toml": "fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409" + }, + "admission_inventory_sha256": "fce71cd78045159972f4bd4500bf4f67305ecc074db9a450ef3f3327d2421a09", + "bound_review_sha256": "49f7d8e32e29886a22d91b8310e99b961a5e611a0b75f670c1f280e7da29f497", + "summary_sha256": "7faa36f7bf03cb5234ea9c3eee3207313bf8b20f0367be7f3113ec50062fee21", + "native_receipt_sha256": "b647e5c61f319044067ac10d128bf04e2461677103f1d8f953b7230c02c11739", + "native_commands": 18, + "native_all_exits_zero": true, + "native_rust_tests": 35, + "native_rational_specimens": 5, + "focused_contract_total": 83, + "packet_tests_each_mode": 26, + "all_logged_skips_ignores_failures": 0, + "verified_log_counts": { + "native-qualified-v1/rust-contracts.log": { + "passed": 35, + "failed": 0, + "ignored": 0 + }, + "focused-workflow.log": { + "passed": 23, + "failed": 0, + "ignored": 0 + }, + "focused-native-family.log": { + "passed": 9, + "failed": 0, + "ignored": 0 + }, + "focused-composition.log": { + "passed": 14, + "failed": 0, + "ignored": 0 + }, + "focused-volume.log": { + "passed": 23, + "failed": 0, + "ignored": 0 + }, + "borrow-doctests.log": { + "passed": 3, + "failed": 0, + "ignored": 0 + }, + "focused-private-references.log": { + "passed": 11, + "failed": 0, + "ignored": 0 + }, + "packet-tests-normal.log": { + "passed": 26, + "failed": 0, + "skipped": 0 + }, + "packet-tests-optimized.log": { + "passed": 26, + "failed": 0, + "skipped": 0 + }, + "native-qualified-v1/qualification-gate-tests.log": { + "passed": 5, + "failed": 0, + "skipped": 0 + }, + "native-qualified-v1/qualification-gate-tests-optimized.log": { + "passed": 5, + "failed": 0, + "skipped": 0 + }, + "native-qualified-v1/oracle-tests.log": { + "passed": 10, + "failed": 0, + "skipped": 0 + }, + "native-qualified-v1/oracle-tests-optimized.log": { + "passed": 10, + "failed": 0, + "skipped": 0 + } + }, + "verified_evidence_file_count": 60, + "verified_native_artifact_count": 28, + "actual_retained_ELF_sha256": "e12fe3ecd5f5f96cd30e30cba9e1f5e25fd9c263033314554cebe44cf97e94d8", + "archive": { + "path": "/workspace/rheon-q2-reference-stage-9a9904f.zip", + "bytes": 913699, + "sha256": "fa0db9c9e6f98a8c2d98b89967053537c8a2e74237c34276c84614b76bbff16c", + "library": { + "library_file_id": "libfile_3ee285ef166c8191b648475efb676b1c", + "file_id": "file_00000000657881fdad2fb080f534d06d", + "path": "/rheon-q2-reference-stage-9a9904f.zip" + }, + "entries_byte_verified": 60, + "crc_ok": true + }, + "current_checkout_observation": { + "head": "9a9904f3c6f0f96cbe2af9210a0c578f825ccee0", + "tree": "488ab45ed7151d20d17adba519d587550b1e983e", + "same_tree_as_execution": true, + "clean": true + }, + "findings": [], + "scope_limits": [ + "Exact executed subject remains 9a9904f; later ancestry-only heads do not become newly executed subjects.", + "Finite aligned-strain algebra/native/rational/real-packet and focused no-default contracts only; not behavioral coverage of all 135 modules.", + "83 focused: 23 workflow (7 core plus 16 recording); 9 native-family; 14 composition (11 projection plus 3 facade); 23 volume (18 box plus 5 periodic); 3 compile-fail borrow doctests; 11 private-reference (2 coupled plus 9 geometry).", + "No duplicate builds, tests, campaigns or source/ref/PR mutations performed by this reviewer.", + "No fresh Lean, default/desktop, hosted Pages/browser, native-window, performance, learned-model or physical qualification.", + "New private exact-geometry and coupled scientific campaigns remain at component subjects; this run only executes their focused contract adapters, not scientific field campaigns. Further cut/free-surface/PDE/physical claims remain excluded; original negative P1/Q1 results retain their subjects.", + "Source/artifact digest integrity is not authenticity or bit reproducibility." + ], + "evidence_root": "/workspace/rheon-q2-reference-admission-20261020-evidence", + "execution_metadata_verified": [ + "execution-context.json", + "focused-execution.json", + "packet-execution.json" + ], + "private_geometry_long_regression": { + "completed_normally": true, + "geometry_suite_elapsed_seconds": 186.08, + "over60seconds_notice_retained": true + }, + "archive_library_custody": "Library identity is reported in the owner summary. Local ZIP bytes/hash/CRC/members are independently verified; no independent remote Library download was performed." +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.md b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.md new file mode 100644 index 00000000..b88ef083 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.md @@ -0,0 +1,20 @@ +# Independent dependent-Q2 qualification audit + +**Approved exact executed receipts and bounded counts; no findings.** Subject `9a9904f3c6f0f96cbe2af9210a0c578f825ccee0`, tree `488ab45ed7151d20d17adba519d587550b1e983e`, was clean at audit. + +Verified all **1,472 committed file hashes**, the complete 135-path selected closure, and exact admission/review bindings. Against fixed `9c04278`, only Cargo.toml/Cargo.lock selected hashes change; all other 133 remain identical. Verified all 60 retained evidence hashes, 28 native artifact hashes, the built and retained ELF, and every member/CRC of the 60-entry, 913,699-byte archive. + +Actual logs and execution metadata confirm: + +- 18 native qualifier commands exited zero: 35 Rust tests, five native/rational specimens, plus guard/oracle tests in normal and optimized Python modes. +- Real packet: 26 normal and 26 optimized tests, zero skips. +- Separate no-default contracts: **83 passed**, zero failures/ignores: 23 workflow, 9 native-family, 14 composition, 23 volume, 3 compile-fail doctests, 2 coupled-reference and 9 geometry-reference tests. The five-artifact exact-tangency regression completed normally; the geometry suite took 186.08 seconds, with its over-60-second notice retained. + +ELF SHA256: `e12fe3ecd5f5f96cd30e30cba9e1f5e25fd9c263033314554cebe44cf97e94d8`. +Archive SHA256: `fa0db9c9e6f98a8c2d98b89967053537c8a2e74237c34276c84614b76bbff16c`. + +The owner reports the same archive in private Library (`libfile_3ee285ef166c8191b648475efb676b1c`). Local bytes were independently verified; remote Library retrieval was not repeated. + +The fixed PR133/9c execution evidence remains unchanged and retains its original subject. This new run establishes dependent build-input/native/rational/packet and focused contract evidence, including the private test adapters. It does **not** rerun or relabel the exact-geometry/coupled scientific field campaigns, nor establish cut/free-surface/PDE/physical, Lean, default/desktop/release, hosted/browser, native-window, performance or learned-model acceptance. Digest custody establishes neither authentication nor bit reproducibility. + +No tests, builds, campaigns, repository/ref/PR mutations or merge retries were performed by this reviewer. [Exact audit record](qualification-9a9904f-review.json). diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.json new file mode 100644 index 00000000..06fdec25 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.json @@ -0,0 +1,146 @@ +{ + "schema": "rheon-dependent-q2-native-admission-qualification-v1", + "source_head": "9a9904f3c6f0f96cbe2af9210a0c578f825ccee0", + "source_tree": "488ab45ed7151d20d17adba519d587550b1e983e", + "clean": true, + "source_file_count": 1472, + "fixed_prior_stage": { + "PR": 133, + "head": "8bf542eddd8198008b6d77d52e009e9384998f18", + "qualified_source": "9c04278e6cdd44418628c35f944c1730cbe6173e", + "unchanged": true + }, + "component_heads": { + "132": "e6525a116a07af486e4a682cc2b157241d6b9150", + "134": "f84f65104d6a0f6f8f1a9b903412b1e5155f72a2" + }, + "selected_native": { + "count": 135, + "added": 0, + "changed": 2, + "unchanged": 133, + "removed": 0, + "map_sha256": "c1baa8b487bdacaa746446a0e21540b9605232c39131b32148253909249cb8f1" + }, + "admission_inventory_sha256": "fce71cd78045159972f4bd4500bf4f67305ecc074db9a450ef3f3327d2421a09", + "bound_review_sha256": "49f7d8e32e29886a22d91b8310e99b961a5e611a0b75f670c1f280e7da29f497", + "native_qualification": { + "status": "passed", + "commands": 18, + "rust_tests": 35, + "specimens": 5, + "guard_tests_normal": 5, + "guard_tests_optimized": 5, + "oracle_tests_normal": 10, + "oracle_tests_optimized": 10, + "lean_checked": false, + "receipt_sha256": "b647e5c61f319044067ac10d128bf04e2461677103f1d8f953b7230c02c11739", + "executable_sha256": "e12fe3ecd5f5f96cd30e30cba9e1f5e25fd9c263033314554cebe44cf97e94d8" + }, + "packet": { + "status": "passed", + "normal_tests": 26, + "optimized_tests": 26, + "skipped": 0, + "artifacts_sha256": { + "data.json": "2d3303893dbddd8df7a57db581f1145396eef038b76f8bcd4d4fb613f4760b87", + "qualification.json": "b5fa338580ccfe10ebdc1735b1f9a2ca0a1043401490fb234f069cfc6b020508", + "native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "primary-qualification.json": "b647e5c61f319044067ac10d128bf04e2461677103f1d8f953b7230c02c11739" + } + }, + "focused_contracts": { + "status": "passed", + "counts": { + "focused-workflow": 23, + "focused-native-family": 9, + "focused-composition": 14, + "focused-volume": 23, + "borrow-doctests": 3, + "focused-private-references": 11 + }, + "passed_total": 83, + "private_reference_detail": { + "grid_coupled_reference_contract": 2, + "grid_geometry_reference_contract": 9 + }, + "failed": 0, + "ignored": 0, + "default_desktop_release_executed": false + }, + "archive": { + "path": "/workspace/rheon-q2-reference-stage-9a9904f.zip", + "bytes": 913699, + "sha256": "fa0db9c9e6f98a8c2d98b89967053537c8a2e74237c34276c84614b76bbff16c", + "library": { + "library_file_id": "libfile_3ee285ef166c8191b648475efb676b1c", + "file_id": "file_00000000657881fdad2fb080f534d06d", + "path": "/rheon-q2-reference-stage-9a9904f.zip", + "current_version_number": 0, + "file_name": "rheon-q2-reference-stage-9a9904f.zip" + } + }, + "evidence_files_sha256": { + "aligned-strain-native-executable": "e12fe3ecd5f5f96cd30e30cba9e1f5e25fd9c263033314554cebe44cf97e94d8", + "borrow-doctests.log": "2686018ddf9a2f70349555bd68108560bac0dbf2e3174e6953e62a7e86bbd895", + "committed-admission-check.log": "16e7944008e7536f80fe15b9ecd5f567660afa588015115d3bc6be31a62815de", + "dependency-source-review/dependencies/num-bigint-0.4.8-LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2", + "dependency-source-review/dependencies/num-bigint-0.4.8-LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "dependency-source-review/dependencies/num-bigint-0.4.8.crate": "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367", + "dependency-source-review/dependencies/num-integer-0.1.47-LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2", + "dependency-source-review/dependencies/num-integer-0.1.47-LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "dependency-source-review/dependencies/num-integer-0.1.47.crate": "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b", + "dependency-source-review/dependencies/num-rational-0.4.2-LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2", + "dependency-source-review/dependencies/num-rational-0.4.2-LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "dependency-source-review/dependencies/num-rational-0.4.2.crate": "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824", + "execution-context.json": "660a1531b5bfbac6d371801826ba4ec77b066df83aa257c8b0e80111b98dbd87", + "final-admission-review/audit.py": "3500b07fc7cb62c7c1914bd99c921a4d6d823b65bbbb440a7e3e83eaa534b6f1", + "final-admission-review/protocol-spacing-followup.json": "617b626ae8084756fd65dc5400057eb6b6b75f16ef15f971d3b8bcfd2f72ff63", + "final-admission-review/review.json": "cf7d3accfa44c6a3f7b1edba3fae3e15c419cf105163d575578456cc1f1c706b", + "final-admission-review/review.md": "f59bd164f57565b81d366358292e669bddba0d2aebbaee3d91189892c8ac78e4", + "focused-composition.log": "b6b89d1f0ac594ca81a97acf11772e77e9fc19155a15c3732b255dfc85fe3ed1", + "focused-execution.json": "73ef09f20585f62ecec45b1ff897402cfb10e4b1d9f0175c0a97e473510dda5e", + "focused-native-family.log": "cfbfa7099475ff05b5b2d8edb3648ff73ce27b3761879c142657cda702e73826", + "focused-private-references.log": "701d05b860178eafb3319f7bcde6e5a720fa209b96024b3f9b1f6199cf42b5d0", + "focused-volume.log": "48be4c0c66ce2eed855f3359020e3393fb478fd9c78b76d1301d424a092c0049", + "focused-workflow.log": "28ebd4705cc42a66e66c63d0c606b29c41d9de37e6c2b55c2f0dde890928d905", + "native-qualified-v1/format.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/large-origin-nonmidpoint-oracle-comparison.log": "da39e113ea731f599ccfc9abb7dba65f89fb2ab5f935e55bde71f1230c03fdbb", + "native-qualified-v1/large-origin-nonmidpoint-oracle-summary.json": "da39e113ea731f599ccfc9abb7dba65f89fb2ab5f935e55bde71f1230c03fdbb", + "native-qualified-v1/large-origin-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/large-origin-nonmidpoint.tsv": "38405a03996ba2be5dc952b85b1d7e0b0e7df4d115e30b9bdfe14852e55c3628", + "native-qualified-v1/native-oracle-comparison.log": "43094600164995cfae4de4b37f35b027d54fa1f1aad726c68f40cb975b280670", + "native-qualified-v1/native-oracle-summary.json": "43094600164995cfae4de4b37f35b027d54fa1f1aad726c68f40cb975b280670", + "native-qualified-v1/native-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/native.tsv": "ecdd0877f17997c577d5183cd928c27c802f9ffdcee8324f0802fe3841fddb45", + "native-qualified-v1/oracle-tests-optimized.log": "d0e334118e2ebcea86ad2335cf4508eae16a0b91c3cbe4fcf990717dc12e315f", + "native-qualified-v1/oracle-tests.log": "b074718b4d051e67fe2e06ab95bbfa9476ccb90b51154e0f102f69e21106b383", + "native-qualified-v1/qualification-gate-tests-optimized.log": "8777210b69ce98ab203ef3825e4bfb5144c79714f16244b7c5b68e06332e01dc", + "native-qualified-v1/qualification-gate-tests.log": "b1d2d3338e4cd4abc2021d5c76c427d30c249de8eda52ef7b7a45c69d017d8a8", + "native-qualified-v1/qualification.json": "b647e5c61f319044067ac10d128bf04e2461677103f1d8f953b7230c02c11739", + "native-qualified-v1/reflected-anisotropic-oracle-comparison.log": "eb013459a7f4224558b128fbf758a2edb0095d698bd8aebcf8e3221bdad8d02b", + "native-qualified-v1/reflected-anisotropic-oracle-summary.json": "eb013459a7f4224558b128fbf758a2edb0095d698bd8aebcf8e3221bdad8d02b", + "native-qualified-v1/reflected-anisotropic-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/reflected-anisotropic.tsv": "04821a0128a562dc796b5ec369e552eff2b867d09c55a7d1333cdfb35048b4d3", + "native-qualified-v1/represented-nonmidpoint-oracle-comparison.log": "189105f332930cd97ba9556b96ed2c2ff3980a7371d55f6779e4b8627dbf31eb", + "native-qualified-v1/represented-nonmidpoint-oracle-summary.json": "189105f332930cd97ba9556b96ed2c2ff3980a7371d55f6779e4b8627dbf31eb", + "native-qualified-v1/represented-nonmidpoint-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/represented-nonmidpoint.tsv": "c7eed9042d4806d437a573ddae91817c692c8cbd77b32e2df296b0e0b38d96f2", + "native-qualified-v1/rust-build.log": "598fe6236bdb40e262bbfc7000f030cf74fa7aae3fe878fd49a14525030b754a", + "native-qualified-v1/rust-clippy.log": "76a51e2c97940acf04f72a780668629ba7f52158e69bb56a7f30f1c94761621f", + "native-qualified-v1/rust-contracts.log": "dc2937f1d789af24b36b51785a7839b82866ece1c71790429bd9e201a2a90749", + "native-qualified-v1/unit-center-cube-oracle-comparison.log": "94b4d12a67c2dc1638e9a610134be312dadd3697a02391a1ea823c9f21e48cdc", + "native-qualified-v1/unit-center-cube-oracle-summary.json": "94b4d12a67c2dc1638e9a610134be312dadd3697a02391a1ea823c9f21e48cdc", + "native-qualified-v1/unit-center-cube-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "native-qualified-v1/unit-center-cube.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "packet-create.log": "5a5b050dfecb5183f324f557d0a654aee0f08e7ffa92c3427971aa011fe5e8b6", + "packet-execution.json": "3976611d04056f4f26441304b5aae56ed08ad6f01a274e2ff734dab72fa4d38c", + "packet-tests-normal.log": "8d091fbf2914ae6a9bc5f21ca742d224ccd509b6c250f2a7b63cff14204fb69a", + "packet-tests-optimized.log": "9e54d5479087ae7edaaaae6212153383355a07dfece2b6b718c353b23736f399", + "packet-v1/data.json": "2d3303893dbddd8df7a57db581f1145396eef038b76f8bcd4d4fb613f4760b87", + "packet-v1/native.tsv": "79e4840c57aae1dd704d813302d6c343ee97928781729137af31033cbbdc7566", + "packet-v1/primary-qualification.json": "b647e5c61f319044067ac10d128bf04e2461677103f1d8f953b7230c02c11739", + "packet-v1/qualification.json": "b5fa338580ccfe10ebdc1735b1f9a2ca0a1043401490fb234f069cfc6b020508" + }, + "scope": "Fresh dependent aligned-strain native/rational/real-packet/build-input and existing no-default contract qualification only. Component exact-geometry/coupled scientific campaigns retain own source; not rerun or relabelled. No new cut/free-surface/PDE/physical/Lean/default/desktop/release/native-window/performance/model acceptance." +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md new file mode 100644 index 00000000..e46c27ea --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md @@ -0,0 +1,124 @@ +# Dependent exact-reference build qualification + +Fresh qualification passed on clean commit +**`9a9904f3c6f0f96cbe2af9210a0c578f825ccee0`**, tree +`488ab45ed7151d20d17adba519d587550b1e983e`. This separately admits the PR132/134 +reference build inputs and verifies aligned native export plus existing focused +contracts. Fixed PR133/8bf542e and its execution at `9c04278` are unchanged. No cut/PDE +method, production solver or physical accuracy is promoted. + +## Source and admission + +The component checkpoint cd21a995 retains exact PR132 +`e6525a116a07af486e4a682cc2b157241d6b9150` and PR134 +`f84f65104d6a0f6f8f1a9b903412b1e5155f72a2`, whose tested sources remain `0f4e7e0` +and `06b3190`. The [complete independent admission review](final-admission-review.md) +and [protocol-only follow-up](final-admission-protocol-spacing-followup.json) +approve **135 inputs: 0 added, 2 Cargo changes, 133 unchanged, 0 removed**. All current +Rust/toolchain/checker/qualifier/oracle/test identities are exact reused inputs. +The [source/dependency review](source-review/readiness-review.md) and actual crate +checksums/license hashes establish the three new locked dev dependency identities; +all existing registry identities/checksums remain. + +Canonical sorted compact map SHA256: +`c1baa8b487bdacaa746446a0e21540b9605232c39131b32148253909249cb8f1`. +Reviewed inventory SHA256: +`fce71cd78045159972f4bd4500bf4f67305ecc074db9a450ef3f3327d2421a09`. +Append-only bound review SHA256: +`49f7d8e32e29886a22d91b8310e99b961a5e611a0b75f670c1f280e7da29f497`. +Previous review text, v3 schema/base, frozen predecessor bytes, immutable primary +tree and refusal behavior remain exact. Old stale-Cargo admission refusal was +retained; it was a source identity failure before expensive qualification. No +old receipt was transferred, no gate skipped and no allow-dirty override used. + +An initial prequalification whitespace check flagged one protocol line after the +metadata commit ba16197. A normal, independently reviewed spacing-only follow-up +commit `9a9904f` corrected it before any qualification. No history was rewritten or +criteria changed. The original eight-path review and separately pinned follow-up +remain retained; source/admission/review bytes did not change in that follow-up. + +## Executed checks + +| Existing suite | Result on exact clean `9a9904f` | +| --- | --- | +| Native admission preflight | 135 matching inputs; source identity only | +| Unchanged native qualifier | All 18 commands pass; 35 Rust tests, five new native specimens with independent rational/adversarial checks | +| Qualification-gate tests | 5 normal + 5 optimized pass | +| Real-native oracle tests | 10 normal + 10 optimized pass | +| Fresh real packet with RHEON_ALIGNED_PACKET | 26 normal + 26 optimized pass, zero skips | +| Focused no-default workflow/native-family/composition contracts | 23 + 9 + 14 pass | +| Focused no-default original/periodic represented-volume contracts | 18 + 5 pass | +| No-default borrow Rustdoc contracts | 3 pass | +| Private aligned coupled and exact-geometry adapters | 2 + 9 pass | + +The focused total is **83 passing, zero failing, zero ignored**. Other filtered +tests are not counted. The exact-geometry suite's known five-artifact regression +completed normally in the prescribed debug configuration; its 186.08s suite time +and over 60s progress notice remain in the raw log. This is an existing fixed +regression, not a rerun of the 24-case scientific field campaign. The native +qualifier includes locked build, formatting and strict Clippy in its unchanged +library/example/aligned-contract scope, not all-target desktop acceptance. + +The packet contains exactly native.tsv, data.json, qualification.json and +primary-qualification.json, produced from the new actual executable and new +source receipt. Both 26-test modes exercised real packet and malformed/stale +source/inventory/predecessor/review/binary/receipt/rehashed-payload refusals. +No packet-dependent tests skipped. The [independent execution audit](qualification-9a9904f-review.md) +verified all 1472 committed source hashes, all 135 selected inputs, the actual +built/retained ELF and all 60 archive members/CRCs/hashes without rerunning suites. +No remaining material finding was reported. The original audit +summary binding is preserved: a [metadata-only custody follow-up](summary-custody-followup.json) +adds Library version 0 and the exact file name. Removing only those two fields +reconstructs the audited summary hash exactly; source, results and raw archive +identities remain unchanged. + +## Environment and retained evidence + +Pinned Rust/Cargo 1.92.0, x86_64-unknown-linux-gnu, actual Python 3.12.14 recorded +before execution. A previously absent external target +`/workspace/rheon-q2-reference-admission-20261020-build` was used with jobs 2, +incremental 0 and dev/test debug information 0; default opt-level 0/debug assertions +remain. Normal Python clears ambient optimization and bytecode writes are off. +Source 1472-file identity, exact commands/exits, outputs and compiler/oracle logs +are bound by the [compact manifest](qualification.json). + +Fresh native receipt SHA256: +`b647e5c61f319044067ac10d128bf04e2461677103f1d8f953b7230c02c11739`. +Actual retained ELF SHA256: +`e12fe3ecd5f5f96cd30e30cba9e1f5e25fd9c263033314554cebe44cf97e94d8`. +Raw archive `/workspace/rheon-q2-reference-stage-9a9904f.zip`, 913699 bytes, SHA256 +`fa0db9c9e6f98a8c2d98b89967053537c8a2e74237c34276c84614b76bbff16c`, +is saved privately in Library as rheon-q2-reference-stage-9a9904f.zip / version 0; +its exact persistent identity is in the compact manifest. All official crate +archive/license bytes and final admission review are retained in the archive. +No original campaign/failure archive was overwritten. + +## Remaining gates and source boundaries + +Original PR132 fixed-corpus geometry evidence retains its `0f4e7e0` source, and +PR134's eight-case coupled-algebra fields retain `06b3190`. Root freshly executed +only the declared native/rational/packet and fixed focused contracts. Component +field campaigns and independent scientific reconstruction were not rerun or +relabelled as `9a9904f` evidence. Exact positive/zero geometry is qualified only for +the declared corpus. Separate PR135/4f8bd22 qualifies bounded CV1 cut-cell +operators/physical traces at source `6d99e77`; its square mass condition 6.53e11 +leaves coupled conditioning, mixed-pair stability and PDE accuracy open. That +source and its raw campaign are excluded from this admission. Small-cell policy +and MMS/hydrostatic/production-water acceptance remain separately gated. + +Hosted Pages/browser/full default/desktop integration is separate. No fresh +release, Lean, model/GPU, native-window/performance or physical acceptance is +claimed. C1-B2/PR136's new 140-input runtime/custody closure is a separate pending +admission, with its assigned legacy G1 cancellation-label repair also separate. The unchanged +legacy path in `9c04278` and `9a9904f` mislabels advection cancellation as Failed +despite no publication; the passing 23-test suite does not resolve it. Full G1-C +outcome-label acceptance remains open for that path. +The future grid→particle/surface→Lagrangian roadmap remains unimplemented beyond +actually delivered bounded slices. + +PR121's unchanged nine-green-check proposal remained unmerged after the single +requested retry was again rejected by automatic approval review: the original +trusted no-merge delegation prevailed over tool-relayed confirmation. No other +merge path or further retry was used. Earlier PR120/119 merges remain verified; +main was `718469b` and no source branch was deleted. Public implementation merges +remain paused at that approval blocker and their own required gates. diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/result-document-review/review.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/result-document-review/review.json new file mode 100644 index 00000000..bf30d33b --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/result-document-review/review.json @@ -0,0 +1,279 @@ +{ + "actual_ELF_sha256": "e12fe3ecd5f5f96cd30e30cba9e1f5e25fd9c263033314554cebe44cf97e94d8", + "archive": { + "bytes": 913699, + "library": { + "current_version_number": 0, + "file_id": "file_00000000657881fdad2fb080f534d06d", + "file_name": "rheon-q2-reference-stage-9a9904f.zip", + "library_file_id": "libfile_3ee285ef166c8191b648475efb676b1c", + "path": "/rheon-q2-reference-stage-9a9904f.zip" + }, + "path": "/workspace/rheon-q2-reference-stage-9a9904f.zip", + "sha256": "fa0db9c9e6f98a8c2d98b89967053537c8a2e74237c34276c84614b76bbff16c" + }, + "copied_original_admission_receipts_byte_exact": true, + "decision": "APPROVED_EXACT_THIRTEEN_DOCUMENT_PATHS_FOR_RESULT_COMMIT_AND_DRAFT_REVIEW", + "evidence_files_and_archive_members_verified": 60, + "executed_source_head": "9a9904f3c6f0f96cbe2af9210a0c578f825ccee0", + "executed_source_tree": "488ab45ed7151d20d17adba519d587550b1e983e", + "findings": [], + "local_links": [ + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/integration-20261020.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/q2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md#standards-and-composed-design-admission" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md#standards-and-composed-design-admission" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1a-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1-readiness.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#replacement-contract-gates" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#particle-wall-and-equilibrium-gates" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/integration-20261020.md#retained-numerical-evidence-and-selected-route" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/c1-readiness.md#frozen-first-slice-write-set" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md#claim-register" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/architecture.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/mathematics.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/verification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/workflow-preview.html" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "reports/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "issues.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/plan.md", + "target": "execution-ledger.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/issues.md", + "target": "reports/native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "c1a-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "q2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/verification.md", + "target": "g1-qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "q2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "native-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md", + "target": "q2-admission-20261020/qualification.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md", + "target": "final-admission-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md", + "target": "final-admission-protocol-spacing-followup.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md", + "target": "source-review/readiness-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md", + "target": "qualification-9a9904f-review.md" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md", + "target": "summary-custody-followup.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md", + "target": "qualification.json" + }, + { + "exists": true, + "source": "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.md", + "target": "qualification-9a9904f-review.json" + } + ], + "manifest_sha256": "ddad48dbe6ab70d8d4444da3b594b7e9ce5b5bfeaaf942a9060a692147537f3a", + "original_deciding_criteria_preserved": true, + "prepared_document_sha256": { + "docs/plans/fluid-accuracy-composition/execution-ledger.md": "e22f530be954001339d01526328e4931076f60be0b7150ff04d1decb38567e1f", + "docs/plans/fluid-accuracy-composition/issues.md": "b2000b2e8f54435ff704608c74a08e5549f1af7fe853c1ded3c6d571a5b70f96", + "docs/plans/fluid-accuracy-composition/plan.md": "85d69fa018cb914e02709d2c2058c19a40fa7fc42154a85a2224577e9485f5e0", + "docs/plans/fluid-accuracy-composition/reports/integration-20261020.md": "7e92245f9025b9b1b5cc9d14e5bab0d61494d818de28f1210b9ad2193b64f827", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-protocol-spacing-followup.json": "617b626ae8084756fd65dc5400057eb6b6b75f16ef15f971d3b8bcfd2f72ff63", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-review.json": "cf7d3accfa44c6a3f7b1edba3fae3e15c419cf105163d575578456cc1f1c706b", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/final-admission-review.md": "f59bd164f57565b81d366358292e669bddba0d2aebbaee3d91189892c8ac78e4", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.json": "b84867b128c7d91defd6c974a7f1d270d7cfc2fe155b57420903c432f1138a7c", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification-9a9904f-review.md": "8771da15fe4a8cc4ba0c150f9b8d592da03d6fc1134d5ee670ae602f2bed61e3", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.json": "ddad48dbe6ab70d8d4444da3b594b7e9ce5b5bfeaaf942a9060a692147537f3a", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md": "60bc8789f5d0bc06dc00655c053b44c6624310e2af7ca4aa4b46e6b7039aa22f", + "docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/summary-custody-followup.json": "90bb8c6995e36c2f1c66400c46921a34284b98b0ba3eebaa636408de0cf4accc", + "docs/plans/fluid-accuracy-composition/reports/verification.md": "63d9d1139231c40338e29989e73dfdd7c4bb141fe4f7ff699506f821cfc08e9d" + }, + "preserved_original_audit_summary_sha256": "7faa36f7bf03cb5234ea9c3eee3207313bf8b20f0367be7f3113ec50062fee21", + "qualified_source_hashes_verified": 1472, + "raw_log_counts": { + "borrow-doctests.log": 3, + "focused-composition.log": 14, + "focused-native-family.log": 9, + "focused-private-references.log": 11, + "focused-volume.log": 23, + "focused-workflow.log": 23, + "native-qualified-v1/rust-contracts.log": 35, + "packet-tests-normal.log": 26, + "packet-tests-optimized.log": 26 + }, + "receipt_command_count": 18, + "resolved_findings": [ + "Known legacy advection cancellation-label bug is acknowledged as present in both9c/9a fixed source paths; passing23 workflow tests do not close full G1-C outcome-label acceptance. Only future repair/new136source is excluded.", + "PR132/134/135/136 rows are contiguous with integration table.", + "Original audit summary7faa is exactly reconstructed from currentddad by removing only two Library metadata fields; original audit preserved and bounded custody addendum binds current summary." + ], + "schema": "rheon-independent-q2-result-document-review-v1", + "scope_limits": [ + "No duplicate builds/tests/campaigns or repository/ref/PR edits.", + "9a execution is fixed native/rational/packet/no-default83focused contracts; no general cut/PDE/physical/default/desktop/release/hosted/GUI/Lean/model/performance acceptance.", + "PR135 source6d99 and head4f8 retain bounded four-fixture CV1 operator/physical-trace result only, square mass condition6.53e11 and next solve/stability/PDE gates. No new local scientific audit is inferred.", + "PR136/e56 and its140-input admission remain separate pending.", + "Library identity retained from owner/adapter report; remote retrieval not repeated.", + "PR121 automatic-review rejection remains a public merge blocker; no retry or bypass performed." + ], + "selected_input_count": 135, + "source_and_admission_frozen": true, + "summary_custody_delta_independently_verified": { + "archive.library.current_version_number": 0, + "archive.library.file_name": "rheon-q2-reference-stage-9a9904f.zip" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/result-document-review/review.md b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/result-document-review/review.md new file mode 100644 index 00000000..0358385a --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/result-document-review/review.md @@ -0,0 +1,27 @@ +# Independent dependent-Q2 result documentation review — 2026-10-20 + +Approved the exact **13 prepared documentation paths** for result commit and draft review. No unresolved documentation finding remains. The full per-file SHA256 roster is in [review.json](review.json). Copies of these two independent receipts are outside their own13-path hash scope; exact-byte copies need no source/test rerun. This is documentation/evidence approval, not public merge or scientific-method acceptance. + +Executed source remains `9a9904f3c6f0f96cbe2af9210a0c578f825ccee0`, tree `488ab45ed7151d20d17adba519d587550b1e983e`. The working delta contains only five canonical documents and eight new result/review/custody files. All135 selected inputs, Cargo bytes, bound inventory and admission review remain fixed. Later result-document commits must not be represented as newly executed source subjects. Fixed PR133/9c04278 evidence remains separately scoped and unchanged. + +## Independent evidence and scope checks + +Read-only verification confirmed all1472 receipt source hashes against exact committed9a blobs, all135 current selected identities, and exact inventory/review bindings. The native receipt is clean/passed with18 successful commands. All60 retained evidence hashes and every member/CRC of the60-entry archive match the manifest; archive size913699 and SHA256 `fa0db9c9e6f98a8c2d98b89967053537c8a2e74237c34276c84614b76bbff16c` match. The retained executable has an ELF header and expected SHA256 `e12fe3ecd5f5f96cd30e30cba9e1f5e25fd9c263033314554cebe44cf97e94d8`. + +Raw logs support35 Rust native-contract passes;83 separate focused no-default passes (23 workflow,9 native-family,14 composition,23 volume,3 compile-fail doctests,2 private coupled,9 private exact-geometry); and26 real-packet tests in each normal/optimized mode with no skips. The five native/rational specimens and Python guard/oracle tests remain the existing18-command qualifier scope. Filtered tests are not counted. The long exact-geometry regression is correctly disclosed as a fixed existing test, not another scientific campaign. Recorded environment supports actual Python3.12.14, pinned Rust/Cargo1.92, fresh target, debug-information settings and unchanged debug assertions/opt-level. + +The original deciding verification sections remain byte-identical. All41 local file links resolve, Markdown fences are balanced, and the changed integration rows form one contiguous table. Original admission review and protocol-spacing receipts are exact-byte copies of their external originals. + +## Findings resolved before final pinning + +The initial G1 wording incorrectly suggested the legacy advection-cancellation finding was absent from the fixed stages. Direct source inspection confirms the old cancellation wrapper reaches `SimulationError::Advection(AdvectionError::Cancelled)` while the observed Session's cancellation classification omits it. The corrected canonical documents and result report explicitly acknowledge this defect in both9c and9a: no publication occurs, but the attempt is labelled Failed. Passing23 workflow tests do not resolve that uncovered path. Full G1-C outcome-label acceptance remains open; the assigned repair and new PR136 implementation, rather than the existing defect, are excluded from the fixed subjects. No implementation was changed by this documentation review. + +The original independent execution audit binds summary SHA256 `7faa36f7bf03cb5234ea9c3eee3207313bf8b20f0367be7f3113ec50062fee21`; the current compact summary is `ddad48dbe6ab70d8d4444da3b594b7e9ce5b5bfeaaf942a9060a692147537f3a`. I independently reproduced the exact original bytes/hash by removing only `archive.library.current_version_number=0` and `archive.library.file_name=rheon-q2-reference-stage-9a9904f.zip` from the current JSON and serializing in its original format. No result, source, raw artifact or archive value changes. The original audit is preserved; the explicit custody addendum and prose correctly bind the metadata-only extension. Remote Library retrieval was not repeated. + +## Scientific and operational boundaries + +PR132's fixed-corpus exact predicates and PR134's eight aligned algebra cases retain their own tested sources. PR135 head `4f8bd22669efed62e84c0062ee1baec27393e830`/source `6d99e7794a6aa69f5886bb15cc662e40ea43cd40` is separately reported and excluded from9a execution. Its committed qualification/independent review supports only the four-fixture CV1 operator/physical-trace builder result. The square mass condition diagnostic near6.53e11 leaves coupled conditioning, mixed-pair stability, forward-error and PDE gates open. Physical traces do not constitute physical validation. This review did not rerun/reconstruct that campaign or admit a PDE solver. + +PR136/e56 and its140-input Session/custody admission remain separate and pending. No fresh default/desktop/release, hosted Pages/browser, native-window/performance, Lean, learned/GPU, full replacement, general cut/free-surface or physical acceptance follows from the dependent qualification. Failed P1/Q1 results and the grid-first/future particle-output-surface/later Lagrangian roadmap remain intact. The fixed acceptance thresholds were not weakened. + +The PR121 automatic-review rejection remains a public merge blocker. No additional retry or alternate path was performed or authorized here. Reviewer ran no build, test, model, simulation, evaluator or campaign and made no repository, target, ref or PR mutation; only outside-Git audit receipts were written. diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/dependency-review.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/dependency-review.json new file mode 100644 index 00000000..1da4c554 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/dependency-review.json @@ -0,0 +1,60 @@ +{ + "new_dependencies": [ + { + "name": "num-bigint", + "version": "0.4.8", + "checksum": "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367", + "verified_official_crate_bytes": 109961, + "official_archive_url": "https://static.crates.io/crates/num-bigint/num-bigint-0.4.8.crate", + "license": "MIT OR Apache-2.0", + "license_sha256": { + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + "declared_rust_version": "1.60", + "root_build_rs": [], + "defaults": [ + "std" + ] + }, + { + "name": "num-integer", + "version": "0.1.47", + "checksum": "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b", + "verified_official_crate_bytes": 23502, + "official_archive_url": "https://static.crates.io/crates/num-integer/num-integer-0.1.47.crate", + "license": "MIT OR Apache-2.0", + "license_sha256": { + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + "declared_rust_version": "1.31", + "root_build_rs": [], + "defaults": [ + "std" + ] + }, + { + "name": "num-rational", + "version": "0.4.2", + "checksum": "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824", + "verified_official_crate_bytes": 28159, + "official_archive_url": "https://static.crates.io/crates/num-rational/num-rational-0.4.2.crate", + "license": "MIT OR Apache-2.0", + "license_sha256": { + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + "declared_rust_version": "1.60", + "root_build_rs": [], + "defaults": [ + "num-bigint", + "std" + ] + } + ], + "existing_num_traits": "0.2.19 is unchanged already locked; now direct dev requirement", + "removed_identities": [], + "old_registry_checksum_changes": [], + "only_existing_package_record_changed": "rheon direct dev dependency edges" +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr132-source-pins.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr132-source-pins.json new file mode 100644 index 00000000..40e7a29c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr132-source-pins.json @@ -0,0 +1,23 @@ +{ + "base": "c2fbbea9f19f818b28b6c6863a40220a2bd0bbe5", + "head": "e6525a116a07af486e4a682cc2b157241d6b9150", + "tested": "0f4e7e0944a7e0302690a0f71c08c21fe345cc89", + "pins": { + "Cargo.lock": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "Cargo.toml": "fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409", + "docs/plans/fluid-accuracy-composition/q2-exact/admission.md": "c257ea0697cf498eac006531f958f5bf28cb5a28691dee31484112080c40488f", + "docs/plans/fluid-accuracy-composition/q2-exact/analyze.py": "6c0920751843469fbc7657b5f8339540fa2e5ec0f98992591426a8360bdb295c", + "docs/plans/fluid-accuracy-composition/q2-exact/independent-review.md": "fb77647e717bc30cdafdd9a6446f731474c707e1aa94457028870033105a0ed5", + "docs/plans/fluid-accuracy-composition/q2-exact/manifest.json": "9113f2d2accf9353900b4edcacf3448ac6ae38387045f8bbe27fe8558bdb3e85", + "docs/plans/fluid-accuracy-composition/q2-exact/mathematics.md": "635d67b8bf830b93cee376855b993341135335791fc6c38fe4b64e794a99528c", + "docs/plans/fluid-accuracy-composition/q2-exact/protocol.md": "bb96ae382d0713730dbb58d10209ef4c21530e6ab0b48449264588f97d93a215", + "docs/plans/fluid-accuracy-composition/q2-exact/qualification.md": "47ac24e0a5280afcf4759ac8b3091a9e1423beec65a32f8ec83bc6a5bd2501c2", + "docs/plans/fluid-accuracy-composition/q2-exact/results.md": "f2c3fefc44304b99408c00f1f9d74a0be1c0002671f1f4ed7d8e4fc6b08c5511", + "docs/plans/fluid-accuracy-composition/q2-exact/review.md": "c36946783dd61939396b3e9c08ca2bc9e3874caf0581b561c534d12bc1d19e53", + "docs/plans/fluid-accuracy-composition/q2-exact/route-handoff.md": "b7862c160c11ad773f0609b15cbd4b630c1ee756ec7fadc2a00b13b034cbc330", + "examples/grid_geometry_reference.rs": "40b0e81dff40738d64174f1726f037e18d26f2fb6076c3b0d78072acbc616c26", + "examples/grid_geometry_reference/diagnostics.rs": "16abcc4a2c2fe97bb7c36b9e37f8a2dce0e65f146a2eab8cb6c553fef4b5f4c3", + "examples/grid_geometry_reference/exact.rs": "9e1ecc2cfdf4d3473eb6ba39eec94854c8c45ca90cb51d2722c23fd029b106d2", + "examples/grid_geometry_reference/geometry.rs": "2f4f4f119e5a848558f92231d17e418c5898164c5bc5d24075e9a3f812297056" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr134-source-pins.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr134-source-pins.json new file mode 100644 index 00000000..635ba117 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/pr134-source-pins.json @@ -0,0 +1,19 @@ +{ + "base": "e6525a116a07af486e4a682cc2b157241d6b9150", + "head": "f84f65104d6a0f6f8f1a9b903412b1e5155f72a2", + "tested": "06b31902fd229624080bff1562f80beb1be2449c", + "pins": { + "docs/plans/fluid-accuracy-composition/q2-coupled/admission.md": "d15e8f73c0c55a888bead01a50f29c7fb615c19ffce71694ef23e65914d3cbe7", + "docs/plans/fluid-accuracy-composition/q2-coupled/analyze.py": "a129ae79ed54f520883d508a0a3c2cc4d72b5540079d6d28aa7461088d71b336", + "docs/plans/fluid-accuracy-composition/q2-coupled/independent-review.md": "159c818739defdb3ebf393469c080c95fb3f3dd251fcf138e7487828a2e9be7c", + "docs/plans/fluid-accuracy-composition/q2-coupled/manifest.json": "d548cb3eb85c6f6963c1c4407aa01ea0958faaeec7ee46e2969b7f22cdf6b360", + "docs/plans/fluid-accuracy-composition/q2-coupled/mathematics.md": "2e42a62277042a4b9fbcc814742d15fe1b6277705f1a44e1fbb42024a6786d4a", + "docs/plans/fluid-accuracy-composition/q2-coupled/protocol.md": "7599823e210e3d2a39cec5d6c58d219993d2c7a09b70ab07351353cd4409cb40", + "docs/plans/fluid-accuracy-composition/q2-coupled/qualification.md": "ef0772904d0dc7e8bbef345970c736d0f311628987a32ee1df820a355cbe91aa", + "docs/plans/fluid-accuracy-composition/q2-coupled/results.md": "9460003a5a2629e86bd57d0c6b42a3aefcffce840822c43fa1bb0281faa6ada9", + "docs/plans/fluid-accuracy-composition/q2-coupled/review.md": "993b0211de776eded6f2b3660ca6b51343af747fd2f24263ec70d00b9defc468", + "docs/plans/fluid-accuracy-composition/q2-coupled/route-handoff.md": "8f7359ba91bf7e410dcdc0ae055a9f287b98171108532c024d1fdfbcd012cc6d", + "examples/grid_coupled_reference.rs": "1bea8f49567aac24e413721ce3d3c03302ef0154248584f958f20d7d784fa0a7", + "tests/grid_coupled_reference_contract.rs": "d36504da77f21aa8667d530f304f97e89ff27163a99f3c0b4e161deed42caa56" + } +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.json new file mode 100644 index 00000000..c9bf9340 --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.json @@ -0,0 +1,256 @@ +{ + "schema": "rheon-q2-numerical-handoff-source-boundary-review-v1", + "status": "BOUNDED_HANDOFF_REVIEW_COMPLETE_NOT_COMPOSED_ADMISSION_OR_MERGE_READY", + "reviewed_at_utc": "2026-10-20T03:19:17.992898+00:00", + "standards": "0fc92a24279f3a4574c80af0a2f31ea347a21597", + "prs": { + "132": { + "base": "c2fbbea9f19f818b28b6c6863a40220a2bd0bbe5", + "head": "e6525a116a07af486e4a682cc2b157241d6b9150", + "tested": "0f4e7e0944a7e0302690a0f71c08c21fe345cc89", + "folder": "q2-exact", + "changed_paths": { + "Cargo.lock": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "Cargo.toml": "fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409", + "docs/plans/fluid-accuracy-composition/q2-exact/admission.md": "c257ea0697cf498eac006531f958f5bf28cb5a28691dee31484112080c40488f", + "docs/plans/fluid-accuracy-composition/q2-exact/analyze.py": "6c0920751843469fbc7657b5f8339540fa2e5ec0f98992591426a8360bdb295c", + "docs/plans/fluid-accuracy-composition/q2-exact/independent-review.md": "fb77647e717bc30cdafdd9a6446f731474c707e1aa94457028870033105a0ed5", + "docs/plans/fluid-accuracy-composition/q2-exact/manifest.json": "9113f2d2accf9353900b4edcacf3448ac6ae38387045f8bbe27fe8558bdb3e85", + "docs/plans/fluid-accuracy-composition/q2-exact/mathematics.md": "635d67b8bf830b93cee376855b993341135335791fc6c38fe4b64e794a99528c", + "docs/plans/fluid-accuracy-composition/q2-exact/protocol.md": "bb96ae382d0713730dbb58d10209ef4c21530e6ab0b48449264588f97d93a215", + "docs/plans/fluid-accuracy-composition/q2-exact/qualification.md": "47ac24e0a5280afcf4759ac8b3091a9e1423beec65a32f8ec83bc6a5bd2501c2", + "docs/plans/fluid-accuracy-composition/q2-exact/results.md": "f2c3fefc44304b99408c00f1f9d74a0be1c0002671f1f4ed7d8e4fc6b08c5511", + "docs/plans/fluid-accuracy-composition/q2-exact/review.md": "c36946783dd61939396b3e9c08ca2bc9e3874caf0581b561c534d12bc1d19e53", + "docs/plans/fluid-accuracy-composition/q2-exact/route-handoff.md": "b7862c160c11ad773f0609b15cbd4b630c1ee756ec7fadc2a00b13b034cbc330", + "examples/grid_geometry_reference.rs": "40b0e81dff40738d64174f1726f037e18d26f2fb6076c3b0d78072acbc616c26", + "examples/grid_geometry_reference/diagnostics.rs": "16abcc4a2c2fe97bb7c36b9e37f8a2dce0e65f146a2eab8cb6c553fef4b5f4c3", + "examples/grid_geometry_reference/exact.rs": "9e1ecc2cfdf4d3473eb6ba39eec94854c8c45ca90cb51d2722c23fd029b106d2", + "examples/grid_geometry_reference/geometry.rs": "2f4f4f119e5a848558f92231d17e418c5898164c5bc5d24075e9a3f812297056" + }, + "code_equal_to_tested_freeze": true, + "later_head_delta": [ + "docs/plans/fluid-accuracy-composition/q2-exact/independent-review.md", + "docs/plans/fluid-accuracy-composition/q2-exact/manifest.json", + "docs/plans/fluid-accuracy-composition/q2-exact/qualification.md", + "docs/plans/fluid-accuracy-composition/q2-exact/results.md", + "docs/plans/fluid-accuracy-composition/q2-exact/route-handoff.md" + ], + "manifest": { + "numerical_source_commit": "0f4e7e0944a7e0302690a0f71c08c21fe345cc89", + "binary_sha256": "336842c96979bcf38fa825410b3f19eb8f67cf428141cbaef1e4c8f6476e5473", + "source_archive_sha256": "388d0a5be1b57c28bdc03d0eecaf80e51d7eceff130f8fd1906a72e3f80034da", + "native_exit_code": 0, + "cases": 24, + "selected_debug_tests": 9, + "selected_release_tests": 9, + "independent_scripts": { + "reconstruct_finite.py": "b0d6b21983274a50577ce718d24fa83b8fc46e7d3d389c58ee9b1a9eee936bda", + "exact_oracle.py": "23b50794379fa0abfbd358e5d036f8feba014b5651169043c1c00de43dc9cc9b" + }, + "independent_results": { + "independent/exact-results/summary.json": "ec4b8923c1332c53e779fb9de72dedcbd2b7a902d76562925c9ab65f8d008d4d", + "independent/finite-results/summary.json": "8ac1f66d8188cb6dc0cde3a320a5f40c6a19bf59c4599797319ccbcb684c9b60" + }, + "evaluator_sha256": "6c0920751843469fbc7657b5f8339540fa2e5ec0f98992591426a8360bdb295c", + "custody": "Archive created once, CRC checked, saved privately to Library; local identity persisted successfully.", + "archive": { + "path": "/workspace/rheon-q2-exact-geometry-0f4e7e0.zip", + "bytes": 15077327, + "sha256": "e0bb0e691ca27feec7991abe980f94013260ad12cda93daf904ba7c7fa9ecc4d", + "library": { + "library_file_id": "libfile_b04abe9965fc8191843341e158250f25", + "file_id": "file_0000000076548230a06e1715a89afc64", + "path": "/rheon-q2-exact-geometry-0f4e7e0.zip" + } + }, + "independent_review_sha256": "fb77647e717bc30cdafdd9a6446f731474c707e1aa94457028870033105a0ed5" + }, + "evaluator_hash_verified": true, + "raw_archive_locally_available": false, + "live": { + "head": "e6525a116a07af486e4a682cc2b157241d6b9150", + "draft": true, + "state": "OPEN", + "base_branch": "fix/numerical-evaluator-inputs-20261020", + "check_snapshot_counts": { + "QUEUED": 11, + "SUCCESS": 5, + "FAILURE": 1, + "SKIPPED": 1 + } + } + }, + "134": { + "base": "e6525a116a07af486e4a682cc2b157241d6b9150", + "head": "f84f65104d6a0f6f8f1a9b903412b1e5155f72a2", + "tested": "06b31902fd229624080bff1562f80beb1be2449c", + "folder": "q2-coupled", + "changed_paths": { + "docs/plans/fluid-accuracy-composition/q2-coupled/admission.md": "d15e8f73c0c55a888bead01a50f29c7fb615c19ffce71694ef23e65914d3cbe7", + "docs/plans/fluid-accuracy-composition/q2-coupled/analyze.py": "a129ae79ed54f520883d508a0a3c2cc4d72b5540079d6d28aa7461088d71b336", + "docs/plans/fluid-accuracy-composition/q2-coupled/independent-review.md": "159c818739defdb3ebf393469c080c95fb3f3dd251fcf138e7487828a2e9be7c", + "docs/plans/fluid-accuracy-composition/q2-coupled/manifest.json": "d548cb3eb85c6f6963c1c4407aa01ea0958faaeec7ee46e2969b7f22cdf6b360", + "docs/plans/fluid-accuracy-composition/q2-coupled/mathematics.md": "2e42a62277042a4b9fbcc814742d15fe1b6277705f1a44e1fbb42024a6786d4a", + "docs/plans/fluid-accuracy-composition/q2-coupled/protocol.md": "7599823e210e3d2a39cec5d6c58d219993d2c7a09b70ab07351353cd4409cb40", + "docs/plans/fluid-accuracy-composition/q2-coupled/qualification.md": "ef0772904d0dc7e8bbef345970c736d0f311628987a32ee1df820a355cbe91aa", + "docs/plans/fluid-accuracy-composition/q2-coupled/results.md": "9460003a5a2629e86bd57d0c6b42a3aefcffce840822c43fa1bb0281faa6ada9", + "docs/plans/fluid-accuracy-composition/q2-coupled/review.md": "993b0211de776eded6f2b3660ca6b51343af747fd2f24263ec70d00b9defc468", + "docs/plans/fluid-accuracy-composition/q2-coupled/route-handoff.md": "8f7359ba91bf7e410dcdc0ae055a9f287b98171108532c024d1fdfbcd012cc6d", + "examples/grid_coupled_reference.rs": "1bea8f49567aac24e413721ce3d3c03302ef0154248584f958f20d7d784fa0a7", + "tests/grid_coupled_reference_contract.rs": "d36504da77f21aa8667d530f304f97e89ff27163a99f3c0b4e161deed42caa56" + }, + "code_equal_to_tested_freeze": true, + "later_head_delta": [ + "docs/plans/fluid-accuracy-composition/q2-coupled/independent-review.md", + "docs/plans/fluid-accuracy-composition/q2-coupled/manifest.json", + "docs/plans/fluid-accuracy-composition/q2-coupled/qualification.md", + "docs/plans/fluid-accuracy-composition/q2-coupled/results.md", + "docs/plans/fluid-accuracy-composition/q2-coupled/route-handoff.md" + ], + "manifest": { + "numerical_source_commit": "06b31902fd229624080bff1562f80beb1be2449c", + "binary_sha256": "2e6dce9e317aa157d41ae05f8ba29c6a8ed4df51f8fcb7c88bd96f6294cbef93", + "source_archive_sha256": "8cb96557b1b401167d979a3587fa4175b26a9f53a34bcfff93ebdf92e238fff7", + "native_exit_code": 0, + "cases": 8, + "selected_debug_tests": 2, + "selected_release_tests": 2, + "independent_oracle_sha256": "b76e7c926d5746aa76bbf2a60d768443b97f7cb4c31e5c2f072a82af117b8d3f", + "independent_result_sha256": "284417cca5ba7cae4020b475cdeafe8f7ca31f6a88e3e209afc09c17bca5da99", + "independent_review_sha256": "159c818739defdb3ebf393469c080c95fb3f3dd251fcf138e7487828a2e9be7c", + "independent_hash_manifest_sha256": "89631999bba71d7cd8d17b6b78274d46f89b4e8b67d8fd11f0f3864ed1a82004", + "evaluator_sha256": "a129ae79ed54f520883d508a0a3c2cc4d72b5540079d6d28aa7461088d71b336", + "custody": "Archive created once, CRC checked, independent review/manifest hashes match final reviewer receipt, saved privately to Library with local identity persisted.", + "archive": { + "path": "/workspace/rheon-q2-aligned-coupled-06b3190.zip", + "bytes": 6469513, + "sha256": "550bc5173f14939deed7666e348a95edc0ea1474cd80112578cdd7c3dbc79fa5", + "library": { + "library_file_id": "libfile_dc54eac485448191815068901b1b2332", + "file_id": "file_00000000c4748230aef762e6b63a0be1", + "current_version_number": 0, + "path": "/rheon-q2-aligned-coupled-06b3190.zip" + } + } + }, + "evaluator_hash_verified": true, + "raw_archive_locally_available": false, + "live": { + "head": "f84f65104d6a0f6f8f1a9b903412b1e5155f72a2", + "draft": true, + "state": "OPEN", + "base_branch": "implementation/q2-exact-face-boundary-20261020", + "check_snapshot_counts": { + "QUEUED": 7, + "SUCCESS": 1 + } + } + } + }, + "new_material_source_findings": [], + "dependency_review": { + "new_dependencies": [ + { + "name": "num-bigint", + "version": "0.4.8", + "checksum": "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367", + "verified_official_crate_bytes": 109961, + "official_archive_url": "https://static.crates.io/crates/num-bigint/num-bigint-0.4.8.crate", + "license": "MIT OR Apache-2.0", + "license_sha256": { + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + "declared_rust_version": "1.60", + "root_build_rs": [], + "defaults": [ + "std" + ] + }, + { + "name": "num-integer", + "version": "0.1.47", + "checksum": "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b", + "verified_official_crate_bytes": 23502, + "official_archive_url": "https://static.crates.io/crates/num-integer/num-integer-0.1.47.crate", + "license": "MIT OR Apache-2.0", + "license_sha256": { + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + "declared_rust_version": "1.31", + "root_build_rs": [], + "defaults": [ + "std" + ] + }, + { + "name": "num-rational", + "version": "0.4.2", + "checksum": "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824", + "verified_official_crate_bytes": 28159, + "official_archive_url": "https://static.crates.io/crates/num-rational/num-rational-0.4.2.crate", + "license": "MIT OR Apache-2.0", + "license_sha256": { + "LICENSE-MIT": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb", + "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + "declared_rust_version": "1.60", + "root_build_rs": [], + "defaults": [ + "num-bigint", + "std" + ] + } + ], + "existing_num_traits": "0.2.19 is unchanged already locked; now direct dev requirement", + "removed_identities": [], + "old_registry_checksum_changes": [], + "only_existing_package_record_changed": "rheon direct dev dependency edges" + }, + "selected_input_impact": { + "policy": "Existing unchanged conservative selected-native closure; apply owner path deltas only, not whole stacked-branch tree substitution.", + "relative_to_executed_subject": "9c04278e6cdd44418628c35f944c1730cbe6173e", + "existing_selected_count": 135, + "PR132": { + "Cargo.lock": "e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f", + "Cargo.toml": "fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409" + }, + "PR134": {}, + "combined_counts_if_only_reviewed_owner_deltas_are_integrated": { + "total": 135, + "added": 0, + "changed": 2, + "unchanged": 133, + "removed": 0 + }, + "private_reference_inputs_outside_selected_policy": [ + "examples/grid_geometry_reference.rs", + "examples/grid_geometry_reference/geometry.rs", + "examples/grid_geometry_reference/diagnostics.rs", + "examples/grid_geometry_reference/exact.rs", + "examples/grid_coupled_reference.rs", + "tests/grid_coupled_reference_contract.rs", + "q2-exact/q2-coupled protocols, evaluators and reports" + ], + "qualification_binding": "Fresh whole-commit receipts must also bind private example/test/evaluator source; selected135 admission does not execute/qualify those reference campaigns. No selector broadening or inventory update performed." + }, + "bounded_disposition": [ + "132: private exact represented-binary64 face classifier uses pinned BigRational edge crossings with strict empty/point/positive dimension, conservative unrepresentable-positive refusal and existing floating source/moment rejection. Region bounds are stored with moments. No production src, Session, provider, recording or geometry owner is changed by its owner delta.", + "134: private tiny fixed aligned CPU algebra assembles M,B,K=mu*S^T*Wgeom*S and symmetric coupled block, first component gauges, <=256 dense partial-pivot solve, full-cell momentum/continuity and residual-work gates; no pivot floor. It does not invoke a Session or replace the preserved split experiment.", + "Both tested source freezes remain exact; later heads only append evidence docs. Evaluators have always-on explicit require checks and declare independent exact/block reconstruction REQUIRED; no optimized-assert bypass identified in these new evaluators or repaired q2 dependency.", + "Producer/independent reports retain fixed-corpus geometry and eight-case aligned algebra limits and explicitly stop cut/free-surface/DOF/extension/traction/MMS/hydrostatic progression. Their raw archives and external oracle sources were not available locally in this review; those execution and custody results remain attributed, not rehashed or rerun here." + ], + "admission_blockers": [ + "Complete exact integration composition and source-map delta review remain required; no whole-branch replacement may drop unrelated G1/C1 files by ancestry.", + "Review/admit the two new Cargo inputs and three resolved crate identities under declared private native example/test ownership; append exact license/provenance and selected feature/target records to integration evidence. Official archive/license checks are supporting evidence, not general security or supported-WASM assurance.", + "Fresh clean committed qualification is required after dependency/Cargo integration; 9c04278 receipts explicitly exclude all132/134 additions and cannot be transferred. Separately retain or establish exact-subject private-reference qualification and applicable focused/default/desktop/tooling consumer checks.", + "Hosted132 Pages build currently fails and other checks remain queued;134 remains draft with queued checks. Neither is ready to merge from this source-boundary review.", + "Further cut/free-surface active spaces, velocity extension, stress/traction boundary lifts and coupled MMS/hydrostatic method selection remain unresolved. Parent research authorization is not implementation/physics admission." + ], + "no_claims": [ + "No campaign/build/test reruns, composition, source/inventory/ref/PR mutations. Only external review files and official crate archive bytes retrieved to /tmp.", + "No new continuum/physical/model/GPU/native-window/performance or kernel/IEEE proof claim.", + "1437-source/135-native staged9c qualification stays fixed to its executed subject; future Q2 material is explicitly excluded." + ] +} diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md new file mode 100644 index 00000000..f8a0870c --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/source-review/readiness-review.md @@ -0,0 +1,26 @@ +# Q2 numerical handoff: independent source/admission boundary review + +**No additional material source-boundary finding. Not composed-admission approval or merge readiness.** Reviewed live draft [PR132](https://github.com/MrScripty/Rheon/pull/132) `e6525a116a07af486e4a682cc2b157241d6b9150` and [PR134](https://github.com/MrScripty/Rheon/pull/134) `f84f65104d6a0f6f8f1a9b903412b1e5155f72a2`. Their code equals tested freezes `0f4e7e0` and `06b3190`; subsequent deltas are evidence documents only. + +PR132 repairs private represented-source face dimension with exact rational edge crossings, strict empty/point/positive classification and positive-but-unrepresentable refusal. Existing floating region/moment limits remain. PR134 adds a tiny private aligned coupled M/B/S/W assembly and direct algebra reference with full residual/work gates, not a Session/backend replacement. Existing production sources, operators and proofs are unchanged in these owner deltas. + +The manifests bind exact numerical commits and evaluator hashes, which match Git. Reports distinguish the 24-case fixed geometry corpus from eight aligned algebra cases and retain negative predecessor outcomes. Local raw numerical ZIPs and external independent oracle programs were unavailable; no raw execution/custody rehash or campaign rerun is claimed. + +## Cargo and selected-source admission + +PR132 declares `num-rational = 0.4.2` and `num-traits = 0.2.19` as exact private native dev requirements. The existing num-traits identity is unchanged. The lock adds num-bigint 0.4.8, num-integer 0.1.47 and num-rational 0.4.2; no existing registry identity/checksum changes or removals. Only the Rheon root package dependency edges change. + +Retrieved official crate archives from static.crates.io into this review's `/tmp` directory. All three match lock checksums and include actual MIT/Apache-2.0 license texts; no root build.rs or new build dependencies. num-rational defaults enable BigInt/std; its transitive integer defaults are propagated as declared. This supports the stated bounded CPU reference requirement, without security/performance/WASM or production adoption assurance. [Exact package/license records](dependency-review.json). + +Applied as **owner deltas** to qualified `9c04278`, the unchanged conservative selector would remain **135 paths: 2 changed (Cargo.toml/Cargo.lock), 133 unchanged, 0 added/removed**. PR134 itself adds no selected path. Its examples/test adapter and all scientific protocols/evaluators remain separate private qualification inputs, still requiring whole-commit evidence. The numerical branches lack unrelated G1/C1 changes by ancestry: replacing the complete branch tree would be incorrect. No merge was attempted here. + +New selected Cargo hashes: + +- Cargo.toml: `fc5bccf8799aa579c510d2ff7078a4532f794e61841e327d7d567257589f2409` +- Cargo.lock: `e64beca355b3963812b80d49ac5b17d0b1626f03f5d651b50e4dd25823dce96f` + +## Remaining gates + +The integration owner must approve exact dependency/feature/license custody, compose only reviewed deltas, recheck the complete source closure and run fresh clean committed qualification plus applicable private-reference and consumer contracts. **9c04278 qualification excludes PR132/134 and cannot be transferred.** PR132 currently has a failed Pages build and pending jobs; PR134 also has pending jobs. Both remain drafts. + +Cut/free-surface active spaces, velocity extensions, traction/stress boundary lifts and coupled MMS/hydrostatic method selection remain stopping gates. The eight aligned algebra cases do not resolve them. No source/ref/PR edits, composition or duplicate builds/tests/campaigns were performed. See [the exact-head receipt](readiness-review.json) for all 28 changed-path pins, live check snapshots and limits. diff --git a/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/summary-custody-followup.json b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/summary-custody-followup.json new file mode 100644 index 00000000..7ac898cc --- /dev/null +++ b/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/summary-custody-followup.json @@ -0,0 +1,11 @@ +{ + "status": "EXACT_METADATA_ONLY_CUSTODY_EXTENSION", + "original_audit_summary_sha256": "7faa36f7bf03cb5234ea9c3eee3207313bf8b20f0367be7f3113ec50062fee21", + "current_summary_sha256": "ddad48dbe6ab70d8d4444da3b594b7e9ce5b5bfeaaf942a9060a692147537f3a", + "only_added_fields": { + "archive.library.current_version_number": 0, + "archive.library.file_name": "rheon-q2-reference-stage-9a9904f.zip" + }, + "original_summary_exactly_reconstructed_by_removing_these_fields": true, + "raw_artifact_source_archive_hashes_unchanged": true +} diff --git a/docs/plans/fluid-accuracy-composition/reports/verification.md b/docs/plans/fluid-accuracy-composition/reports/verification.md index 1a81700c..40d5581f 100644 --- a/docs/plans/fluid-accuracy-composition/reports/verification.md +++ b/docs/plans/fluid-accuracy-composition/reports/verification.md @@ -13,14 +13,24 @@ Evidence-kind, environment and mode qualify each claim independently; a stronger | P0-D | Complete source-grounded proposal, all F1–F8, ownership and independent review dispositions | focused + independent design review | not-applicable / manual review | Planning owner | satisfied — independent reviews disposed and source checks passed; qualification.md | | P0-L | Selected exact statements compile with allowed axioms, negative audit rejection | focused formal contract | required-real: pinned Lean 4.19.0 + locked mathlib / automated | Proof owner | satisfied — 12 theorem statements, 25 audited declarations, 3 negative probes; qualification.md; not a physical or Rust claim | | P0-V | Authored HTML supports sample selection/keyboard/navigation | focused prototype interaction | simulated authored data in Chromium / automated | Visual author | satisfied for authored prototype only; qualification.md; product claim pending | -| G1-C | Descriptor/actual attempt/profile/legacy binding and refusal | contract + integration | representative native CPU/archive fixtures / automated | Composition + recording owners | pending — production Deferred/unimplemented | -| G1-U | Live→evidence→cancel→cold workflow inspection with pointer/keyboard | user-workflow | representative supported native display/graphics / automated or recorded manual | Desktop + verification owners | pending — production Deferred/unimplemented; HTML cannot satisfy | -| C1-R | Stage/subgraph/family replacement/rollback/provenance | contract + integration; external runtime system where used | representative CPU + actual supervised process fixture / automated | Provider + Session owners | pending — production Deferred/unimplemented | -| P-W | Selected particle wall/EOS/kernel/initialization accuracy | focused + numerical integration | representative native CPU production path / automated | Particle + geometry owners | pending — method-selection gates not executed | -| Q-S | Grid geometry/Stokes/transport flux/traction convergence | focused + numerical integration | representative native CPU production path / automated | Grid + geometry owners | pending — method-selection gates not executed | +| G1-C | Descriptor/actual attempt/profile/legacy binding and refusal | contract + integration | representative native CPU/archive fixtures / automated | Composition + recording owners | locally verified, hosted integration pending — PR131/34e2e73 repairs iteration counts; stage `9c04278` passes 23 workflow tests and independent complete-source/native/rational/packet review; [staged qualification](native-admission-20261020/qualification.md). Historical native/UI evidence remains bound to f6b7c8c. Separate `9a9904f` again passes 23 workflow tests; the old advection-cancellation label defect remains historical in those fixed subjects. PR137/70da36d repairs it; separate clean stage `186dc0a` passes all 85 library contracts, including 26 workflow/cold-custody checks. Current local outcome-label repair is verified; hosted integration remains pending | +| G1-U | Live→evidence→cancel→cold workflow inspection with pointer/keyboard | user-workflow | representative supported native display/graphics / automated or recorded manual | Desktop + verification owners | satisfied for recorded dummy-Xorg/software-GLX/evdev environment at f6b7c8c; actual workflow and 11 focused UI cases, independent review; [qualification](g1-qualification.md) | +| C1-R | Stage/subgraph/family replacement/rollback/provenance | contract + integration; external runtime system where used | representative CPU + actual supervised process fixture / automated | Provider + Session owners | pending overall — C1-A bounded adapters locally qualified at ac6ed17 ([qualification](c1a-qualification.md)); C1-B1 supplied-array foundation is locally qualified in draft PR128 (source f161d1a/evidence43a084a); PR136/e56bc7b plus PR137/d3e6237 pass separate 140-input admission and fresh qualification at `186dc0a` ([result](c1b2-admission-20261020/qualification.md)), within closed native Session/custody only; final PR140/5dc1741 reports 227 passing/5 existing ignored executions for separate closed C1-B3 selection (core4af3802/consumer9ddf8d2), retaining the earlier failure/repair; separate clean `3b3b667` passes complete 140-input admission and fresh native/rational/packet plus 228 focused contracts ([result](c1b3-admission-20261020/qualification.md)); it remains excluded from 186dc0a and exact-head hosted gates remain pending; full subgraph/whole-family candidates, transfers and C1-R remain unaccepted | +| P-W | Selected particle wall/EOS/kernel/initialization accuracy | focused + numerical integration | representative native CPU production path / automated | Particle + geometry owners | pending — the bounded P1 candidates were evaluated and not production-admitted; frozen failures remain; no selected particle production method | +| Q-S | Grid geometry/Stokes/transport flux/traction convergence | focused + numerical integration | representative native CPU production path / automated | Grid + geometry owners | pending — Q1 dfcc693 delivered periodic support and an incomplete accuracy campaign; n64 source exhaustion/Full refusals retained; Q2 version-2 failures remain retained; PR132 repairs the fixed-corpus topology artifacts and PR134 supplies eight aligned coupled-algebra cases at their own tested sources. Separate build-input stage `9a9904f` passes native/rational/packet and 83 focused tests ([result](https://github.com/MrScripty/Rheon/blob/a6bfcc94481b1bafbe61be804a1abc3426927bbd/docs/plans/fluid-accuracy-composition/reports/q2-admission-20261020/qualification.md)); separate PR135/4f8bd22 qualifies only bounded CV1 operators/physical traces at source `6d99e77`. Original mass condition 6.53e11 remains; later PR139/902f609 reports the bounded fixed 24-case CV2 static conditioning/coupled-solve gate satisfied at source `b0a9d52`, with independent R1/R2 comparisons. Generic stability/PDE/evolving-geometry and full transport acceptance remain unsatisfied | | Q-E | Capillary and wall work correctness | numerical integration | representative native CPU admitted family / automated | Physics owner | pending — production Deferred/unimplemented | | V1-X | Agreement with independent water/obstacle experiment | integration — scientific observation comparison | required-real retained observations + representative native solver / automated analysis and independent review | Scientific verification owner | blocked — specified V1 inputs/support only | +PR138's lead-authorized preliminary composition with frozen PR142 `dbd49d3` +retains every non-Cargo selected identity in that reviewed 152-path closure. +Fresh complete-source admission, native/rational/real-packet and fixed affected +contract checks are pending in [its protocol](pr138-integration-20261021/protocol.md). +The historical Q2 scientific results and later C1/CV dispositions above remain +source-bound. No combined-source or merged-main qualification is claimed yet; +final readiness requires verified dependency integration and the lead's merge. + +The long-term order is existing voxel/grid qualification, then a particle solver and particle-to-surface reconstruction, then a later Lagrangian finite-element-style family. The future surface output and material volume/connectivity mesh are distinct contracts; neither future phase is implemented or qualified by this register. + No CUDA, release-artifact or arbitrary native/browser parity claim is selected by P0. A later shipped release adds release-artifact checks appropriate to its actual packaging contract. Keep this register synchronized at slice acceptance, not at every commit. ## G1 native workflow inspection @@ -31,7 +41,7 @@ Required automated checks: descriptor canonical ordering/digest stable for ident Use existing real-egui pointer/keyboard event helpers plus a native application interaction test. Actual smoke: isolated temporary state → start fixture run → open live workflow → select node with pointer and keyboard → inspect units/residual/actual provider/fallback → change accepted interval → open evidence → Cancel/Close → cold reopen archived run with provider executable unavailable → inspect same descriptor/receipts and exit. All assertions must pass; record display/session, sandbox, graphics/software rendering, resource bounds and process cleanup. Headless paint/startup-only/screenshots cannot substitute. Gate keyboard controls, visible focus, semantic labels/text list, non-color status and readable zoom; do not claim universal accessibility compliance from these checks. Proposed overhead budget: descriptor ≤1 MiB, node summaries ≤256 nodes/interval, capture+projection ≤5% median interval overhead on the same CPU fixture (30 paired intervals after warmup), bounded-memory cold inspection with no per-pair trace. If hardware timing uncertainty dominates, report unresolved budget and investigate before admission. -The HTML design aid has a separate browser check only. Native graph acceptance is still open. A future custom-browser consumer must pass equivalent bounded-data, keyboard, stale-source and receipt tests in an actual browser; native external-process/SQLite/import features remain outside that browser claim. +The HTML design aid has a separate browser check only. G1 native acceptance is now qualified in [the implementation report](g1-qualification.md); the criteria above remain unchanged. A future custom-browser consumer must pass equivalent bounded-data, keyboard, stale-source and receipt tests in an actual browser; native external-process/SQLite/import features remain outside that browser claim. ## Replacement contract gates diff --git a/examples/grid_coupled_reference.rs b/examples/grid_coupled_reference.rs new file mode 100644 index 00000000..f4bd9983 --- /dev/null +++ b/examples/grid_coupled_reference.rs @@ -0,0 +1,520 @@ +//! Tiny aligned coupled M/B/S/W reference v1; no production/cut/free-surface claim. +use rheon::{ + AlignedStrain, Axis, GridGeometry, StaticObstacleGeometry, SurfaceSettings, SurfaceStamp, + TriangleSurface, +}; +use std::{error::Error, io::Write, path::Path}; +type Matrix = Vec>; +fn axis(a: Axis) -> usize { + match a { + Axis::X => 0, + Axis::Y => 1, + Axis::Z => 2, + } +} +#[derive(Clone, Copy)] +struct Fixture { + name: &'static str, + n: [u64; 3], + h: [f64; 3], + origin: [f64; 3], + lo: [usize; 3], + hi: [usize; 3], +} +fn fixtures() -> [Fixture; 2] { + [ + Fixture { + name: "unit", + n: [3; 3], + h: [1.0; 3], + origin: [0.0; 3], + lo: [1; 3], + hi: [2; 3], + }, + Fixture { + name: "anisotropic", + n: [3, 4, 3], + h: [0.5, 0.75, 1.25], + origin: [-0.5, 0.25, -1.0], + lo: [1; 3], + hi: [2, 3, 2], + }, + ] +} +fn owner(f: Fixture) -> Result> { + let lo: [f64; 3] = std::array::from_fn(|d| f.origin[d] + f.lo[d] as f64 * f.h[d]); + let hi: [f64; 3] = std::array::from_fn(|d| f.origin[d] + f.hi[d] as f64 * f.h[d]); + let mesh = TriangleSurface::new( + SurfaceStamp { + id: 132, + version: 1, + }, + (0..8) + .map(|c| std::array::from_fn(|d| if c & (1 << d) == 0 { lo[d] } else { hi[d] })) + .collect(), + vec![ + [0, 2, 3], + [0, 3, 1], + [4, 5, 7], + [4, 7, 6], + [0, 1, 5], + [0, 5, 4], + [2, 6, 7], + [2, 7, 3], + [0, 4, 6], + [0, 6, 2], + [1, 3, 7], + [1, 7, 5], + ], + SurfaceSettings::default(), + )?; + Ok(StaticObstacleGeometry::new( + GridGeometry::new(f.n, f.h, f.origin)?, + mesh, + 16_000_000, + |_, _| false, + )?) +} +fn zero(n: usize, m: usize) -> Matrix { + vec![vec![0.0; m]; n] +} +fn action(a: &Matrix, x: &[f64]) -> Vec { + a.iter() + .map(|r| r.iter().zip(x).map(|(v, x)| v * x).sum()) + .collect() +} +/// Direct partial-pivoted tiny reference, with no small-pivot floor. +fn solve(a: &Matrix, b: &[f64]) -> Result, String> { + let n = b.len(); + if n == 0 + || n > 256 + || a.len() != n + || a.iter().any(|r| r.len() != n) + || a.iter().flatten().chain(b).any(|x| !x.is_finite()) + { + return Err("finite square tiny system required".into()); + } + let mut rows = a.clone(); + for (r, v) in rows.iter_mut().zip(b) { + r.push(*v); + } + for k in 0..n { + let p = (k..n) + .max_by(|&i, &j| rows[i][k].abs().total_cmp(&rows[j][k].abs())) + .unwrap(); + if rows[p][k] == 0.0 { + return Err("singular coupled reference; no pivot floor".into()); + } + rows.swap(k, p); + let pivot = rows[k][k]; + for x in &mut rows[k][k..] { + *x /= pivot; + } + let basis = rows[k].clone(); + for (i, row) in rows.iter_mut().enumerate() { + if i != k { + let factor = row[k]; + for (x, p) in row[k..].iter_mut().zip(&basis[k..]) { + *x -= factor * p; + } + } + } + if rows.iter().flatten().any(|x| !x.is_finite()) { + return Err("nonfinite direct elimination".into()); + } + } + Ok(rows.iter().map(|r| r[n]).collect()) +} +struct System { + cells: Vec, + gauges: Vec, + b: Matrix, + k: Matrix, + a: Matrix, + coupled: Matrix, + old: Vec, + mass: Vec, + free_pressure: Vec, +} +fn assemble(s: &AlignedStrain<'_>, dt: f64) -> Result { + if !dt.is_finite() || dt <= 0.0 { + return Err("positive finite dt required".into()); + } + let g = s.geometry(); + let cells: Vec<_> = g + .fluid_volumes() + .iter() + .enumerate() + .filter_map(|(i, v)| (*v > 0.0).then_some(i)) + .collect(); + let mut map = vec![usize::MAX; g.fluid_volumes().len()]; + for (i, &c) in cells.iter().enumerate() { + map[c] = i; + } + let mut gauges = vec![usize::MAX; g.component_count()]; + for (i, &c) in cells.iter().enumerate() { + let label = g.component_labels()[c]; + if label >= gauges.len() { + return Err("invalid component label".into()); + } + gauges[label] = gauges[label].min(i); + } + if gauges.is_empty() || gauges.contains(&usize::MAX) { + return Err("missing pressure component".into()); + } + let nv = s.active_faces().len(); + if nv + cells.len() - gauges.len() > 256 { + return Err("tiny coupled reference dimension limit".into()); + } + let mut b = zero(cells.len(), nv); + let mut mass = Vec::with_capacity(nv); + let mut old = Vec::with_capacity(nv); + for (j, f) in s.active_faces().iter().enumerate() { + if !f.mass.is_finite() + || f.mass <= 0.0 + || map[f.negative_cell] == usize::MAX + || map[f.positive_cell] == usize::MAX + || g.component_labels()[f.negative_cell] != g.component_labels()[f.positive_cell] + { + return Err("invalid active mass/incidence".into()); + } + b[map[f.negative_cell]][j] = f.area; + b[map[f.positive_cell]][j] = -f.area; + mass.push(f.mass); + let [x, y, z] = f.position; + let d = axis(f.axis) as f64; + old.push( + (0.7 * x - 0.4 * y + 0.3 * z + 0.2 * d).sin() + + 0.25 * (x + 0.6 * y - 0.2 * z + 0.4 * d).cos(), + ); + } + let mut k = zero(nv, nv); + for row in s.rows() { + let w = s.viscosity() * row.weight; + if !w.is_finite() || w < 0.0 { + return Err("invalid strain weight".into()); + } + for p in row.terms() { + for q in row.terms() { + k[p.active][q.active] += w * p.coefficient * q.coefficient; + } + } + } + let mut a = k.clone(); + for (i, row) in a.iter_mut().enumerate() { + row[i] += mass[i] / dt; + } + let free_pressure: Vec<_> = (0..cells.len()).filter(|i| !gauges.contains(i)).collect(); + let mut coupled = zero(nv + free_pressure.len(), nv + free_pressure.len()); + for (i, row) in a.iter().enumerate() { + coupled[i][..nv].copy_from_slice(row); + } + for (q, &c) in free_pressure.iter().enumerate() { + for (j, &value) in b[c].iter().enumerate() { + coupled[j][nv + q] = -value; + coupled[nv + q][j] = -value; + } + } + if coupled.iter().flatten().any(|x| !x.is_finite()) { + return Err("nonfinite coupled assembly".into()); + } + Ok(System { + cells, + gauges, + b, + k, + a, + coupled, + old, + mass, + free_pressure, + }) +} +struct ResultRow { + momentum: f64, + continuity: f64, + work: f64, + corrected_work: f64, + residual_work_bound: f64, + old_energy: f64, + energy: f64, + dissipation: f64, + pressure_work: f64, +} +fn run(root: &Path, f: Fixture, rho: f64, mu: f64, dt: f64) -> Result> { + std::fs::create_dir(root)?; + let g = owner(f)?; + let s = AlignedStrain::new(&g, rho, mu, 16_000_000, |_, _| false)?; + let system = assemble(&s, dt)?; + let nv = system.mass.len(); + let mut rhs: Vec<_> = system + .mass + .iter() + .zip(&system.old) + .map(|(m, u)| m * u / dt) + .collect(); + rhs.resize(system.coupled.len(), 0.0); + let solved = solve(&system.coupled, &rhs)?; + let u = &solved[..nv]; + let mut p = vec![0.0; system.cells.len()]; + for (q, &c) in system.free_pressure.iter().enumerate() { + p[c] = solved[nv + q]; + } + let ku = action(&system.k, u); + let flux = action(&system.b, u); + if flux.iter().any(|v| !v.is_finite()) { + return Err("nonfinite full cell flux".into()); + } + let mut r = vec![0.0; nv]; + let mut momentum: f64 = 0.0; + let lref = 1.0; + let uref = 1.0; + let pref = rho * uref * lref / dt + mu * uref / lref; + for (i, ri) in r.iter_mut().enumerate() { + let pressure: f64 = system.b.iter().zip(&p).map(|(b, p)| b[i] * p).sum(); + *ri = system.mass[i] * (u[i] - system.old[i]) / dt + ku[i] - pressure; + let scale = system.mass[i] * uref / dt + + system.k[i].iter().map(|x| x.abs() * uref).sum::() + + system.b.iter().map(|b| b[i].abs() * pref).sum::(); + if !ri.is_finite() || !scale.is_finite() || scale <= 0.0 { + return Err("nonfinite momentum residual or invalid scale".into()); + } + momentum = momentum.max(ri.abs() / scale); + } + if system.b.iter().any(|row| { + let scale = row.iter().map(|x| x.abs()).sum::(); + !scale.is_finite() || scale <= 0.0 + }) { + return Err("unsupported isolated pressure row or invalid flux scale".into()); + } + let continuity = flux + .iter() + .zip(&system.b) + .map(|(v, b)| v.abs() / (b.iter().map(|x| x.abs()).sum::() * uref)) + .fold(0.0_f64, f64::max); + let e = |v: &[f64]| { + system + .mass + .iter() + .zip(v) + .map(|(m, x)| 0.5 * m * x * x) + .sum::() + }; + let energy = e(u); + let old_energy = e(&system.old); + let delta: Vec<_> = u.iter().zip(&system.old).map(|(x, y)| x - y).collect(); + let dissipation: f64 = u.iter().zip(&ku).map(|(u, k)| u * k).sum(); + let pressure_work: f64 = p.iter().zip(&flux).map(|(p, b)| p * b).sum(); + let residual_work: f64 = u.iter().zip(&r).map(|(u, r)| u * r).sum(); + let echar = system.mass.iter().sum::() * uref * uref / 2.0; + let defect = energy - old_energy + e(&delta) + dt * dissipation; + let work = defect.abs() / echar; + let corrected_work = (defect - dt * (pressure_work + residual_work)).abs() / echar; + let residual_work_bound = dt + * (p.iter().zip(&flux).map(|(p, b)| (p * b).abs()).sum::() + + u.iter().zip(&r).map(|(u, r)| (u * r).abs()).sum::()) + / echar; + let mut meta = std::io::BufWriter::new(std::fs::File::create(root.join("meta.csv"))?); + writeln!( + meta, + "key,value\nfixture,{}\nrho,{rho:.17e}\nmu,{mu:.17e}\ndt,{dt:.17e}\nnv,{nv}\nnc,{}\nns,{}\ncomponents,{}", + f.name, + system.cells.len(), + s.rows().len(), + g.component_count() + )?; + for d in 0..3 { + writeln!( + meta, + "n{d},{}\nh{d},{:.17e}\norigin{d},{:.17e}\nlo{d},{}\nhi{d},{}", + f.n[d], f.h[d], f.origin[d], f.lo[d], f.hi[d] + )?; + } + meta.flush()?; + let mut faces = std::io::BufWriter::new(std::fs::File::create(root.join("faces.csv"))?); + writeln!( + faces, + "active,axis,face,i,j,k,x,y,z,negative,positive,area,distance,mass,old,u" + )?; + for (i, v) in s.active_faces().iter().enumerate() { + writeln!( + faces, + "{i},{},{},{},{},{},{:.17e},{:.17e},{:.17e},{},{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + axis(v.axis), + v.face, + v.coordinates[0], + v.coordinates[1], + v.coordinates[2], + v.position[0], + v.position[1], + v.position[2], + v.negative_cell, + v.positive_cell, + v.area, + v.distance, + v.mass, + system.old[i], + u[i] + )?; + } + faces.flush()?; + let mut cells = std::io::BufWriter::new(std::fs::File::create(root.join("cells.csv"))?); + writeln!(cells, "cell,volume,label,pressure_index,gauge,p")?; + for (c, &v) in g.fluid_volumes().iter().enumerate() { + let index = system.cells.iter().position(|&i| i == c); + let label = if v > 0.0 { + g.component_labels()[c].to_string() + } else { + "solid".into() + }; + writeln!( + cells, + "{c},{v:.17e},{label},{},{},{:.17e}", + index.map_or_else(String::new, |i| i.to_string()), + index.is_some_and(|i| system.gauges.contains(&i)), + index.map_or(0.0, |i| p[i]) + )?; + } + cells.flush()?; + let mut rows = std::io::BufWriter::new(std::fs::File::create(root.join("rows.csv"))?); + let mut terms = std::io::BufWriter::new(std::fs::File::create(root.join("terms.csv"))?); + writeln!(rows, "row,a,b,i,j,k,quadrant,boundary,weight")?; + writeln!(terms, "row,active,coefficient")?; + for (i, row) in s.rows().iter().enumerate() { + writeln!( + rows, + "{i},{},{},{},{},{},{},{:?},{:.17e}", + axis(row.axes[0]), + axis(row.axes[1]), + row.coordinates[0], + row.coordinates[1], + row.coordinates[2], + row.quadrant, + row.boundary, + row.weight + )?; + for t in row.terms() { + writeln!(terms, "{i},{},{:.17e}", t.active, t.coefficient)?; + } + } + rows.flush()?; + terms.flush()?; + let mut matrices = std::io::BufWriter::new(std::fs::File::create(root.join("matrices.csv"))?); + writeln!(matrices, "block,row,column,value")?; + for (name, m) in [ + ("B", &system.b), + ("K", &system.k), + ("A", &system.a), + ("coupled", &system.coupled), + ] { + for (i, row) in m.iter().enumerate() { + for (j, v) in row.iter().enumerate() { + writeln!(matrices, "{name},{i},{j},{v:.17e}")?; + } + } + } + matrices.flush()?; + let values = [ + momentum, + continuity, + work, + corrected_work, + residual_work_bound, + energy, + old_energy, + dissipation, + pressure_work, + ]; + if values.iter().any(|v| !v.is_finite()) + || momentum > 1e-10 + || continuity > 1e-10 + || work > 1e-10 + || corrected_work > 1e-10 + || residual_work_bound > 1e-10 + || dissipation < 0.0 + || energy > old_energy + 1e-10 * echar + { + return Err("fixed coupled residual/work gate failed".into()); + } + Ok(ResultRow { + momentum, + continuity, + work, + corrected_work, + residual_work_bound, + old_energy, + energy, + dissipation, + pressure_work, + }) +} +fn main() -> Result<(), Box> { + let arg = std::env::args_os() + .nth(1) + .ok_or("fresh output root required")?; + let root = Path::new(&arg); + std::fs::create_dir(root)?; + let mut summary = std::io::BufWriter::new(std::fs::File::create(root.join("summary.csv"))?); + writeln!( + summary, + "fixture,rho,mu,dt,momentum,continuity,work,corrected_work,residual_work_bound,old_energy,energy,dissipation,pressure_work" + )?; + for f in fixtures() { + for (rho, mu) in [(1.0, 0.1), (998.206, 0.001002)] { + for dt in [0.125, 1.0] { + let tag = format!("{}-rho{rho}-dt{dt}", f.name); + let r = run(&root.join(&tag), f, rho, mu, dt).map_err(|e| format!("{tag}: {e}"))?; + writeln!( + summary, + "{},{rho:.17e},{mu:.17e},{dt:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + f.name, + r.momentum, + r.continuity, + r.work, + r.corrected_work, + r.residual_work_bound, + r.old_energy, + r.energy, + r.dissipation, + r.pressure_work + )?; + eprintln!( + "coupled {tag}: momentum={:.3e}, continuity={:.3e}, work={:.3e}", + r.momentum, r.continuity, r.work + ); + } + } + } + summary.flush()?; + Ok(()) +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn pivoting_and_singular_refusal() { + assert_eq!( + solve(&vec![vec![0.0, 1.0], vec![1.0, 0.0]], &[2.0, 3.0]).unwrap(), + vec![3.0, 2.0] + ); + assert!(solve(&vec![vec![1.0, 1.0], vec![1.0, 1.0]], &[1.0, 1.0]).is_err()); + assert!(solve(&vec![vec![f64::NAN]], &[0.0]).is_err()); + } + #[test] + fn assembly_is_coupled_and_all_component_fluxes_cancel() { + let g = owner(fixtures()[0]).unwrap(); + let s = AlignedStrain::new(&g, 1.0, 0.1, 16_000_000, |_, _| false).unwrap(); + let a = assemble(&s, 0.125).unwrap(); + assert!(assemble(&s, 0.0).is_err()); + assert_eq!(a.gauges.len(), g.component_count()); + for j in 0..a.mass.len() { + assert_eq!(a.b.iter().map(|r| r[j]).sum::(), 0.0); + } + assert_eq!( + a.coupled.len(), + a.mass.len() + a.cells.len() - a.gauges.len() + ); + let nv = a.mass.len(); + assert!((0..nv).any(|j| a.coupled[j][nv] != 0.0)); + } +} diff --git a/examples/grid_cut_coupled_reference.rs b/examples/grid_cut_coupled_reference.rs new file mode 100644 index 00000000..501f936f --- /dev/null +++ b/examples/grid_cut_coupled_reference.rs @@ -0,0 +1,181 @@ +//! CV2 static planar coupled reference; no PDE/production admission. +#[allow(dead_code)] +mod grid_cut_variational_reference { + #[path = "../grid_cut_variational_reference/assembly.rs"] + pub mod assembly; + #[path = "../grid_cut_variational_reference/basis.rs"] + pub mod basis; + #[path = "../grid_cut_variational_reference/clip.rs"] + pub mod clip; + #[path = "../grid_geometry_reference/exact.rs"] + pub mod exact; + #[path = "../grid_cut_variational_reference/export.rs"] + pub mod export; + #[path = "../grid_geometry_reference/geometry.rs"] + pub mod geometry; + #[path = "../grid_cut_variational_reference/observe.rs"] + pub mod observe; + #[path = "../grid_cut_variational_reference/trace.rs"] + pub mod trace; +} +mod grid_cut_coupled_reference { + pub mod experiment; + pub mod solver; +} +use grid_cut_variational_reference::{ + assembly::Operators, export, geometry::Polygon, observe::Report, trace::Traces, +}; +use std::{io::Write, path::Path}; +const RHO: f64 = 1.0; +const MU: f64 = 0.1; +const GATE: f64 = 1e-10; +struct Fixture { + name: &'static str, + n: usize, + origin: [f64; 2], + extent: f64, + vertices: Vec<[f64; 2]>, +} +fn fixtures() -> Vec { + let (s, c) = 17.0_f64.to_radians().sin_cos(); + let square = [[-0.15, -0.15], [0.15, -0.15], [0.15, 0.15], [-0.15, 0.15]] + .into_iter() + .map(|[x, y]| [0.537 + c * x - s * y, 0.479 + s * x + c * y]) + .collect(); + let disk = (0..64) + .map(|k| { + let t = std::f64::consts::TAU * k as f64 / 64.0; + [0.75 * t.cos(), 0.75 * t.sin()] + }) + .collect(); + vec![ + Fixture { + name: "rectangle", + n: 4, + origin: [0.0, 0.0], + extent: 1.0, + vertices: vec![[0.17, 0.23], [0.83, 0.23], [0.83, 0.79], [0.17, 0.79]], + }, + Fixture { + name: "square-17", + n: 8, + origin: [0.0, 0.0], + extent: 1.0, + vertices: square, + }, + Fixture { + name: "disk-64", + n: 8, + origin: [-1.0, -1.0], + extent: 2.0, + vertices: disk, + }, + Fixture { + name: "corner-triangle", + n: 4, + origin: [-1.0, -1.0], + extent: 4.0, + vertices: vec![[0.81, 0.99], [0.99, 0.81], [0.99, 0.99]], + }, + ] +} +fn run_fixture( + root: &Path, + f: Fixture, + operators: &mut impl Write, + summary: &mut impl Write, +) -> Result, Box> { + let operator_root = root.join("operators").join(f.name); + std::fs::create_dir(&operator_root)?; + export::inputs(&operator_root, &f.vertices, f.n, f.origin, f.extent)?; + let op = Operators::build(f.n, f.origin, f.extent, Polygon::new(f.vertices)?)?; + let tr = Traces::build(&op)?; + let report = Report::new(&op, &tr)?; + export::all(&operator_root, &op, &tr, &report)?; + let worst = report.gates.values().copied().fold(0.0_f64, f64::max); + let status = if worst <= GATE { "passed" } else { "refused" }; + writeln!( + operators, + "{},{},{},{worst:.17e},{status}", + f.name, + op.active.len(), + op.cells.len() + )?; + operators.flush()?; + if worst > GATE { + return Err("immutable CV1 operator gate failed".into()); + } + let case_root = root.join("solves").join(f.name); + std::fs::create_dir(&case_root)?; + let mut failures = Vec::new(); + for dt in [0.125, 1.0] { + let dt_root = case_root.join(format!("dt-{dt}")); + std::fs::create_dir(&dt_root)?; + let factor = grid_cut_coupled_reference::experiment::assemble(&op, dt).and_then(|f| { + grid_cut_coupled_reference::experiment::factor_export(&dt_root, &f)?; + Ok(f) + }); + for scenario in ["unforced", "rigid", "affine"] { + let step = dt_root.join(scenario); + std::fs::create_dir(&step)?; + let result = match &factor { + Ok(f) => { + grid_cut_coupled_reference::experiment::run(&step, &op, &tr, f, dt, scenario) + } + Err(e) => Err(e.clone()), + }; + match result { + Ok(w) => { + writeln!(summary, "{},{dt},{scenario},{w:.17e},passed", f.name)?; + println!("{}/dt{dt}/{scenario}: native_gate={w:.17e}", f.name); + } + Err(e) => { + let e = format!("{}/dt{dt}/{scenario}: {e}", f.name); + std::fs::write(step.join("refusal.txt"), &e)?; + eprintln!("{e}"); + failures.push(e); + writeln!(summary, "{},{dt},{scenario},,refused", f.name)?; + } + } + summary.flush()?; + } + } + Ok(failures) +} +fn main() -> Result<(), Box> { + let out = std::env::args_os() + .nth(1) + .ok_or("fresh output directory required")?; + let root = Path::new(&out); + std::fs::create_dir(root)?; + std::fs::create_dir(root.join("operators"))?; + std::fs::create_dir(root.join("solves"))?; + let mut operators = + std::io::BufWriter::new(std::fs::File::create(root.join("operators/summary.csv"))?); + writeln!( + operators, + "case,active,pressure_cells,worst_fixed_gate,status" + )?; + let mut summary = std::io::BufWriter::new(std::fs::File::create(root.join("summary.csv"))?); + writeln!(summary, "case,dt,scenario,worst_native_gate,status")?; + let mut failures = Vec::new(); + for f in fixtures() { + let name = f.name; + match run_fixture(root, f, &mut operators, &mut summary) { + Ok(errors) => failures.extend(errors), + Err(e) => { + let e = format!("{name}: {e}"); + std::fs::write(root.join(format!("{name}-refusal.txt")), &e)?; + eprintln!("{e}"); + failures.push(e); + } + } + } + operators.flush()?; + summary.flush()?; + if failures.is_empty() { + Ok(()) + } else { + Err(failures.join("\n").into()) + } +} diff --git a/examples/grid_cut_coupled_reference/experiment.rs b/examples/grid_cut_coupled_reference/experiment.rs new file mode 100644 index 00000000..2dbb02e5 --- /dev/null +++ b/examples/grid_cut_coupled_reference/experiment.rs @@ -0,0 +1,463 @@ +use super::super::{ + GATE, MU, RHO, + grid_cut_variational_reference::{ + assembly::{Matrix, Operators, zero}, + basis::{affine, work_vectors}, + trace::Traces, + }, +}; +use super::solver::{self, Factor, action, dot}; +use std::{ + collections::BTreeMap, + fs::File, + io::{BufWriter, Write}, + path::Path, +}; +fn writer(root: &Path, name: &str, header: &str) -> Result, String> { + let mut w = BufWriter::new(File::create(root.join(name)).map_err(|e| e.to_string())?); + writeln!(w, "{header}").map_err(|e| e.to_string())?; + Ok(w) +} +fn finite(v: f64) -> Result { + if v.is_finite() { + Ok(v) + } else { + Err("nonfinite physical observation".into()) + } +} +fn scaled(v: f64, s: f64) -> Result { + if !s.is_finite() || s <= 0.0 { + return Err("nonpositive fixed normalization".into()); + } + finite(v.abs() / s) +} +fn norm(a: &Matrix) -> Result { + let mut maximum = 0.0_f64; + for row in a { + if row.iter().any(|v| !v.is_finite()) { + return Err("nonfinite matrix norm entry".into()); + } + let sum = row.iter().map(|x| x.abs()).sum::(); + if !sum.is_finite() { + return Err("nonfinite matrix norm row sum".into()); + } + maximum = maximum.max(sum); + } + Ok(maximum) +} +pub fn assemble(op: &Operators, dt: f64) -> Result { + if !dt.is_finite() || dt <= 0.0 { + return Err("positive finite dt required".into()); + } + let a = op + .mass + .iter() + .zip(&op.stiffness) + .map(|(m, k)| m.iter().zip(k).map(|(m, k)| m / dt + k).collect()) + .collect(); + Factor::new(a, op.divergence.clone()) +} +pub fn factor_export(root: &Path, f: &Factor) -> Result<(), String> { + let mut w = writer(root, "factors.csv", "block,row,column,value")?; + for (name, m) in [ + ("A", &f.a), + ("scaled_A", &f.scaled_a), + ("L", &f.l), + ("Y", &f.y), + ("Z", &f.z), + ("Q", &f.q), + ("R", &f.r), + ] { + for (i, row) in m.iter().enumerate() { + for (j, v) in row.iter().enumerate() { + writeln!(w, "{name},{i},{j},{v:.17e}").map_err(|e| e.to_string())?; + } + } + } + for (name, v) in [("D", &f.d), ("E", &f.e)] { + for (i, x) in v.iter().enumerate() { + writeln!(w, "{name},{i},0,{x:.17e}").map_err(|e| e.to_string())?; + } + } + w.flush().map_err(|e| e.to_string())?; + let n = f.d.len(); + let m = f.e.len(); + let mut le = zero(n, n); + let mut sym = zero(n, n); + for i in 0..n { + for j in 0..n { + le[i][j] = dot(&f.l[i], &f.l[j]); + sym[i][j] = f.scaled_a[i.max(j)][i.min(j)]; + le[i][j] -= sym[i][j]; + } + } + let mut qe = zero(n, m); + for (i, row) in qe.iter_mut().enumerate() { + for (j, v) in row.iter_mut().enumerate() { + let col: Vec<_> = f.r.iter().map(|r| r[j]).collect(); + *v = dot(&f.q[i], &col) - f.z[i][j]; + } + } + let mut orth = zero(m, m); + for (i, row) in orth.iter_mut().enumerate() { + for (j, v) in row.iter_mut().enumerate() { + let qi: Vec<_> = f.q.iter().map(|r| r[i]).collect(); + let qj: Vec<_> = f.q.iter().map(|r| r[j]).collect(); + *v = dot(&qi, &qj) - if i == j { 1.0 } else { 0.0 }; + } + } + let gates = [ + ("cholesky_relative_inf", scaled(norm(&le)?, norm(&sym)?)?), + ("qr_relative_inf", scaled(norm(&qe)?, norm(&f.z)?)?), + ("q_orthogonality_inf", norm(&orth)?), + ]; + let mut w = writer(root, "factor-metrics.csv", "name,value")?; + for (k, v) in gates { + writeln!(w, "{k},{v:.17e}").map_err(|e| e.to_string())?; + } + w.flush().map_err(|e| e.to_string())?; + if gates.iter().any(|(_, v)| *v > GATE) { + return Err("fixed factor identity gate failed".into()); + } + Ok(()) +} +pub fn run( + root: &Path, + op: &Operators, + tr: &Traces, + factor: &Factor, + dt: f64, + scenario: &str, +) -> Result { + let n = op.active.len(); + let m = op.cells.len(); + let pref = RHO / dt + MU; + let star: Vec<_> = op + .active + .iter() + .map(|p| match scenario { + "unforced" => work_vectors(p)[1], + "rigid" => { + if p.axis == 0 { + 0.3 - p.point[1] + } else { + -0.2 + p.point[0] + } + } + "affine" => affine(p), + _ => unreachable!(), + }) + .collect(); + let sigma = if scenario == "affine" { + [MU * 0.5 - 2.0, MU * (0.75 - 0.2), -MU * 0.5 - 2.0] + } else { + [0.0; 3] + }; + let load: Vec<_> = tr.gradient.iter().map(|g| dot(g, &sigma)).collect(); + let mass_star = action(&op.mass, &star); + let rhs: Vec<_> = mass_star + .iter() + .zip(&load) + .map(|(v, l)| v / dt + l) + .collect(); + let mut meta = writer(root, "input.csv", "key,value")?; + for (k, v) in [ + ("dt", dt), + ("rho", RHO), + ("mu", MU), + ("Uref", 1.0), + ("Lref", 1.0), + ("Href", 1.0), + ("Pref", pref), + ("grad_xx", 0.25), + ("grad_xy", 0.75), + ("grad_yx", -0.2), + ("grad_yy", -0.25), + ("offset_x", 0.1), + ("offset_y", -0.3), + ("rigid_offset_x", 0.3), + ("rigid_offset_y", -0.2), + ("pressure", 2.0), + ("sigma_xx", sigma[0]), + ("sigma_xy", sigma[1]), + ("sigma_yy", sigma[2]), + ] { + writeln!(meta, "{k},{v:.17e}").map_err(|e| e.to_string())?; + } + writeln!( + meta, + "scenario,{scenario}\nmethod,scaled-Cholesky-QR-refinement3\npressure_gauge,none" + ) + .map_err(|e| e.to_string())?; + meta.flush().map_err(|e| e.to_string())?; + let mut inputs = writer(root, "vectors.csv", "index,star,load,rhs")?; + for i in 0..n { + writeln!( + inputs, + "{i},{:.17e},{:.17e},{:.17e}", + star[i], load[i], rhs[i] + ) + .map_err(|e| e.to_string())?; + } + inputs.flush().map_err(|e| e.to_string())?; + let mut states = writer( + root, + "states.csv", + "method,iteration,kind,index,value,original_residual", + )?; + let mut kkt = zero(n + m, n + m); + for (i, row) in kkt.iter_mut().take(n).enumerate() { + row[..n].copy_from_slice(&factor.a[i]); + for c in 0..m { + row[n + c] = -factor.b[c][i]; + } + } + for (c, row) in kkt.iter_mut().skip(n).enumerate() { + for (i, value) in row.iter_mut().take(n).enumerate() { + *value = -factor.b[c][i]; + } + } + let mut combined = rhs.clone(); + combined.resize(n + m, 0.0); + match solver::baseline(&kkt, &combined) { + Ok(x) => write_state(&mut states, "baseline", 0, &x[..n], &x[n..], factor, &rhs)?, + Err(e) => { + std::fs::write(root.join("baseline-refusal.txt"), e).map_err(|e| e.to_string())? + } + } + let (u, p) = factor.refined(&rhs, |i, (u, p)| { + write_state(&mut states, "selected", i, u, p, factor, &rhs) + })?; + states.flush().map_err(|e| e.to_string())?; + let (u, p) = (&u, &p); + let delta: Vec<_> = u.iter().zip(&star).map(|(u, v)| u - v).collect(); + let md = action(&op.mass, &delta); + let ku = action(&op.stiffness, u); + let bu = action(&op.divergence, u); + let mut physical_r = vec![0.0; n]; + let mut gates = BTreeMap::new(); + let mut obs = BTreeMap::new(); + let mut mom = 0.0_f64; + for i in 0..n { + let bc: Vec<_> = op.divergence.iter().map(|r| r[i]).collect(); + physical_r[i] = dot(&[md[i] / dt, ku[i], -dot(&bc, p), -load[i]], &[1.0; 4]); + let denom = op.mass[i].iter().map(|x| x.abs()).sum::() / dt + + op.stiffness[i].iter().map(|x| x.abs()).sum::() + + bc.iter().map(|x| x.abs()).sum::() * pref + + load[i].abs(); + mom = mom.max(scaled(physical_r[i], denom)?); + } + gates.insert("physical_momentum_rows", mom); + let mut continuity = 0.0_f64; + let mut actual_flux = 0.0_f64; + let grid = action(&tr.grid, u); + let physical = action(&tr.physical, u); + for c in 0..m { + continuity = continuity.max(scaled( + bu[c], + op.divergence[c].iter().map(|v| v.abs()).sum(), + )?); + actual_flux = actual_flux.max(scaled(grid[c] + physical[c] - bu[c], op.layout.h)?); + actual_flux = actual_flux.max(scaled(grid[c] + physical[c], op.layout.h)?); + } + gates.insert("continuity_rows", continuity); + gates.insert("physical_closed_cell_flux", actual_flux); + let e = 0.5 * dot(u, &action(&op.mass, u)); + let old = 0.5 * dot(&star, &mass_star); + let echar = 0.5 * op.mass.iter().flatten().sum::(); + let dloss = 0.5 * dot(&delta, &md); + let diss = dot(u, &ku); + let boundary = dot(u, &load); + let pw = dot(p, &bu); + let rw = dot(u, &physical_r); + let raw = e - old + dloss + dt * diss - dt * boundary; + let corrected = raw - dt * pw - dt * rw; + let mut mtstar = vec![0.0; n]; + for (i, v) in mtstar.iter_mut().enumerate() { + let col: Vec<_> = op.mass.iter().map(|r| r[i]).collect(); + *v = dot(&col, &star); + } + let skew = 0.5 + * dot( + u, + &mass_star + .iter() + .zip(mtstar) + .map(|(a, b)| a - b) + .collect::>(), + ); + gates.insert("raw_work_balance", scaled(raw, echar)?); + gates.insert("residual_corrected_balance", scaled(corrected, echar)?); + gates.insert("skew_corrected_balance", scaled(corrected - skew, echar)?); + gates.insert( + "absolute_residual_work", + scaled( + dt * (p.iter().zip(&bu).map(|(p, b)| (p * b).abs()).sum::() + + u.iter() + .zip(&physical_r) + .map(|(u, r)| (u * r).abs()) + .sum::()), + echar, + )?, + ); + if scenario != "affine" { + gates.insert( + "unforced_energy_increase", + scaled((e - old).max(0.0), echar)?, + ); + } + gates.insert("negative_dissipation", scaled((-diss).max(0.0), MU)?); + let mut traced_work = 0.0; + for q in &tr.points { + if tr.records[q.record].kind != "global" { + continue; + } + let [nx, ny] = q.normal_weight; + let traction = [sigma[0] * nx + sigma[1] * ny, sigma[1] * nx + sigma[2] * ny]; + traced_work += q + .values + .iter() + .map(|&(i, phi)| u[i] * phi * traction[op.active[i].axis]) + .sum::(); + } + gates.insert( + "physical_boundary_work", + scaled(traced_work - boundary, 1.0)?, + ); + let mut global = 0.0_f64; + for d in 0..3 { + let moment: Vec<_> = op.moment.iter().map(|m| m[d]).collect(); + let w: Vec<_> = op + .active + .iter() + .map(|p| match d { + 0 => { + if p.axis == 0 { + 1.0 + } else { + 0.0 + } + } + 1 => { + if p.axis == 1 { + 1.0 + } else { + 0.0 + } + } + _ => { + if p.axis == 0 { + -p.point[1] + } else { + p.point[0] + } + } + }) + .collect(); + global = global.max(scaled(dot(&moment, &delta) - dt * dot(&w, &load), 1.0)?); + } + gates.insert("physical_linear_angular_momentum", global); + if scenario == "rigid" || scenario == "affine" { + let ue = u + .iter() + .zip(&star) + .map(|(u, s)| (u - s).abs()) + .fold(0.0_f64, f64::max); + let expected = if scenario == "affine" { 2.0 } else { 0.0 }; + let pe = p + .iter() + .map(|p| (p - expected).abs() / pref) + .fold(0.0_f64, f64::max); + gates.insert("analytic_velocity_coefficients", ue); + gates.insert("analytic_absolute_pressure", pe); + } + for (k, v) in [ + ("energy", e), + ("old_energy", old), + ("Echar", echar), + ("delta_energy", dloss), + ("dissipation", diss), + ("boundary_work", boundary), + ("trace_boundary_work", traced_work), + ("pressure_work", pw), + ("momentum_residual_work", rw), + ("mass_skew", skew), + ("raw_work", raw), + ("residual_corrected_work", corrected), + ] { + obs.insert(k, finite(v)?); + } + let worst = gates.values().copied().fold(0.0_f64, f64::max); + let mut metrics = writer(root, "metrics.csv", "name,value,gate")?; + for (k, v) in gates { + writeln!(metrics, "{k},{v:.17e},true").map_err(|e| e.to_string())?; + } + for (k, v) in obs { + writeln!(metrics, "{k},{v:.17e},false").map_err(|e| e.to_string())?; + } + metrics.flush().map_err(|e| e.to_string())?; + if worst > GATE { + return Err(format!( + "fixed native solve gate {worst:.17e} exceeds {GATE}" + )); + } + Ok(worst) +} +fn write_state( + w: &mut BufWriter, + method: &str, + iteration: usize, + u: &[f64], + p: &[f64], + f: &Factor, + rhs: &[f64], +) -> Result<(), String> { + let (ru, g) = f.residual(rhs, u, p); + // Lower KKT residual is +B*u; the correction solve takes g=-B*u. + let lower: Vec<_> = g.iter().map(|v| -v).collect(); + for (kind, v, residual) in [("velocity", u, &ru), ("pressure", p, &lower)] { + for (i, x) in v.iter().enumerate() { + writeln!( + w, + "{method},{iteration},{kind},{i},{x:.17e},{:.17e}", + residual[i] + ) + .map_err(|e| e.to_string())?; + } + } + w.flush().map_err(|e| e.to_string()) +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn invalid_dt_refuses_before_operator_arithmetic() { + let src = super::super::super::fixtures().remove(0); + let op = Operators::build( + src.n, + src.origin, + src.extent, + super::super::super::Polygon::new(src.vertices).unwrap(), + ) + .unwrap(); + assert!(assemble(&op, 0.0).err().unwrap().contains("dt")); + assert!(assemble(&op, f64::NAN).err().unwrap().contains("dt")); + } +} +#[cfg(test)] +mod finite_contract { + use super::*; + #[test] + fn nonfinite_matrix_norm_cannot_be_hidden_by_maximum() { + assert!( + norm(&vec![vec![f64::NAN], vec![1.0]]) + .unwrap_err() + .contains("entry") + ); + assert!( + norm(&vec![vec![f64::MAX, f64::MAX]]) + .unwrap_err() + .contains("row sum") + ); + } +} diff --git a/examples/grid_cut_coupled_reference/solver.rs b/examples/grid_cut_coupled_reference/solver.rs new file mode 100644 index 00000000..d2f2e22e --- /dev/null +++ b/examples/grid_cut_coupled_reference/solver.rs @@ -0,0 +1,389 @@ +//! Invertible scaling/QR factors; original full blocks remain the solve target. +use super::super::grid_cut_variational_reference::assembly::{Matrix, zero}; +pub type State = (Vec, Vec); +fn finite(values: impl Iterator) -> Result<(), String> { + if values.into_iter().any(|v| !v.is_finite()) { + Err("nonfinite solver arithmetic".into()) + } else { + Ok(()) + } +} +/// Compensated products and summation; no physics or pivot floor. +pub fn dot(a: &[f64], b: &[f64]) -> f64 { + let mut sum = 0.0_f64; + let mut correction = 0.0; + for (&x, &y) in a.iter().zip(b) { + let p = x * y; + let t = sum + p; + correction += if sum.abs() >= p.abs() { + (sum - t) + p + } else { + (p - t) + sum + }; + correction += x.mul_add(y, -p); + sum = t; + } + sum + correction +} +pub fn action(a: &Matrix, x: &[f64]) -> Vec { + a.iter().map(|r| dot(r, x)).collect() +} +fn validate(a: &Matrix) -> Result { + let n = a.len(); + if n == 0 || n > 544 || a.iter().any(|r| r.len() != n) { + return Err("bounded square matrix required".into()); + } + finite(a.iter().flatten().copied())?; + Ok(n) +} +pub fn cholesky(a: &Matrix) -> Result { + let n = validate(a)?; + let mut l = zero(n, n); + for i in 0..n { + for j in 0..=i { + let v = a[i][j] - dot(&l[i][..j], &l[j][..j]); + if i == j { + if !v.is_finite() || v <= 0.0 { + return Err(format!("nonpositive Cholesky pivot {i}; no floor")); + } + l[i][j] = v.sqrt(); + } else { + l[i][j] = v / l[j][j]; + } + } + } + finite(l.iter().flatten().copied())?; + Ok(l) +} +/// Upper R from a thin, unpivoted Householder QR of full-column-rank Z. +pub fn qr(z: &Matrix) -> Result { + let n = z.len(); + let m = z.first().map_or(0, Vec::len); + if m == 0 || m > n || n > 544 || z.iter().any(|r| r.len() != m) { + return Err("bounded tall QR matrix required".into()); + } + finite(z.iter().flatten().copied())?; + let mut a = z.clone(); + for k in 0..m { + let norm = (k..n).fold(0.0_f64, |v, i| v.hypot(a[i][k])); + if norm == 0.0 || !norm.is_finite() { + return Err(format!("zero QR pivot {k}; no rank deletion")); + } + let alpha = -norm.copysign(a[k][k]); + let first = a[k][k] - alpha; + if first == 0.0 || !first.is_finite() { + return Err("invalid Householder reflector".into()); + } + let mut v: Vec<_> = (k..n).map(|i| a[i][k] / first).collect(); + v[0] = 1.0; + let beta = 2.0 / dot(&v, &v); + let mut j = k + 1; + while j < m { + let col: Vec<_> = (k..n).map(|i| a[i][j]).collect(); + let t = beta * dot(&v, &col); + for (i, &vi) in (k..n).zip(&v) { + a[i][j] -= t * vi; + } + j += 1; + } + a[k][k] = alpha; + for row in a.iter_mut().skip(k + 1) { + row[k] = 0.0; + } + } + let r: Matrix = a.into_iter().take(m).collect(); + finite(r.iter().flatten().copied())?; + if (0..m).any(|i| r[i][i] == 0.0) { + return Err("zero QR diagonal".into()); + } + Ok(r) +} +/// Solve a triangular factor or its transpose; zero/nonfinite pivots refuse. +fn triangular(t: &Matrix, b: &[f64], lower: bool, transpose: bool) -> Result, String> { + let n = t.len(); + if b.len() != n { + return Err("triangular RHS shape".into()); + } + let forward = lower != transpose; + let mut x = vec![0.0; n]; + for step in 0..n { + let i = if forward { step } else { n - 1 - step }; + let ids: Vec<_> = if forward { + (0..i).collect() + } else { + (i + 1..n).collect() + }; + let row: Vec<_> = ids + .iter() + .map(|&j| if transpose { t[j][i] } else { t[i][j] }) + .collect(); + let known: Vec<_> = ids.iter().map(|&j| x[j]).collect(); + let pivot = t[i][i]; + if !pivot.is_finite() || pivot == 0.0 { + return Err("zero/nonfinite triangular pivot".into()); + } + x[i] = (b[i] - dot(&row, &known)) / pivot; + } + finite(x.iter().copied())?; + Ok(x) +} +pub struct Factor { + pub a: Matrix, + pub b: Matrix, + pub scaled_a: Matrix, + pub d: Vec, + pub e: Vec, + pub l: Matrix, + pub y: Matrix, + pub z: Matrix, + pub r: Matrix, + pub q: Matrix, +} +impl Factor { + pub fn new(a: Matrix, b: Matrix) -> Result { + let n = validate(&a)?; + let m = b.len(); + if m == 0 || m > 256 || m > n || b.iter().any(|r| r.len() != n) { + return Err("bounded full-row-rank divergence shape required".into()); + } + finite(b.iter().flatten().copied())?; + let d = (0..n) + .map(|i| { + let v = a[i][i]; + if !v.is_finite() || v <= 0.0 { + return Err("nonpositive velocity scaling diagonal".into()); + } + let d = 1.0 / v.sqrt(); + if !d.is_finite() || d <= 0.0 { + return Err("unrepresentable velocity scale".into()); + } + Ok(d) + }) + .collect::, String>>()?; + let scaled_a: Matrix = (0..n) + .map(|i| (0..n).map(|j| d[i] * a[i][j] * d[j]).collect()) + .collect(); + let l = cholesky(&scaled_a)?; + let mut y = zero(n, m); + for c in 0..m { + let rhs: Vec<_> = (0..n).map(|i| d[i] * b[c][i]).collect(); + let col = triangular(&l, &rhs, true, false)?; + for i in 0..n { + y[i][c] = col[i]; + } + } + let e = (0..m) + .map(|c| { + let norm = (0..n).fold(0.0_f64, |v, i| v.hypot(y[i][c])); + let e = 1.0 / norm; + if !e.is_finite() || e <= 0.0 { + return Err("nonpositive/unrepresentable pressure scale".into()); + } + Ok(e) + }) + .collect::, String>>()?; + let z: Matrix = y + .iter() + .map(|r| r.iter().zip(&e).map(|(y, e)| y * e).collect()) + .collect(); + let r = qr(&z)?; + let q = z + .iter() + .map(|row| triangular(&r, row, false, true)) + .collect::>()?; + Ok(Self { + a, + b, + scaled_a, + d, + e, + l, + y, + z, + r, + q, + }) + } + /// g is the desired B*u, not the lower KKT right-hand side -g. + pub fn solve(&self, f: &[f64], g: &[f64]) -> Result<(Vec, Vec), String> { + let n = self.d.len(); + let m = self.e.len(); + if f.len() != n || g.len() != m { + return Err("coupled RHS shape".into()); + } + finite(f.iter().chain(g).copied())?; + let df: Vec<_> = f.iter().zip(&self.d).map(|(f, d)| f * d).collect(); + let v = triangular(&self.l, &df, true, false)?; + let rhs: Vec<_> = (0..m) + .map(|c| { + let col: Vec<_> = self.y.iter().map(|r| r[c]).collect(); + self.e[c] * (g[c] - dot(&col, &v)) + }) + .collect(); + let q = triangular(&self.r, &rhs, false, true)?; + let q = triangular(&self.r, &q, false, false)?; + let p: Vec<_> = q.iter().zip(&self.e).map(|(q, e)| q * e).collect(); + let yp = action(&self.y, &p); + let uv: Vec<_> = v.iter().zip(&yp).map(|(v, y)| v + y).collect(); + let u = triangular(&self.l, &uv, true, true)? + .iter() + .zip(&self.d) + .map(|(u, d)| u * d) + .collect::>(); + finite(u.iter().chain(&p).copied())?; + Ok((u, p)) + } + pub fn residual(&self, f: &[f64], u: &[f64], p: &[f64]) -> (Vec, Vec) { + let bu = action(&self.b, u); + let ru = (0..u.len()) + .map(|i| { + let mut row: Vec<_> = self.a[i].iter().map(|a| -a).collect(); + row.extend(self.b.iter().map(|r| r[i])); + row.push(f[i]); + let mut value = u.to_vec(); + value.extend_from_slice(p); + value.push(1.0); + dot(&row, &value) + }) + .collect(); + (ru, bu.iter().map(|b| -b).collect()) + } + pub fn refined( + &self, + f: &[f64], + mut observe: impl FnMut(usize, &State) -> Result<(), String>, + ) -> Result { + let mut state = self.solve(f, &vec![0.0; self.e.len()])?; + observe(0, &state)?; + for i in 1..=3 { + let (u, p) = &state; + let (ru, g) = self.residual(f, u, p); + let (du, dp) = self.solve(&ru, &g)?; + let next = ( + u.iter().zip(du).map(|(u, d)| u + d).collect::>(), + p.iter().zip(dp).map(|(p, d)| p + d).collect::>(), + ); + finite(next.0.iter().chain(&next.1).copied())?; + observe(i, &next)?; + state = next; + } + Ok(state) + } +} +/// Diagnostic baseline: established aligned-reference partial-pivot elimination. +pub fn baseline(a: &Matrix, b: &[f64]) -> Result, String> { + let n = validate(a)?; + if b.len() != n { + return Err("baseline RHS shape".into()); + } + finite(b.iter().copied())?; + let mut rows = a.clone(); + for (r, v) in rows.iter_mut().zip(b) { + r.push(*v); + } + for k in 0..n { + let p = (k..n) + .max_by(|&i, &j| rows[i][k].abs().total_cmp(&rows[j][k].abs())) + .unwrap(); + if rows[p][k] == 0.0 { + return Err("singular baseline pivot".into()); + } + rows.swap(k, p); + let pivot = rows[k][k]; + for x in &mut rows[k][k..] { + *x /= pivot; + } + let basis = rows[k].clone(); + for (i, row) in rows.iter_mut().enumerate() { + if i != k { + let t = row[k]; + for (x, v) in row[k..].iter_mut().zip(&basis[k..]) { + *x -= t * v; + } + } + } + finite(rows.iter().flatten().copied())?; + } + Ok(rows.iter().map(|r| r[n]).collect()) +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn factors_refuse_invalid_data_and_allow_negative_qr_diagonal() { + assert!( + cholesky(&vec![vec![0.0]]) + .unwrap_err() + .contains("nonpositive") + ); + assert!( + cholesky(&vec![vec![f64::NAN]]) + .unwrap_err() + .contains("nonfinite") + ); + let r = qr(&vec![vec![1.0, 0.0], vec![0.0, 2.0], vec![0.0, 0.0]]).unwrap(); + assert!(r[0][0] < 0.0 && r[1][1] < 0.0); + assert!((r[0][0] * r[0][0] - 1.0).abs() < 1e-14); + assert!( + qr(&vec![vec![1.0, 0.0], vec![0.0, 0.0]]) + .unwrap_err() + .contains("zero") + ); + } + #[test] + fn nonzero_constraint_has_original_sign_and_bad_shape_refuses() { + let f = Factor::new(vec![vec![2.0, 0.0], vec![0.0, 3.0]], vec![vec![1.0, 1.0]]).unwrap(); + let (u, p) = f.solve(&[1.0, 2.0], &[0.75]).unwrap(); + assert!((u[0] + u[1] - 0.75).abs() < 1e-14); + assert!((2.0 * u[0] - p[0] - 1.0).abs() < 1e-14); + assert!((3.0 * u[1] - p[0] - 2.0).abs() < 1e-14); + assert!(f.solve(&[1.0], &[0.0]).unwrap_err().contains("shape")); + assert_eq!(dot(&[1e16, 1.0, -1e16], &[1.0; 3]), 1.0); + } +} + +#[cfg(test)] +mod qr_contract { + use super::*; + #[test] + fn tall_qr_preserves_gram_and_orthonormal_coordinates() { + let z = vec![vec![1.0, 2.0], vec![-2.0, 1.0], vec![0.5, 3.0]]; + let r = qr(&z).unwrap(); + let q = z + .iter() + .map(|row| triangular(&r, row, false, true).unwrap()) + .collect::>(); + for i in 0..2 { + for j in 0..2 { + let zi: Vec<_> = z.iter().map(|x| x[i]).collect(); + let zj: Vec<_> = z.iter().map(|x| x[j]).collect(); + let ri: Vec<_> = r.iter().map(|x| x[i]).collect(); + let rj: Vec<_> = r.iter().map(|x| x[j]).collect(); + assert!((dot(&zi, &zj) - dot(&ri, &rj)).abs() < 1e-13); + let qi: Vec<_> = q.iter().map(|x| x[i]).collect(); + let qj: Vec<_> = q.iter().map(|x| x[j]).collect(); + assert!((dot(&qi, &qj) - if i == j { 1.0 } else { 0.0 }).abs() < 1e-14); + } + } + } +} +#[cfg(test)] +mod history_contract { + use super::*; + #[test] + fn correction_observer_keeps_successful_states_on_later_refusal() { + let f = Factor::new(vec![vec![2.0, 0.0], vec![0.0, 2.0]], vec![vec![1.0, 1.0]]).unwrap(); + let mut seen = Vec::new(); + let result = f.refined(&[1.0, -1.0], |i, state| { + seen.push((i, state.clone())); + if i == 1 { + Err("retained observer refusal".into()) + } else { + Ok(()) + } + }); + assert!(result.unwrap_err().contains("observer refusal")); + assert_eq!(seen.iter().map(|(i, _)| *i).collect::>(), vec![0, 1]); + assert!((seen[0].1.0[0] - 0.5).abs() < 1e-14); + } +} diff --git a/examples/grid_cut_variational_reference.rs b/examples/grid_cut_variational_reference.rs new file mode 100644 index 00000000..9e951e76 --- /dev/null +++ b/examples/grid_cut_variational_reference.rs @@ -0,0 +1,151 @@ +//! CV1 private cut-cell operator reference: no PDE solve or production-water claim. +#[allow(dead_code)] +mod grid_cut_variational_reference { + pub mod assembly; + pub mod basis; + pub mod clip; + #[path = "../grid_geometry_reference/exact.rs"] + pub mod exact; + pub mod export; + #[path = "../grid_geometry_reference/geometry.rs"] + pub mod geometry; + pub mod observe; + pub mod trace; +} +use grid_cut_variational_reference::{ + assembly::Operators, export, geometry::Polygon, observe::Report, trace::Traces, +}; +use std::{io::Write, path::Path}; +const RHO: f64 = 1.0; +const MU: f64 = 0.1; +const GATE: f64 = 1e-10; +struct Fixture { + name: &'static str, + n: usize, + origin: [f64; 2], + extent: f64, + vertices: Vec<[f64; 2]>, +} +fn fixtures() -> Vec { + let (s, c) = 17.0_f64.to_radians().sin_cos(); + let square = [[-0.15, -0.15], [0.15, -0.15], [0.15, 0.15], [-0.15, 0.15]] + .into_iter() + .map(|[x, y]| [0.537 + c * x - s * y, 0.479 + s * x + c * y]) + .collect(); + let disk = (0..64) + .map(|k| { + let t = std::f64::consts::TAU * k as f64 / 64.0; + [0.75 * t.cos(), 0.75 * t.sin()] + }) + .collect(); + vec![ + Fixture { + name: "rectangle", + n: 4, + origin: [0.0, 0.0], + extent: 1.0, + vertices: vec![[0.17, 0.23], [0.83, 0.23], [0.83, 0.79], [0.17, 0.79]], + }, + Fixture { + name: "square-17", + n: 8, + origin: [0.0, 0.0], + extent: 1.0, + vertices: square, + }, + Fixture { + name: "disk-64", + n: 8, + origin: [-1.0, -1.0], + extent: 2.0, + vertices: disk, + }, + Fixture { + name: "corner-triangle", + n: 4, + origin: [-1.0, -1.0], + extent: 4.0, + vertices: vec![[0.81, 0.99], [0.99, 0.81], [0.99, 0.99]], + }, + ] +} +fn run(root: &Path, fixture: Fixture) -> Result<(usize, usize, f64), Box> { + let case = root.join(fixture.name); + std::fs::create_dir(&case)?; + export::inputs( + &case, + &fixture.vertices, + fixture.n, + fixture.origin, + fixture.extent, + )?; + let source = Polygon::new(fixture.vertices)?; + let op = Operators::build(fixture.n, fixture.origin, fixture.extent, source)?; + let tr = Traces::build(&op)?; + let report = Report::new(&op, &tr)?; + // Export every completed raw observation before evaluating mandatory gates. + export::all(&case, &op, &tr, &report)?; + let worst = report.gates.values().copied().fold(0.0, f64::max); + if worst > GATE { + return Err(format!( + "{}: fixed gate exceeded: {worst:.17e} > {GATE}", + fixture.name + ) + .into()); + } + Ok((op.active.len(), op.cells.len(), worst)) +} +fn main() -> Result<(), Box> { + let out = std::env::args_os() + .nth(1) + .ok_or("fresh output directory required")?; + let root = Path::new(&out); + std::fs::create_dir(root)?; + let mut summary = std::io::BufWriter::new(std::fs::File::create(root.join("summary.csv"))?); + writeln!( + summary, + "case,active,pressure_cells,worst_fixed_gate,status" + )?; + let mut failures = Vec::new(); + for fixture in fixtures() { + let name = fixture.name; + match run(root, fixture) { + Ok((active, cells, worst)) => { + writeln!(summary, "{name},{active},{cells},{worst:.17e},passed")?; + summary.flush()?; + println!( + "{name}: active={active} pressure_cells={cells} maximum_gate={worst:.17e}" + ); + } + Err(e) => { + writeln!(summary, "{name},,,,refused")?; + summary.flush()?; + let failure = format!("{name}: {e}"); + std::fs::write(root.join(name).join("refusal.txt"), &failure)?; + eprintln!("{failure}"); + failures.push(failure); + } + } + } + if failures.is_empty() { + Ok(()) + } else { + Err(failures.join("\n").into()) + } +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn pressure_control_observes_each_nodal_load_and_absolute_coefficient() { + let f = fixtures().remove(0); + let op = + Operators::build(f.n, f.origin, f.extent, Polygon::new(f.vertices).unwrap()).unwrap(); + let tr = Traces::build(&op).unwrap(); + let report = Report::new(&op, &tr).unwrap(); + assert!(report.observations["pressure_nodal_signal"] > 0.0); + assert!((report.observations["constant_pressure_load_coefficient_Pa"] - 2.0).abs() < GATE); + assert!(report.gates["affine_nodal_total_stress"] < GATE); + assert!(report.gates["omitted_pressure_orientation"] < GATE); + } +} diff --git a/examples/grid_cut_variational_reference/assembly.rs b/examples/grid_cut_variational_reference/assembly.rs new file mode 100644 index 00000000..86bb5d8a --- /dev/null +++ b/examples/grid_cut_variational_reference/assembly.rs @@ -0,0 +1,262 @@ +use super::super::{MU, RHO}; +use super::{ + basis::{GAUSS_WEIGHTS, Layout, Node, Value, gauss_nodes}, + clip::{self, QPoint, Source, Triangle}, + geometry::{Point, Polygon}, +}; +use num_traits::ToPrimitive; +pub type Matrix = Vec>; +pub fn zero(n: usize, m: usize) -> Matrix { + vec![vec![0.0; m]; n] +} +pub fn action(a: &Matrix, x: &[f64]) -> Vec { + a.iter() + .map(|r| r.iter().zip(x).map(|(v, x)| v * x).sum()) + .collect() +} +pub fn dot(x: &[f64], y: &[f64]) -> f64 { + x.iter().zip(y).map(|(x, y)| x * y).sum() +} +pub struct Patch { + pub i: usize, + pub j: usize, + pub cell: usize, + pub lo: Point, + pub hi: Point, + pub polygon: Vec, + pub triangles: Vec, +} +pub struct Quadrature { + pub patch: usize, + pub cell: usize, + pub point: Point, + pub weight: f64, + pub values: Vec, +} +pub struct Operators { + pub layout: Layout, + pub source: Polygon, + pub exact: Source, + pub patches: Vec, + pub quadrature: Vec, + pub active: Vec, + pub map: Vec, + pub cells: Vec, + pub cell_map: Vec, + pub volume: Vec, + pub old_dual: Vec, + pub mass: Matrix, + pub divergence: Matrix, + pub stiffness: Matrix, + pub gradient: Vec<[f64; 3]>, + pub moment: Vec<[f64; 3]>, +} +pub fn strain(v: Value) -> [f64; 3] { + if v.axis == 0 { + [v.dx, 0.0, v.dy] + } else { + [0.0, v.dy, v.dx] + } +} +pub fn integrate_triangle(t: &Triangle) -> Result, String> { + let nodes = gauss_nodes(); + let [a, b, c] = t.points; + let mut out = Vec::with_capacity(9); + for (i, &r) in nodes.iter().enumerate() { + for (j, &s) in nodes.iter().enumerate() { + let p = + std::array::from_fn(|d| a[d] + r * ((1.0 - s) * (b[d] - a[d]) + s * (c[d] - a[d]))); + let w = t.cross * r * GAUSS_WEIGHTS[i] * GAUSS_WEIGHTS[j]; + if !w.is_finite() || w <= 0.0 || p.iter().any(|x| !x.is_finite()) { + return Err("invalid positive Duffy quadrature".into()); + } + out.push((p, w)); + } + } + Ok(out) +} +impl Operators { + pub fn build(n: usize, origin: Point, extent: f64, source: Polygon) -> Result { + let layout = Layout::new(n, origin, extent, &source)?; + let exact = Source::new(&source)?; + let mut patches = Vec::new(); + let mut quadrature = Vec::new(); + let mut active_flags = vec![false; layout.nodes.len()]; + let mut volume = vec![0.0; n * n]; + for j in 0..2 * n { + for i in 0..2 * n { + let (lo, hi) = layout.quarter_bounds(i, j); + let polygon = exact.clip(lo, hi)?; + let triangles = clip::triangles(&polygon) + .map_err(|e| format!("halfcell patch ({i},{j}) bounds {lo:?}..{hi:?}: {e}"))?; + let cell = i / 2 + n * (j / 2); + let id = patches.len(); + for t in &triangles { + for (point, weight) in integrate_triangle(t)? { + if (0..2).any(|d| point[d] <= lo[d] || point[d] >= hi[d]) { + return Err(format!( + "patch({i},{j}) positive integration point collapsed to knot boundary" + )); + } + let values = layout.local(i, j, point)?; + for v in &values { + active_flags[v.global] = true; + } + volume[cell] += weight; + quadrature.push(Quadrature { + patch: id, + cell, + point, + weight, + values, + }); + } + } + patches.push(Patch { + i, + j, + cell, + lo, + hi, + polygon, + triangles, + }); + } + } + let active: Vec<_> = layout + .nodes + .iter() + .filter(|p| active_flags[p.global]) + .cloned() + .collect(); + if active.is_empty() || active.len() > 544 { + return Err("bounded positive active basis n1..544 required".into()); + } + let mut map = vec![usize::MAX; layout.nodes.len()]; + for (i, p) in active.iter().enumerate() { + map[p.global] = i; + } + let cells: Vec<_> = volume + .iter() + .enumerate() + .filter_map(|(i, v)| (*v > 0.0).then_some(i)) + .collect(); + let mut cell_map = vec![usize::MAX; n * n]; + for (i, &c) in cells.iter().enumerate() { + cell_map[c] = i; + } + let nv = active.len(); + nv.checked_mul(nv) + .filter(|&entries| entries <= 544 * 544) + .ok_or("private dense allocation ceiling")?; + if cells.len() > 256 { + return Err("bounded pressure rows n1..256 required".into()); + } + let mut mass = zero(nv, nv); + let mut divergence = zero(cells.len(), nv); + let mut stiffness = zero(nv, nv); + let mut gradient = vec![[0.0; 3]; nv]; + let mut moment = vec![[0.0; 3]; nv]; + for q in &quadrature { + let pressure = cell_map[q.cell]; + for &a in &q.values { + let i = map[a.global]; + divergence[pressure][i] += q.weight * if a.axis == 0 { a.dx } else { a.dy }; + if a.axis == 0 { + gradient[i][0] += q.weight * a.dx; + gradient[i][1] += q.weight * a.dy; + moment[i][0] += RHO * q.weight * a.phi; + moment[i][2] -= RHO * q.weight * q.point[1] * a.phi; + } else { + gradient[i][1] += q.weight * a.dx; + gradient[i][2] += q.weight * a.dy; + moment[i][1] += RHO * q.weight * a.phi; + moment[i][2] += RHO * q.weight * q.point[0] * a.phi; + } + let sa = strain(a); + for &b in &q.values { + let j = map[b.global]; + let sb = strain(b); + if a.axis == b.axis { + mass[i][j] += RHO * q.weight * a.phi * b.phi; + } + stiffness[i][j] += + MU * q.weight * (2.0 * sa[0] * sb[0] + 2.0 * sa[1] * sb[1] + sa[2] * sb[2]); + } + } + } + if mass + .iter() + .enumerate() + .any(|(i, r)| !r[i].is_finite() || r[i] <= 0.0) + || mass + .iter() + .chain(&divergence) + .chain(&stiffness) + .flatten() + .any(|x| !x.is_finite()) + { + return Err("invalid full mass or bulk operator; no floor".into()); + } + if volume + .iter() + .chain(gradient.iter().flatten()) + .chain(moment.iter().flatten()) + .any(|x| !x.is_finite()) + { + return Err("nonfinite volume or moment map".into()); + } + let old_dual = active + .iter() + .map(|node| { + let lo = node.point.map(|x| x - layout.h / 2.0); + let hi = node.point.map(|x| x + layout.h / 2.0); + clip::area(&exact.clip(lo, hi)?) + .to_f64() + .ok_or_else(|| "old dual observation unrepresentable".to_string()) + }) + .collect::, String>>()?; + Ok(Self { + layout, + source, + exact, + patches, + quadrature, + active, + map, + cells, + cell_map, + volume, + old_dual, + mass, + divergence, + stiffness, + gradient, + moment, + }) + } +} +#[cfg(test)] +mod tests { + use super::super::{clip::QPoint, exact::rational}; + use super::*; + #[test] + fn positive_triangle_rule_reproduces_polynomial_moments() { + let v: Vec = vec![[0.0, 0.0], [1.0, 0.0], [0.0, 1.0]] + .into_iter() + .map(|p| p.map(|x| rational(x).unwrap())) + .collect(); + let triangles = clip::triangles(&v).unwrap(); + let q = integrate_triangle(&triangles[0]).unwrap(); + assert!(q.iter().all(|(_, w)| *w > 0.0)); + for (a, b, expected) in [ + (0, 0, 0.5), + (1, 0, 1.0 / 6.0), + (2, 2, 1.0 / 180.0), + (4, 0, 1.0 / 30.0), + ] { + let actual: f64 = q.iter().map(|(p, w)| w * p[0].powi(a) * p[1].powi(b)).sum(); + assert!((actual - expected).abs() < 1e-14); + } + } +} diff --git a/examples/grid_cut_variational_reference/basis.rs b/examples/grid_cut_variational_reference/basis.rs new file mode 100644 index 00000000..c5950541 --- /dev/null +++ b/examples/grid_cut_variational_reference/basis.rs @@ -0,0 +1,232 @@ +//! One declared continuous field for bulk and physical trace. +use super::geometry::{Point, Polygon}; +use rheon::{Axis, GridGeometry}; +#[derive(Clone, Debug)] +pub struct Node { + pub global: usize, + pub axis: usize, + pub face: usize, + pub index: [usize; 2], + pub point: Point, +} +#[derive(Clone, Copy)] +pub struct Value { + pub global: usize, + pub axis: usize, + pub phi: f64, + pub dx: f64, + pub dy: f64, +} +pub struct Layout { + pub grid: GridGeometry, + pub n: usize, + pub h: f64, + pub origin: Point, + pub nodes: Vec, +} +impl Layout { + pub fn new(n: usize, origin: Point, extent: f64, source: &Polygon) -> Result { + if !(2..=16).contains(&n) || !extent.is_finite() || extent <= 0.0 { + return Err( + "bounded private reference grid n2..16 and positive extent required".into(), + ); + } + let h = extent / n as f64; + let grid = GridGeometry::new( + [n as u64, n as u64, 1], + [h, h, 1.0], + [origin[0], origin[1], 0.0], + ) + .map_err(|e| e.to_string())?; + if source.vertices().iter().any(|p| { + (0..2).any(|d| p[d] < origin[d] + h / 2.0 || p[d] > origin[d] + extent - h / 2.0) + }) { + return Err("source outside complete component nodal hull; no zero halo".into()); + } + for (a, b) in super::geometry::edges(source.vertices()) { + for d in 0..2 { + if a[d] == b[d] && (0..=n).any(|i| a[d] == origin[d] + i as f64 * h) { + return Err("finite source edge on primal plane unsupported".into()); + } + } + } + let capacity = n + .checked_add(1) + .and_then(|v| n.checked_mul(v)) + .and_then(|v| v.checked_mul(2)) + .filter(|&v| v <= 544) + .ok_or("private reference nodal allocation overflow/ceiling")?; + let mut nodes = Vec::with_capacity(capacity); + for (axis, native_axis) in [Axis::X, Axis::Y].into_iter().enumerate() { + let counts = grid.face_counts(native_axis); + for j in 0..counts[1] { + for i in 0..counts[0] { + let coordinate = [i, j, 0]; + let position = grid + .face_position(native_axis, coordinate) + .ok_or("native face position missing")?; + nodes.push(Node { + global: nodes.len(), + axis, + face: grid + .face_index(native_axis, coordinate) + .ok_or("native face index missing")?, + index: [i, j], + point: [position[0], position[1]], + }); + } + } + } + Ok(Self { + grid, + n, + h, + origin, + nodes, + }) + } + pub fn quarter_bounds(&self, i: usize, j: usize) -> (Point, Point) { + ( + [ + self.origin[0] + i as f64 * self.h / 2.0, + self.origin[1] + j as f64 * self.h / 2.0, + ], + [ + self.origin[0] + (i + 1) as f64 * self.h / 2.0, + self.origin[1] + (j + 1) as f64 * self.h / 2.0, + ], + ) + } + pub fn local(&self, i: usize, j: usize, p: Point) -> Result, String> { + if i == 0 || j == 0 || i + 1 >= 2 * self.n || j + 1 >= 2 * self.n { + return Err("positive patch requires complete both-component halo".into()); + } + let mut out = Vec::with_capacity(8); + for axis in 0..2 { + let (ix, iy, shift, counts, offset) = if axis == 0 { + (i / 2, (j - 1) / 2, [0.0, 0.5], [self.n + 1, self.n], 0) + } else { + ( + (i - 1) / 2, + j / 2, + [0.5, 0.0], + [self.n, self.n + 1], + self.n * (self.n + 1), + ) + }; + if ix + 1 >= counts[0] || iy + 1 >= counts[1] { + return Err("missing nodal support".into()); + } + let lo = [ + self.origin[0] + (ix as f64 + shift[0]) * self.h, + self.origin[1] + (iy as f64 + shift[1]) * self.h, + ]; + let t = [(p[0] - lo[0]) / self.h, (p[1] - lo[1]) / self.h]; + if t.iter().any(|x| !x.is_finite() || *x < 0.0 || *x > 1.0) { + return Err("quadrature outside declared basis patch".into()); + } + for y in 0..2 { + for x in 0..2 { + let fx = if x == 0 { 1.0 - t[0] } else { t[0] }; + let fy = if y == 0 { 1.0 - t[1] } else { t[1] }; + out.push(Value { + global: offset + ix + x + counts[0] * (iy + y), + axis, + phi: fx * fy, + dx: if x == 0 { -fy / self.h } else { fy / self.h }, + dy: if y == 0 { -fx / self.h } else { fx / self.h }, + }); + } + } + } + Ok(out) + } + pub fn trace(&self, node: &Node, p: Point) -> f64 { + // Compact hat support is the basis definition, not a volume/aperture floor. + (1.0 - ((p[0] - node.point[0]) / self.h).abs()).max(0.0) + * (1.0 - ((p[1] - node.point[1]) / self.h).abs()).max(0.0) + } +} +pub const GAUSS_WEIGHTS: [f64; 3] = [5.0 / 18.0, 4.0 / 9.0, 5.0 / 18.0]; +pub fn gauss_nodes() -> [f64; 3] { + let r = (3.0_f64 / 5.0).sqrt(); + [(1.0 - r) / 2.0, 0.5, (1.0 + r) / 2.0] +} +pub fn work_vectors(node: &Node) -> [f64; 2] { + let [x, y] = node.point; + if node.axis == 0 { + [ + 0.25 + x / 2.0 - y / 8.0 + x * y / 4.0, + -0.25 + x * x / 8.0 + y / 4.0, + ] + } else { + [ + -0.125 + x / 4.0 + y / 2.0 - x * y / 8.0, + 0.5 - x / 8.0 + y * y / 4.0, + ] + } +} +pub fn affine(node: &Node) -> f64 { + let [x, y] = node.point; + if node.axis == 0 { + 0.25 * x + 0.75 * y + 0.1 + } else { + -0.2 * x - 0.25 * y - 0.3 + } +} +#[cfg(test)] +mod tests { + use super::*; + fn rectangle() -> Polygon { + Polygon::new(vec![[0.2, 0.2], [0.8, 0.2], [0.8, 0.8], [0.2, 0.8]]).unwrap() + } + #[test] + fn halo_coincidence_and_orientation_refuse() { + assert!( + Layout::new( + 4, + [0.0; 2], + 1.0, + &Polygon::new(vec![[0.01, 0.2], [0.8, 0.2], [0.8, 0.8], [0.01, 0.8]]).unwrap() + ) + .err() + .unwrap() + .contains("hull") + ); + assert!( + Layout::new( + 4, + [0.0; 2], + 1.0, + &Polygon::new(vec![[0.25, 0.3], [0.7, 0.3], [0.7, 0.7], [0.25, 0.7]]).unwrap() + ) + .err() + .unwrap() + .contains("primal plane") + ); + assert!(Polygon::new(vec![[0.2, 0.2], [0.2, 0.8], [0.8, 0.2]]).is_err()); + } + #[test] + fn polynomial_basis_reproduces_values_and_derivatives() { + let l = Layout::new(4, [0.0; 2], 1.0, &rectangle()).unwrap(); + let p = [0.31, 0.42]; + let b = l.local(2, 3, p).unwrap(); + for axis in 0..2 { + let selected: Vec<_> = b.iter().filter(|v| v.axis == axis).collect(); + assert!((selected.iter().map(|v| v.phi).sum::() - 1.0).abs() < 1e-14); + for (d, expected) in p.iter().enumerate() { + assert!( + (selected + .iter() + .map(|v| v.phi * l.nodes[v.global].point[d]) + .sum::() + - expected) + .abs() + < 1e-14 + ); + } + assert!(selected.iter().map(|v| v.dx).sum::().abs() < 1e-14); + assert!(selected.iter().map(|v| v.dy).sum::().abs() < 1e-14); + } + } +} diff --git a/examples/grid_cut_variational_reference/clip.rs b/examples/grid_cut_variational_reference/clip.rs new file mode 100644 index 00000000..3975f43b --- /dev/null +++ b/examples/grid_cut_variational_reference/clip.rs @@ -0,0 +1,214 @@ +//! Exact represented-source clipping and positive integration pieces. +use super::{ + exact::rational, + geometry::{Point, Polygon, Segment}, +}; +use num_rational::BigRational as R; +use num_traits::{ToPrimitive, Zero}; +pub type QPoint = [R; 2]; +#[derive(Clone)] +pub struct Source { + pub points: Vec, +} +#[derive(Clone, Debug)] +pub struct Triangle { + pub points: [Point; 3], + pub exact_cross: R, + pub cross: f64, +} +fn cross(a: &QPoint, b: &QPoint, c: &QPoint) -> R { + (&b[0] - &a[0]) * (&c[1] - &a[1]) - (&b[1] - &a[1]) * (&c[0] - &a[0]) +} +pub fn native(p: &QPoint) -> Result { + let x = p[0].to_f64().ok_or("unrepresentable coordinate")?; + let y = p[1].to_f64().ok_or("unrepresentable coordinate")?; + if !x.is_finite() || !y.is_finite() { + return Err("nonfinite represented coordinate".into()); + } + Ok([x, y]) +} +pub fn area(v: &[QPoint]) -> R { + if v.len() < 3 { + return R::zero(); + } + v.iter() + .zip(v.iter().cycle().skip(1)) + .take(v.len()) + .map(|(a, b)| &a[0] * &b[1] - &a[1] * &b[0]) + .sum::() + / rational(2.0).unwrap() +} +impl Source { + pub fn new(p: &Polygon) -> Result { + Ok(Self { + points: p + .vertices() + .iter() + .map(|p| Ok([rational(p[0])?, rational(p[1])?])) + .collect::>()?, + }) + } + pub fn clip(&self, lo: Point, hi: Point) -> Result, String> { + if (0..2).any(|d| !lo[d].is_finite() || !hi[d].is_finite() || lo[d] >= hi[d]) { + return Err("finite ordered clip box required".into()); + } + let mut v = self.points.clone(); + for d in 0..2 { + for (bound, positive) in [(lo[d], true), (hi[d], false)] { + let plane = rational(bound)?; + let mut out = Vec::new(); + for (a, b) in v.iter().zip(v.iter().cycle().skip(1)).take(v.len()) { + let ia = if positive { + a[d] >= plane + } else { + a[d] <= plane + }; + let ib = if positive { + b[d] >= plane + } else { + b[d] <= plane + }; + if ia != ib { + let t = (&plane - &a[d]) / (&b[d] - &a[d]); + let mut p = std::array::from_fn(|k| &a[k] + &t * (&b[k] - &a[k])); + p[d] = plane.clone(); + if out.last() != Some(&p) { + out.push(p); + } + } + if ib && out.last() != Some(b) { + out.push(b.clone()); + } + } + if out.len() > 1 && out.first() == out.last() { + out.pop(); + } + v = out; + } + } + let a = area(&v); + if a < R::zero() { + return Err("negative exact clipped area".into()); + } + if a.is_zero() { + v.clear(); + } + Ok(v) + } +} +pub fn triangles(v: &[QPoint]) -> Result, String> { + let mut out = Vec::new(); + if v.len() < 3 { + return Ok(out); + } + for k in 1..v.len() - 1 { + let exact_cross = cross(&v[0], &v[k], &v[k + 1]); + if exact_cross < R::zero() { + return Err("negative exact fan triangle".into()); + } + if exact_cross.is_zero() { + continue; + } + let points = [native(&v[0])?, native(&v[k])?, native(&v[k + 1])?]; + let [a, b, c] = points; + let cross = (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + if !cross.is_finite() + || cross <= 0.0 + || exact_cross + .to_f64() + .is_none_or(|x| !x.is_finite() || x <= 0.0) + { + return Err("positive exact triangle collapsed or unrepresentable; no deletion".into()); + } + out.push(Triangle { + points, + exact_cross, + cross, + }); + } + Ok(out) +} +pub fn clipped_segment( + a: &QPoint, + b: &QPoint, + lo: Point, + hi: Point, +) -> Result, String> { + let mut lower = R::zero(); + let mut upper = rational(1.0)?; + for d in 0..2 { + let delta = &b[d] - &a[d]; + let l = rational(lo[d])?; + let h = rational(hi[d])?; + if delta.is_zero() { + if a[d] < l || a[d] > h { + return Ok(None); + } + } else { + let t0 = (l - &a[d]) / δ + let t1 = (h - &a[d]) / delta; + lower = lower.max(t0.clone().min(t1.clone())); + upper = upper.min(t0.max(t1)); + } + } + if upper <= lower { + return Ok(None); + } + Ok(Some([ + std::array::from_fn(|d| &a[d] + &lower * (&b[d] - &a[d])), + std::array::from_fn(|d| &a[d] + &upper * (&b[d] - &a[d])), + ])) +} +pub fn split_segment(s: &[QPoint; 2], planes: &[Vec; 2]) -> Result, String> { + let mut cuts = vec![R::zero(), rational(1.0)?]; + for d in 0..2 { + let delta = &s[1][d] - &s[0][d]; + if delta.is_zero() { + continue; + } + for p in &planes[d] { + let t = (p - &s[0][d]) / δ + if t > R::zero() && t < rational(1.0)? { + cuts.push(t); + } + } + } + cuts.sort(); + cuts.dedup(); + let mut result = Vec::new(); + for c in cuts.windows(2) { + let a = native(&std::array::from_fn(|d| { + &s[0][d] + &c[0] * (&s[1][d] - &s[0][d]) + }))?; + let b = native(&std::array::from_fn(|d| { + &s[0][d] + &c[1] * (&s[1][d] - &s[0][d]) + }))?; + if a == b || (0..2).any(|d| !(b[d] - a[d]).is_finite()) { + return Err("positive exact boundary segment collapsed; no deletion".into()); + } + result.push(Segment { a, b }); + } + Ok(result) +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn exact_tangent_and_positive_clips() { + let p = Polygon::new(vec![[0.0, 0.0], [1.0, 0.0], [0.0, 1.0]]).unwrap(); + let s = Source::new(&p).unwrap(); + assert!(s.clip([1.0, 0.0], [2.0, 1.0]).unwrap().is_empty()); + assert!(area(&s.clip([1.0_f64.next_down(), 0.0], [2.0, 1.0]).unwrap()) > R::zero()); + } + #[test] + fn positive_triangle_collapse_is_refused() { + let one = rational(1.0).unwrap(); + let tiny = rational(2.0_f64.powi(-200)).unwrap(); + let v = vec![ + [one.clone(), R::zero()], + [&one + tiny, R::zero()], + [one, rational(1.0).unwrap()], + ]; + assert!(triangles(&v).unwrap_err().contains("collapsed")); + } +} diff --git a/examples/grid_cut_variational_reference/export.rs b/examples/grid_cut_variational_reference/export.rs new file mode 100644 index 00000000..6d698f39 --- /dev/null +++ b/examples/grid_cut_variational_reference/export.rs @@ -0,0 +1,321 @@ +use super::{ + assembly::Operators, + basis::{affine, work_vectors}, + clip, + observe::Report, + trace::Traces, +}; +use std::{ + fs::File, + io::{self, BufWriter, Write}, + path::Path, +}; +fn stream( + root: &Path, + name: &str, + header: &str, + body: impl FnOnce(&mut BufWriter) -> io::Result<()>, +) -> io::Result<()> { + let mut w = BufWriter::new(File::create(root.join(name))?); + writeln!(w, "{header}")?; + body(&mut w)?; + w.flush() +} +pub fn inputs( + root: &Path, + vertices: &[[f64; 2]], + n: usize, + origin: [f64; 2], + extent: f64, +) -> io::Result<()> { + stream(root, "source.csv", "vertex,x,y", |w| { + for (i, p) in vertices.iter().enumerate() { + writeln!(w, "{i},{:.17e},{:.17e}", p[0], p[1])?; + } + Ok(()) + })?; + stream(root, "input-meta.csv", "key,value", |w| { + writeln!( + w, + "n,{n}\norigin_x,{:.17e}\norigin_y,{:.17e}\nextent,{extent:.17e}\nrho,1\nmu,0.1\ndepth,1\nmodel,CV1-operator-only", + origin[0], origin[1] + ) + }) +} +pub fn all(root: &Path, op: &Operators, tr: &Traces, r: &Report) -> io::Result<()> { + stream(root, "meta.csv", "key,value", |w| { + writeln!( + w, + "n,{}\nh,{:.17e}\norigin_x,{:.17e}\norigin_y,{:.17e}\nactive,{}\npressure_cells,{}\npatches,{}\nquadrature,{}\nsegments,{}\ntrace_points,{}\nrho,1\nmu,0.1\ndepth,1\nvelocity_basis,staggered-continuous-Q1\npressure_basis,primal-cut-P0\noperators_only,true\npressure_gauge,none", + op.layout.n, + op.layout.h, + op.layout.origin[0], + op.layout.origin[1], + op.active.len(), + op.cells.len(), + op.patches.len(), + op.quadrature.len(), + tr.records.len(), + tr.points.len() + ) + })?; + stream( + root, + "nodes.csv", + "global,axis,face,i,j,x,y,active,old_dual,mass_diagonal,a,b,affine", + |w| { + for p in &op.layout.nodes { + let i = op.map[p.global]; + let (active, dual, mass) = if i == usize::MAX { + (String::new(), String::new(), String::new()) + } else { + ( + i.to_string(), + format!("{:.17e}", op.old_dual[i]), + format!("{:.17e}", op.mass[i][i]), + ) + }; + let [a, b] = work_vectors(p); + writeln!( + w, + "{},{},{},{},{},{:.17e},{:.17e},{active},{dual},{mass},{a:.17e},{b:.17e},{:.17e}", + p.global, + p.axis, + p.face, + p.index[0], + p.index[1], + p.point[0], + p.point[1], + affine(p) + )?; + } + Ok(()) + }, + )?; + stream( + root, + "patches.csv", + "patch,i,j,cell,lo_x_bits,lo_y_bits,hi_x_bits,hi_y_bits,area_num,area_den,vertices,triangles", + |w| { + for (id, p) in op.patches.iter().enumerate() { + let a = clip::area(&p.polygon); + writeln!( + w, + "{id},{},{},{},{},{},{},{},{},{},{},{}", + p.i, + p.j, + p.cell, + p.lo[0].to_bits(), + p.lo[1].to_bits(), + p.hi[0].to_bits(), + p.hi[1].to_bits(), + a.numer(), + a.denom(), + p.polygon.len(), + p.triangles.len() + )?; + } + Ok(()) + }, + )?; + stream( + root, + "vertices.csv", + "patch,index,x_num,x_den,y_num,y_den", + |w| { + for (id, p) in op.patches.iter().enumerate() { + for (i, q) in p.polygon.iter().enumerate() { + writeln!( + w, + "{id},{i},{},{},{},{}", + q[0].numer(), + q[0].denom(), + q[1].numer(), + q[1].denom() + )?; + } + } + Ok(()) + }, + )?; + stream( + root, + "triangles.csv", + "patch,index,ax,ay,bx,by,cx,cy,cross,cross_num,cross_den", + |w| { + for (id, p) in op.patches.iter().enumerate() { + for (i, t) in p.triangles.iter().enumerate() { + let [a, b, c] = t.points; + writeln!( + w, + "{id},{i},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{},{}", + a[0], + a[1], + b[0], + b[1], + c[0], + c[1], + t.cross, + t.exact_cross.numer(), + t.exact_cross.denom() + )?; + } + } + Ok(()) + }, + )?; + stream(root, "quadrature.csv", "q,patch,cell,x,y,weight", |w| { + for (id, q) in op.quadrature.iter().enumerate() { + writeln!( + w, + "{id},{},{},{:.17e},{:.17e},{:.17e}", + q.patch, q.cell, q.point[0], q.point[1], q.weight + )?; + } + Ok(()) + })?; + stream( + root, + "bulk-basis.csv", + "q,active,global,axis,phi,dx,dy", + |w| { + for (id, q) in op.quadrature.iter().enumerate() { + for v in &q.values { + writeln!( + w, + "{id},{},{},{},{:.17e},{:.17e},{:.17e}", + op.map[v.global], v.global, v.axis, v.phi, v.dx, v.dy + )?; + } + } + Ok(()) + }, + )?; + stream( + root, + "cells.csv", + "cell,pressure,volume,x_center,y_center,q_pressure", + |w| { + for (c, &volume) in op.volume.iter().enumerate() { + let pressure = op.cell_map[c]; + let pressure = if pressure == usize::MAX { + String::new() + } else { + pressure.to_string() + }; + let x = op.layout.origin[0] + + (c % op.layout.n) as f64 * op.layout.h + + op.layout.h / 2.0; + let y = op.layout.origin[1] + + (c / op.layout.n) as f64 * op.layout.h + + op.layout.h / 2.0; + let q = 0.75 + x / 8.0 - y / 4.0; + writeln!(w, "{c},{pressure},{volume:.17e},{x:.17e},{y:.17e},{q:.17e}")?; + } + Ok(()) + }, + )?; + stream(root, "matrices.csv", "block,row,column,value", |w| { + for (name, m) in [ + ("M", &op.mass), + ("K", &op.stiffness), + ("B", &op.divergence), + ("grid_flux", &tr.grid), + ("physical_flux", &tr.physical), + ] { + for (i, row) in m.iter().enumerate() { + for (j, v) in row.iter().enumerate() { + writeln!(w, "{name},{i},{j},{v:.17e}")?; + } + } + } + Ok(()) + })?; + stream( + root, + "maps.csv", + "active,bulk_xx,bulk_xy,bulk_yy,trace_xx,trace_xy,trace_yy,moment_px,moment_py,moment_lz,full_load,omit_load", + |w| { + for i in 0..op.active.len() { + let g = op.gradient[i]; + let t = tr.gradient[i]; + let m = op.moment[i]; + writeln!( + w, + "{i},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + g[0], + g[1], + g[2], + t[0], + t[1], + t[2], + m[0], + m[1], + m[2], + r.full_load[i], + r.omit_load[i] + )?; + } + Ok(()) + }, + )?; + stream( + root, + "segments.csv", + "segment,kind,owner,axis,edge,ax,ay,bx,by", + |w| { + for (i, s) in tr.records.iter().enumerate() { + let edge = if s.edge == usize::MAX { + String::new() + } else { + s.edge.to_string() + }; + writeln!( + w, + "{i},{},{},{},{edge},{:.17e},{:.17e},{:.17e},{:.17e}", + s.kind, + s.owner, + s.axis, + s.segment.a[0], + s.segment.a[1], + s.segment.b[0], + s.segment.b[1] + )?; + } + Ok(()) + }, + )?; + stream( + root, + "trace-points.csv", + "q,segment,x,y,nx_weight,ny_weight", + |w| { + for (i, q) in tr.points.iter().enumerate() { + writeln!( + w, + "{i},{},{:.17e},{:.17e},{:.17e},{:.17e}", + q.record, q.point[0], q.point[1], q.normal_weight[0], q.normal_weight[1] + )?; + } + Ok(()) + }, + )?; + stream(root, "trace-basis.csv", "q,active,phi", |w| { + for (i, q) in tr.points.iter().enumerate() { + for (a, phi) in &q.values { + writeln!(w, "{i},{a},{phi:.17e}")?; + } + } + Ok(()) + })?; + stream(root, "metrics.csv", "name,value,gate", |w| { + for (k, v) in &r.gates { + writeln!(w, "{k},{v:.17e},true")?; + } + for (k, v) in &r.observations { + writeln!(w, "{k},{v:.17e},false")?; + } + Ok(()) + })?; + Ok(()) +} diff --git a/examples/grid_cut_variational_reference/observe.rs b/examples/grid_cut_variational_reference/observe.rs new file mode 100644 index 00000000..132e4ac9 --- /dev/null +++ b/examples/grid_cut_variational_reference/observe.rs @@ -0,0 +1,288 @@ +use super::super::MU; +use super::{ + assembly::{Operators, action, dot}, + basis::{affine, work_vectors}, + trace::Traces, +}; +use std::collections::BTreeMap; +pub struct Report { + pub gates: BTreeMap<&'static str, f64>, + pub observations: BTreeMap<&'static str, f64>, + pub full_load: Vec, + pub omit_load: Vec, +} +fn error(a: f64, b: f64, scale: f64) -> Result { + if !a.is_finite() || !b.is_finite() || !scale.is_finite() || scale <= 0.0 { + return Err("nonfinite observation or invalid fixed scale".into()); + } + let e = (a - b).abs() / scale; + if !e.is_finite() { + return Err("nonfinite scaled observation".into()); + } + Ok(e) +} +fn vector_error(a: &[f64], b: &[f64], scale: f64) -> Result { + if a.len() != b.len() { + return Err("observation shape mismatch".into()); + } + a.iter() + .zip(b) + .try_fold(0.0_f64, |e, (&a, &b)| Ok(e.max(error(a, b, scale)?))) +} +fn maximum(x: &[f64]) -> f64 { + x.iter().map(|x| x.abs()).fold(0.0, f64::max) +} +impl Report { + pub fn new(op: &Operators, tr: &Traces) -> Result { + let h = op.layout.h; + let nv = op.active.len(); + let mut gates = BTreeMap::new(); + let mut observations = BTreeMap::new(); + let mut partition: f64 = 0.0; + let mut reproduction: f64 = 0.0; + for q in &op.quadrature { + for axis in 0..2 { + let values: Vec<_> = q.values.iter().filter(|v| v.axis == axis).collect(); + partition = partition.max(error(values.iter().map(|v| v.phi).sum(), 1.0, 1.0)?); + for d in 0..2 { + reproduction = reproduction.max(error( + values + .iter() + .map(|v| v.phi * op.layout.nodes[v.global].point[d]) + .sum(), + q.point[d], + 1.0, + )?); + } + } + } + for q in &tr.points { + for axis in 0..2 { + let selected: Vec<_> = q + .values + .iter() + .filter(|(i, _)| op.active[*i].axis == axis) + .collect(); + partition = partition.max(error(selected.iter().map(|(_, p)| p).sum(), 1.0, 1.0)?); + for d in 0..2 { + reproduction = reproduction.max(error( + selected + .iter() + .map(|(i, p)| p * op.active[*i].point[d]) + .sum(), + q.point[d], + 1.0, + )?); + } + } + } + gates.insert("partition", partition); + gates.insert("affine_reproduction", reproduction); + let mut gradient: f64 = 0.0; + for (a, b) in op.gradient.iter().zip(&tr.gradient) { + gradient = gradient.max(vector_error(a, b, 1.0)?); + } + gates.insert("nodal_stress_trace", gradient); + let mut flux: f64 = 0.0; + for c in 0..op.cells.len() { + for i in 0..nv { + flux = flux.max(error( + op.divergence[c][i], + tr.grid[c][i] + tr.physical[c][i], + h, + )?); + } + } + gates.insert("every_cell_basis_flux", flux); + let source_m = super::geometry::moments(op.source.vertices())?; + let mut m = [0.0; 6]; + for q in &op.quadrature { + let [x, y] = q.point; + for (t, v) in m.iter_mut().zip([1.0, x, y, x * x, x * y, y * y]) { + *t += q.weight * v; + } + } + gates.insert( + "source_moments", + vector_error( + &m, + &[ + source_m.area, + source_m.first[0], + source_m.first[1], + source_m.second[0], + source_m.second[1], + source_m.second[2], + ], + h * h, + )?, + ); + let affine_values: Vec<_> = op.active.iter().map(affine).collect(); + let rotation: Vec<_> = op + .active + .iter() + .map(|p| if p.axis == 0 { -p.point[1] } else { p.point[0] }) + .collect(); + let translations: [Vec; 2] = std::array::from_fn(|d| { + op.active + .iter() + .map(|p| if p.axis == d { 1.0 } else { 0.0 }) + .collect() + }); + let mut rigid: f64 = 0.0; + for v in translations.iter().chain(std::iter::once(&rotation)) { + rigid = rigid.max(vector_error( + &action(&op.divergence, v), + &vec![0.0; op.cells.len()], + 1.0, + )?); + rigid = rigid.max(vector_error(&action(&op.stiffness, v), &vec![0.0; nv], MU)?); + } + gates.insert("rigid_bulk_actions", rigid); + gates.insert( + "affine_divergence", + vector_error( + &action(&op.divergence, &affine_values), + &vec![0.0; op.cells.len()], + 1.0, + )?, + ); + let mut moment: f64 = 0.0; + for (d, v) in translations + .iter() + .chain(std::iter::once(&rotation)) + .enumerate() + { + let actual = action(&op.mass, v); + let expected: Vec<_> = op.moment.iter().map(|m| m[d]).collect(); + moment = moment.max(vector_error(&actual, &expected, 1.0)?); + } + gates.insert("physical_mass_moments", moment); + let tau = [MU * 0.5, MU * (0.75 - 0.2), -MU * 0.5]; + let sigma = [tau[0] - 2.0, tau[1], tau[2] - 2.0]; + let full_load: Vec<_> = tr.gradient.iter().map(|t| dot(t, &sigma)).collect(); + let omit_load: Vec<_> = tr.gradient.iter().map(|t| dot(t, &tau)).collect(); + let bt1: Vec = (0..nv) + .map(|i| op.divergence.iter().map(|r| r[i]).sum()) + .collect(); + let ku = action(&op.stiffness, &affine_values); + let residual: Vec<_> = ku.iter().zip(&bt1).map(|(k, b)| k - 2.0 * b).collect(); + gates.insert( + "affine_nodal_total_stress", + vector_error(&residual, &full_load, 1.0)?, + ); + let pressure_diff: Vec<_> = omit_load + .iter() + .zip(&full_load) + .map(|(a, b)| a - b) + .collect(); + let pressure_expected: Vec<_> = bt1.iter().map(|b| 2.0 * b).collect(); + gates.insert( + "omitted_pressure_orientation", + vector_error(&pressure_diff, &pressure_expected, 1.0)?, + ); + if maximum(&pressure_diff) == 0.0 { + return Err("pressure-negative control has no nodal signal".into()); + } + let denominator = dot(&bt1, &bt1); + if !denominator.is_finite() || denominator <= 0.0 { + return Err("missing absolute pressure trace direction; no inherited gauge".into()); + } + let affine_minus_load: Vec<_> = ku.iter().zip(&full_load).map(|(a, b)| a - b).collect(); + let pcoefficient = dot(&bt1, &affine_minus_load) / denominator; + gates.insert( + "constant_pressure_load_coefficient", + error(pcoefficient, 2.0, 1.0)?, + ); + observations.insert("constant_pressure_load_coefficient_Pa", pcoefficient); + let a: Vec<_> = op.active.iter().map(|p| work_vectors(p)[0]).collect(); + let b: Vec<_> = op.active.iter().map(|p| work_vectors(p)[1]).collect(); + let delta: Vec<_> = a.iter().zip(&b).map(|(a, b)| a - b).collect(); + let ma = action(&op.mass, &a); + let mb = action(&op.mass, &b); + let md = action(&op.mass, &delta); + let kb = action(&op.stiffness, &b); + gates.insert( + "full_mass_polarization", + error( + 0.5 * dot(&a, &ma) - 0.5 * dot(&b, &mb) + 0.5 * dot(&delta, &md), + dot(&a, &md), + 1.0, + )?, + ); + let mut viscous = 0.0; + let mut bulk_pressure = 0.0; + for q in &op.quadrature { + let mut sa = [0.0; 3]; + let mut sb = [0.0; 3]; + for &v in &q.values { + let i = op.map[v.global]; + let s = super::assembly::strain(v); + for d in 0..3 { + sa[d] += s[d] * a[i]; + sb[d] += s[d] * b[i]; + } + } + viscous += MU * q.weight * (2.0 * sa[0] * sb[0] + 2.0 * sa[1] * sb[1] + sa[2] * sb[2]); + let c = q.cell; + let xc = op.layout.origin[0] + (c % op.layout.n) as f64 * h + h / 2.0; + let yc = op.layout.origin[1] + (c / op.layout.n) as f64 * h + h / 2.0; + let pressure = 0.75 + xc / 8.0 - yc / 4.0; + bulk_pressure += pressure * q.weight * (sa[0] + sa[1]); + } + gates.insert("viscous_work", error(dot(&a, &kb), viscous, MU)?); + let ba = action(&op.divergence, &a); + let pressure: Vec<_> = op + .cells + .iter() + .map(|&c| { + let x = op.layout.origin[0] + (c % op.layout.n) as f64 * h + h / 2.0; + let y = op.layout.origin[1] + (c / op.layout.n) as f64 * h + h / 2.0; + 0.75 + x / 8.0 - y / 4.0 + }) + .collect(); + let btp: Vec = (0..nv) + .map(|i| { + op.divergence + .iter() + .zip(&pressure) + .map(|(r, p)| r[i] * p) + .sum() + }) + .collect(); + gates.insert( + "pressure_work", + error(dot(&a, &btp), dot(&pressure, &ba), 1.0)?.max(error( + dot(&pressure, &ba), + bulk_pressure, + 1.0, + )?), + ); + observations.insert("source_volume", m[0]); + observations.insert( + "minimum_positive_mass_diagonal", + op.mass + .iter() + .enumerate() + .map(|(i, r)| r[i]) + .fold(f64::INFINITY, f64::min), + ); + observations.insert( + "zero_old_dual_active_basis", + op.old_dual.iter().filter(|x| **x == 0.0).count() as f64, + ); + observations.insert("pressure_nodal_signal", maximum(&pressure_diff)); + observations.insert("affine_boundary_power", dot(&affine_values, &full_load)); + observations.insert("fixed_vector_viscous_cross_work", viscous); + observations.insert("fixed_vector_pressure_work", bulk_pressure); + if observations.values().any(|v| !v.is_finite()) || gates.values().any(|v| !v.is_finite()) { + return Err("nonfinite report field".into()); + } + Ok(Self { + gates, + observations, + full_load, + omit_load, + }) + } +} diff --git a/examples/grid_cut_variational_reference/trace.rs b/examples/grid_cut_variational_reference/trace.rs new file mode 100644 index 00000000..f720e2d7 --- /dev/null +++ b/examples/grid_cut_variational_reference/trace.rs @@ -0,0 +1,207 @@ +use super::{ + assembly::{Matrix, Operators, zero}, + clip::{self, QPoint}, + exact::{ExactFace, rational}, + geometry::{Point, Segment}, +}; +#[derive(Clone)] +pub struct Record { + pub kind: &'static str, + pub owner: usize, + pub axis: usize, + pub edge: usize, + pub segment: Segment, +} +pub struct TracePoint { + pub record: usize, + pub point: Point, + pub normal_weight: Point, + pub values: Vec<(usize, f64)>, +} +pub struct Traces { + pub records: Vec, + pub points: Vec, + pub gradient: Vec<[f64; 3]>, + pub grid: Matrix, + pub physical: Matrix, +} +impl Traces { + pub fn build(op: &Operators) -> Result { + let n = op.layout.n; + let h = op.layout.h; + let origin = op.layout.origin; + let nv = op.active.len(); + let planes: [Vec<_>; 2] = std::array::from_fn(|d| { + (0..=2 * n) + .map(|i| rational(origin[d] + i as f64 * h / 2.0).unwrap()) + .collect() + }); + let mut out = Self { + records: Vec::new(), + points: Vec::new(), + gradient: vec![[0.0; 3]; nv], + grid: zero(op.cells.len(), nv), + physical: zero(op.cells.len(), nv), + }; + for (edge, (a, b)) in op + .exact + .points + .iter() + .zip(op.exact.points.iter().cycle().skip(1)) + .take(op.exact.points.len()) + .enumerate() + { + for s in clip::split_segment(&[a.clone(), b.clone()], &planes)? { + let (_, grad) = out.add( + op, + Record { + kind: "global", + owner: edge, + axis: 2, + edge, + segment: s, + }, + )?; + for (t, g) in out.gradient.iter_mut().zip(grad) { + for d in 0..3 { + t[d] += g[d]; + } + } + } + } + let mut faces: [Matrix; 2] = std::array::from_fn(|_| zero(n * (n + 1), nv)); + for (axis, rows) in faces.iter_mut().enumerate() { + let lines = (0..=n) + .map(|i| op.source.line(axis, origin[axis] + i as f64 * h)) + .collect::, _>>()?; + for (id, row) in rows.iter_mut().enumerate() { + let (normal, tangent) = if axis == 0 { + (id % (n + 1), id / (n + 1)) + } else { + (id / n, id % n) + }; + let position = origin[axis] + normal as f64 * h; + if let ExactFace::Positive { lower, upper } = lines[normal].clip( + origin[1 - axis] + tangent as f64 * h, + origin[1 - axis] + (tangent + 1) as f64 * h, + )? { + let p = rational(position)?; + let mut a: QPoint = if axis == 0 { + [p.clone(), lower.clone()] + } else { + [lower.clone(), p.clone()] + }; + let mut b = if axis == 0 { [p, upper] } else { [upper, p] }; + if axis == 1 { + std::mem::swap(&mut a, &mut b); + } + for s in clip::split_segment(&[a, b], &planes)? { + let (flux, _) = out.add( + op, + Record { + kind: "grid", + owner: id, + axis, + edge: usize::MAX, + segment: s, + }, + )?; + for (t, v) in row.iter_mut().zip(flux) { + *t += v; + } + } + } + } + } + for (c, &cell) in op.cells.iter().enumerate() { + let i = cell % n; + let j = cell / n; + for (axis, face, sign) in [ + (0, i + (n + 1) * j, -1.0), + (0, i + 1 + (n + 1) * j, 1.0), + (1, i + n * j, -1.0), + (1, i + n * (j + 1), 1.0), + ] { + for (t, v) in out.grid[c].iter_mut().zip(&faces[axis][face]) { + *t += sign * v; + } + } + let lo = [origin[0] + i as f64 * h, origin[1] + j as f64 * h]; + let hi = [ + origin[0] + (i + 1) as f64 * h, + origin[1] + (j + 1) as f64 * h, + ]; + for (edge, (a, b)) in op + .exact + .points + .iter() + .zip(op.exact.points.iter().cycle().skip(1)) + .take(op.exact.points.len()) + .enumerate() + { + if let Some(segment) = clip::clipped_segment(a, b, lo, hi)? { + for s in clip::split_segment(&segment, &planes)? { + let (flux, _) = out.add( + op, + Record { + kind: "cell", + owner: cell, + axis: 2, + edge, + segment: s, + }, + )?; + for (t, v) in out.physical[c].iter_mut().zip(flux) { + *t += v; + } + } + } + } + } + Ok(out) + } + fn add(&mut self, op: &Operators, record: Record) -> Result<(Vec, Vec<[f64; 3]>), String> { + let id = self.records.len(); + let s = record.segment; + let mid = s.middle(); + let offset: Point = std::array::from_fn(|d| (s.b[d] - s.a[d]) / (2.0 * 3.0_f64.sqrt())); + let normal_weight = s.normal_measure().map(|x| x / 2.0); + let mut flux = vec![0.0; op.active.len()]; + let mut gradient = vec![[0.0; 3]; op.active.len()]; + for sign in [-1.0, 1.0] { + let point: Point = std::array::from_fn(|d| mid[d] + sign * offset[d]); + if point.iter().chain(&normal_weight).any(|x| !x.is_finite()) + || point == s.a + || point == s.b + { + return Err("positive trace integration point collapsed or nonfinite".into()); + } + let mut values = Vec::new(); + for (i, node) in op.active.iter().enumerate() { + let phi = op.layout.trace(node, point); + if !phi.is_finite() { + return Err("nonfinite physical trace basis".into()); + } + if phi != 0.0 { + values.push((i, phi)); + } + flux[i] += phi * normal_weight[node.axis]; + if node.axis == 0 { + gradient[i][0] += phi * normal_weight[0]; + gradient[i][1] += phi * normal_weight[1]; + } else { + gradient[i][1] += phi * normal_weight[0]; + gradient[i][2] += phi * normal_weight[1]; + } + } + self.points.push(TracePoint { + record: id, + point, + normal_weight, + values, + }); + } + self.records.push(record); + Ok((flux, gradient)) + } +} diff --git a/examples/grid_geometry_reference.rs b/examples/grid_geometry_reference.rs new file mode 100644 index 00000000..a7f29f9c --- /dev/null +++ b/examples/grid_geometry_reference.rs @@ -0,0 +1,241 @@ +//! Q2 common-geometry prerequisite; no coupled or production-water claim. +mod grid_geometry_reference { + pub mod diagnostics; + pub mod exact; + pub mod geometry; +} +use grid_geometry_reference::{diagnostics, geometry::Polygon}; +use std::{io::Write, path::Path}; +fn disk_vertices(n: usize) -> Vec<[f64; 2]> { + (0..8 * n) + .map(|k| { + let theta = std::f64::consts::TAU * k as f64 / (8 * n) as f64; + [0.75 * theta.cos(), 0.75 * theta.sin()] + }) + .collect() +} +fn square_vertices(degrees: f64) -> Vec<[f64; 2]> { + let (s, c) = degrees.to_radians().sin_cos(); + [[-0.15, -0.15], [0.15, -0.15], [0.15, 0.15], [-0.15, 0.15]] + .into_iter() + .map(|[x, y]| [0.537 + c * x - s * y, 0.479 + s * x + c * y]) + .collect() +} +#[cfg(test)] +fn disk(n: usize) -> Polygon { + Polygon::new(disk_vertices(n)).unwrap() +} +#[cfg(test)] +fn square(degrees: f64) -> Polygon { + Polygon::new(square_vertices(degrees)).unwrap() +} +fn main() -> Result<(), Box> { + let out = std::env::args_os() + .nth(1) + .expect("fresh output directory required"); + let root = Path::new(&out); + std::fs::create_dir(root)?; + let mut summary = std::io::BufWriter::new(std::fs::File::create(root.join("summary.csv"))?); + writeln!( + summary, + "case,n,mu,source_vertices,area,mx,my,radial_second,exact_area,exact_mx,exact_my,exact_radial_second,normal_closure,linear_closure,cubic_defect,solenoidal_defect,traction_defect,face_mismatch,flux,exact_flux,force_x,force_y,exact_force,wrong_force_x,wrong_force_y,dual_relative_defect,min_positive_volume,mxx,mxy,myy,exact_mxx,exact_mxy,exact_myy" + )?; + for case in ["disk", "square-0", "square-17", "square-31"] { + let levels = if case == "disk" { + [32, 64, 128] + } else { + [16, 32, 64] + }; + for n in levels { + let (source, origin, extent, exact_area, center, exact_radial) = if case == "disk" { + let area = std::f64::consts::PI * 0.75_f64.powi(2); + ( + disk_vertices(n), + [-1.0, -1.0], + 2.0, + area, + [0.0, 0.0], + std::f64::consts::PI * 0.75_f64.powi(4) / 2.0, + ) + } else { + let degrees = case.strip_prefix("square-").unwrap().parse::()?; + ( + square_vertices(degrees), + [0.0, 0.0], + 1.0, + 0.09, + [0.537, 0.479], + 0.09 * (0.537_f64.powi(2) + 0.479_f64.powi(2) + 0.3_f64.powi(2) / 6.0), + ) + }; + let vertices = source.len(); + // Retain exact round-trip inputs even when geometry construction refuses. + let mut inputs = std::io::BufWriter::new(std::fs::File::create( + root.join(format!("inputs-{case}-n{n}.csv")), + )?); + writeln!(inputs, "vertex,x,y")?; + for (id, p) in source.iter().enumerate() { + writeln!(inputs, "{id},{:.17e},{:.17e}", p[0], p[1])?; + } + inputs.flush()?; + let source = + Polygon::new(source).map_err(|e| format!("{case}/n{n} source admission: {e}"))?; + let g = grid_geometry_reference::geometry::Geometry::new(n, origin, extent, source)?; + for mu in [0.1, 0.001002] { + let tag = format!("{case}-n{n}-mu{mu}"); + let m = diagnostics::run(&root.join(&tag), &g, mu)?; + let exact_second = if case == "disk" { + [exact_radial / 2.0, 0.0, exact_radial / 2.0] + } else { + [ + exact_area * (center[0] * center[0] + 0.3 * 0.3 / 12.0), + exact_area * center[0] * center[1], + exact_area * (center[1] * center[1] + 0.3 * 0.3 / 12.0), + ] + }; + writeln!( + summary, + "{case},{n},{mu:.17e},{vertices},{:.17e},{:.17e},{:.17e},{:.17e},{exact_area:.17e},{:.17e},{:.17e},{exact_radial:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + m.area, + m.first[0], + m.first[1], + m.radial_second, + exact_area * center[0], + exact_area * center[1], + m.closure, + m.linear_closure, + m.cubic_defect, + m.solenoidal_defect, + m.traction_defect, + m.face_mismatch, + m.flux, + 3.0 * exact_radial, + m.force[0], + m.force[1], + mu * exact_area, + m.wrong_pressure_force[0], + m.wrong_pressure_force[1], + m.dual_relative_defect, + m.min_positive_volume, + m.second[0], + m.second[1], + m.second[2], + exact_second[0], + exact_second[1], + exact_second[2] + )?; + eprintln!( + "Q2 geometry {tag}: area={:.12e}, closure={:.3e}, flux={:.3e}, stress={:.3e}", + m.area, m.linear_closure, m.cubic_defect, m.traction_defect + ); + } + } + } + summary.flush()?; + Ok(()) +} +#[cfg(test)] +mod tests { + use super::*; + use grid_geometry_reference::geometry::{Geometry, Segment, moments}; + #[test] + fn independent_rectangle_moments_and_closed_flux() { + let p = Polygon::new(vec![[0.1, 0.2], [0.7, 0.2], [0.7, 0.9], [0.1, 0.9]]).unwrap(); + let v = p.clip([0.3, 0.1], [0.9, 0.8]).unwrap(); + let m = moments(&v).unwrap(); + assert!((m.area - 0.4 * 0.6).abs() < 1e-15); + assert!((m.first[0] - 0.4 * 0.6 * 0.5).abs() < 1e-15); + assert!((m.second[2] - 0.4 * (0.8_f64.powi(3) - 0.2_f64.powi(3)) / 3.0).abs() < 1e-15); + let flux: f64 = grid_geometry_reference::geometry::edges(&v) + .map(|(a, b)| Segment { a, b }.integrate(diagnostics::cubic)) + .sum(); + assert!((flux - 3.0 * (m.second[0] + m.second[2])).abs() < 1e-15); + } + #[test] + fn unsupported_orientation_coincidence_and_domain_refuse() { + assert!(Polygon::new(vec![[0.0, 0.0], [0.0, 1.0], [1.0, 0.0]]).is_err()); + let doubled = vec![ + [0.0, 0.0], + [1.0, 0.0], + [1.0, 1.0], + [0.0, 1.0], + [0.0, 0.0], + [1.0, 0.0], + [1.0, 1.0], + [0.0, 1.0], + ]; + assert!(Polygon::new(doubled).is_err()); + assert!(moments(&[[0.0, 0.0], [1.0, 1.0], [2.0, 2.0]]).is_err()); + let p = Polygon::new(vec![[0.0, 0.0], [0.5, 0.0], [0.5, 0.5], [0.0, 0.5]]).unwrap(); + assert!( + Geometry::new(4, [0.0, 0.0], 1.0, p) + .err() + .unwrap() + .contains("coincident") + ); + assert!(Geometry::new(2, [0.0, 0.0], 0.1, square(17.0)).is_err()); + } + #[test] + fn exact_axis_tangent_is_zero_and_positive_sliver_is_retained() { + assert_eq!( + moments(&[ + [-1.3877787807814457e-16, -0.75], + [-1.3777276490407724e-16, -0.75], + [0.0, -0.75] + ]) + .unwrap() + .area, + 0.0 + ); + let a = 0.5; + let dx = 2.0_f64.powi(-30); + let dy = 2.0_f64.powi(-40); + assert_eq!( + moments(&[[a, a], [a + dx, a], [a, a + dy]]).unwrap().area, + dx * dy / 2.0 + ); + } + #[test] + fn nonzero_pressure_traction_and_wrong_boundary_are_distinct() { + let s = Segment { + a: [0.0, 0.0], + b: [1.0, 0.0], + }; + let full = diagnostics::traction(s, 0.1, true); + let wrong = diagnostics::traction(s, 0.1, false); + assert!((full[1] - wrong[1] - 1.05).abs() < 1e-15); + } +} + +#[cfg(test)] +mod exact_tangent_regressions { + use super::*; + use grid_geometry_reference::exact::ExactFace; + #[test] + fn all_five_frozen_native_aperture_artifacts_are_exact_points() { + let sources = [(32, disk(32)), (64, disk(64)), (128, disk(128))]; + for (n, axis, id) in [ + (32, 1, 143), + (64, 0, 2088), + (128, 0, 8272), + (128, 1, 2111), + (128, 1, 14400), + ] { + let p = &sources.iter().find(|(size, _)| *size == n).unwrap().1; + let h = 2.0 / n as f64; + let (normal, tangent) = if axis == 0 { + (id % (n + 1), id / (n + 1)) + } else { + (id / n, id % n) + }; + let position = -1.0 + normal as f64 * h; + let face = p + .line(axis, position) + .unwrap() + .clip(-1.0 + tangent as f64 * h, -1.0 + (tangent + 1) as f64 * h) + .unwrap(); + assert!(matches!(face, ExactFace::Point(_))); + assert!(face.segment(axis, position).unwrap().is_none()); + } + } +} diff --git a/examples/grid_geometry_reference/diagnostics.rs b/examples/grid_geometry_reference/diagnostics.rs new file mode 100644 index 00000000..c799d825 --- /dev/null +++ b/examples/grid_geometry_reference/diagnostics.rs @@ -0,0 +1,316 @@ +use super::geometry::{Geometry, Moments, Point, Region, Segment}; +use std::{io::Write, path::Path}; +pub fn cubic(p: Point) -> Point { + [p[0].powi(3), p[1].powi(3)] +} +pub fn solenoidal(p: Point) -> Point { + [ + p[0] * p[0] + 2.0 * p[0] * p[1], + -2.0 * p[0] * p[1] - p[1] * p[1], + ] +} +pub fn traction(s: Segment, mu: f64, pressure: bool) -> Point { + let [x, y] = s.middle(); + let p = if pressure { + 1.0 + mu * x - 3.0 * mu * y + } else { + 0.0 + }; + let sigma = [ + [4.0 * mu * (x + y) - p, 2.0 * mu * (x - y)], + [2.0 * mu * (x - y), -4.0 * mu * (x + y) - p], + ]; + let n = s.normal_measure(); + std::array::from_fn(|d| sigma[d][0] * n[0] + sigma[d][1] * n[1]) +} +fn moment_row(out: &mut impl Write, kind: &str, index: usize, m: Moments) -> std::io::Result<()> { + writeln!( + out, + "{kind},{index},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + m.area, m.first[0], m.first[1], m.second[0], m.second[1], m.second[2] + ) +} +fn domain_row(out: &mut impl Write, kind: &str, index: usize, r: &Region) -> std::io::Result<()> { + writeln!( + out, + "{kind},{index},{},{},{},{},{}", + r.lo[0].to_bits(), + r.lo[1].to_bits(), + r.hi[0].to_bits(), + r.hi[1].to_bits(), + r.moments.area.to_bits() + ) +} +#[derive(Default)] +pub struct Metrics { + pub area: f64, + pub first: Point, + pub radial_second: f64, + pub second: [f64; 3], + pub closure: f64, + pub linear_closure: f64, + pub cubic_defect: f64, + pub solenoidal_defect: f64, + pub traction_defect: f64, + pub face_mismatch: f64, + pub flux: f64, + pub force: Point, + pub wrong_pressure_force: Point, + pub dual_relative_defect: f64, + pub min_positive_volume: f64, +} +pub fn run(root: &Path, g: &Geometry, mu: f64) -> Result> { + std::fs::create_dir(root)?; + let n = g.grid.counts()[0]; + let h = g.grid.spacing()[0]; + let origin = g.grid.origin(); + let mut source = std::io::BufWriter::new(std::fs::File::create(root.join("source.csv"))?); + writeln!(source, "vertex,x,y")?; + for (i, p) in g.source.vertices().iter().enumerate() { + writeln!(source, "{i},{:.17e},{:.17e}", p[0], p[1])?; + } + let mut moments = std::io::BufWriter::new(std::fs::File::create(root.join("moments.csv"))?); + writeln!(moments, "kind,index,volume,mx,my,mxx,mxy,myy")?; + let mut domains = std::io::BufWriter::new(std::fs::File::create(root.join("domains.csv"))?); + writeln!( + domains, + "kind,index,lo_x_bits,lo_y_bits,hi_x_bits,hi_y_bits,volume_bits" + )?; + let mut faces = std::io::BufWriter::new(std::fs::File::create(root.join("faces.csv"))?); + writeln!( + faces, + "axis,index,ax,ay,bx,by,area,mx,my,cubic_flux,solenoidal_flux" + )?; + let mut topology = std::io::BufWriter::new(std::fs::File::create(root.join("topology.csv"))?); + writeln!( + topology, + "axis,index,position_bits,lo_bits,hi_bits,status,lower_num,lower_den,upper_num,upper_den,represented_length,dual_volume" + )?; + for axis in 0..2 { + for (index, f) in g.faces[axis].iter().enumerate() { + let (normal, tangent) = if axis == 0 { + (index % (n + 1), index / (n + 1)) + } else { + (index / n, index % n) + }; + let position = origin[axis] + normal as f64 * h; + let lo = origin[1 - axis] + tangent as f64 * h; + let hi = origin[1 - axis] + (tangent + 1) as f64 * h; + let bounds = f + .exact + .bounds() + .map(|(l, u)| { + [ + l.numer().to_string(), + l.denom().to_string(), + u.numer().to_string(), + u.denom().to_string(), + ] + }) + .unwrap_or_default(); + writeln!( + topology, + "{axis},{index},{},{},{},{},{},{},{},{},{:.17e},{:.17e}", + position.to_bits(), + lo.to_bits(), + hi.to_bits(), + f.exact.status(), + bounds[0], + bounds[1], + bounds[2], + bounds[3], + f.segment.map_or(0.0, |s| s.normal_measure()[axis]), + f.dual.moments.area + )?; + moment_row( + &mut moments, + if axis == 0 { "dual-x" } else { "dual-y" }, + index, + f.dual.moments, + )?; + domain_row( + &mut domains, + if axis == 0 { "dual-x" } else { "dual-y" }, + index, + &f.dual, + )?; + if let Some(s) = f.segment { + let length = s.normal_measure()[axis]; + let mid = s.middle(); + writeln!( + faces, + "{axis},{index},{:.17e},{:.17e},{:.17e},{:.17e},{length:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + s.a[0], + s.a[1], + s.b[0], + s.b[1], + length * mid[0], + length * mid[1], + s.integrate(cubic), + s.integrate(solenoidal) + )?; + } + } + } + for (index, m) in g.shear.iter().enumerate() { + moment_row(&mut moments, "shear", index, m.moments)?; + domain_row(&mut domains, "shear", index, m)?; + } + let mut boundary = std::io::BufWriter::new(std::fs::File::create(root.join("boundary.csv"))?); + writeln!( + boundary, + "cell,edge,ax,ay,bx,by,nx_ds,ny_ds,mx_nx,my_nx,mx_ny,my_ny,cubic_flux,solenoidal_flux,pressure,tx,ty,wrong_tx,wrong_ty" + )?; + let mut ledger = std::io::BufWriter::new(std::fs::File::create(root.join("cell-ledger.csv"))?); + writeln!( + ledger, + "cell,volume,normal_x,normal_y,x_nx,y_nx,x_ny,y_ny,cubic_flux,cubic_expected,solenoidal_flux,traction_x,traction_y,traction_expected,wrong_tx,wrong_ty,face_mismatch" + )?; + let mut m = Metrics { + min_positive_volume: f64::INFINITY, + ..Metrics::default() + }; + for (index, cell) in g.cells.iter().enumerate() { + moment_row(&mut moments, "cell", index, cell.region.moments)?; + domain_row(&mut domains, "cell", index, &cell.region)?; + let i = index % n; + let j = index / n; + let mut normal = [0.0; 2]; + let mut first = [[0.0; 2]; 2]; + let mut cubic_flux = 0.0; + let mut div_free_flux = 0.0; + let mut force = [0.0; 2]; + let mut wrong = [0.0; 2]; + let mut face_error: f64 = 0.0; + let mut add = |s: Segment| { + let ns = s.normal_measure(); + let mid = s.middle(); + let t = traction(s, mu, true); + let z = traction(s, mu, false); + for d in 0..2 { + normal[d] += ns[d]; + force[d] += t[d]; + wrong[d] += z[d]; + for e in 0..2 { + first[d][e] += ns[d] * mid[e]; + } + } + cubic_flux += s.integrate(cubic); + div_free_flux += s.integrate(solenoidal); + }; + for (axis, face, sign) in g.cell_faces(i, j) { + let expected = g.faces[axis][face] + .segment + .map_or(0.0, |s| s.normal_measure()[axis]); + let plane = origin[axis] + + (if axis == 0 { i } else { j }) as f64 * h + + if sign > 0.0 { h } else { 0.0 }; + let actual: f64 = super::geometry::edges(&cell.clipped) + .filter(|(a, b)| a[axis] == plane && b[axis] == plane) + .map(|(a, b)| (b[1 - axis] - a[1 - axis]).abs()) + .sum(); + face_error = face_error.max((actual - expected).abs()); + if let Some(mut s) = g.faces[axis][face].segment { + if sign < 0.0 { + std::mem::swap(&mut s.a, &mut s.b); + } + add(s); + } + } + for piece in &cell.physical { + let s = piece.segment; + add(s); + let ns = s.normal_measure(); + let mid = s.middle(); + let t = traction(s, mu, true); + let z = traction(s, mu, false); + writeln!( + boundary, + "{index},{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + piece.edge, + s.a[0], + s.a[1], + s.b[0], + s.b[1], + ns[0], + ns[1], + ns[0] * mid[0], + ns[0] * mid[1], + ns[1] * mid[0], + ns[1] * mid[1], + s.integrate(cubic), + s.integrate(solenoidal), + 1.0 + mu * mid[0] - 3.0 * mu * mid[1], + t[0], + t[1], + z[0], + z[1] + )?; + m.flux += s.integrate(cubic); + for d in 0..2 { + m.force[d] += t[d]; + m.wrong_pressure_force[d] += z[d]; + } + } + let area = cell.region.moments.area; + let cubic_expected = 3.0 * (cell.region.moments.second[0] + cell.region.moments.second[2]); + writeln!( + ledger, + "{index},{area:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{cubic_flux:.17e},{cubic_expected:.17e},{div_free_flux:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{face_error:.17e}", + normal[0], + normal[1], + first[0][0], + first[0][1], + first[1][0], + first[1][1], + force[0], + force[1], + mu * area, + wrong[0], + wrong[1] + )?; + m.area += area; + for d in 0..2 { + m.first[d] += cell.region.moments.first[d]; + } + m.radial_second += cell.region.moments.second[0] + cell.region.moments.second[2]; + for (d, value) in cell.region.moments.second.into_iter().enumerate() { + m.second[d] += value; + } + if area > 0.0 { + m.min_positive_volume = m.min_positive_volume.min(area); + } + for d in 0..2 { + m.closure = m.closure.max(normal[d].abs() / h); + m.traction_defect = m + .traction_defect + .max((force[d] - mu * area).abs() / (h * h)); + for (e, value) in first[d].iter().enumerate() { + m.linear_closure = m + .linear_closure + .max((*value - if d == e { area } else { 0.0 }).abs() / (h * h)); + } + } + m.face_mismatch = m.face_mismatch.max(face_error / h); + m.cubic_defect = m + .cubic_defect + .max((cubic_flux - cubic_expected).abs() / (h * h)); + m.solenoidal_defect = m.solenoidal_defect.max(div_free_flux.abs() / (h * h)); + } + let dual_sums = [ + g.faces[0].iter().map(|f| f.dual.moments.area).sum::(), + g.faces[1].iter().map(|f| f.dual.moments.area).sum::(), + g.shear.iter().map(|r| r.moments.area).sum::(), + ]; + for sum in dual_sums { + m.dual_relative_defect = m.dual_relative_defect.max((sum - m.area).abs() / m.area); + } + source.flush()?; + moments.flush()?; + domains.flush()?; + faces.flush()?; + topology.flush()?; + boundary.flush()?; + ledger.flush()?; + Ok(m) +} diff --git a/examples/grid_geometry_reference/exact.rs b/examples/grid_geometry_reference/exact.rs new file mode 100644 index 00000000..e30cce2e --- /dev/null +++ b/examples/grid_geometry_reference/exact.rs @@ -0,0 +1,225 @@ +//! Exact represented-binary64 source predicates; numerical endpoints are secondary. +use super::geometry::{Point, Segment}; +use num_rational::BigRational; +use num_traits::{ToPrimitive, Zero}; + +pub fn rational(x: f64) -> Result { + BigRational::from_float(x).ok_or_else(|| "finite exact-coordinate input required".into()) +} +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum ExactFace { + Empty, + Point(BigRational), + Positive { + lower: BigRational, + upper: BigRational, + }, +} +impl ExactFace { + pub fn status(&self) -> &'static str { + match self { + Self::Empty => "empty", + Self::Point(_) => "point", + Self::Positive { .. } => "positive", + } + } + pub fn bounds(&self) -> Option<(&BigRational, &BigRational)> { + match self { + Self::Empty => None, + Self::Point(x) => Some((x, x)), + Self::Positive { lower, upper } => Some((lower, upper)), + } + } + pub fn segment(&self, axis: usize, position: f64) -> Result, String> { + if axis > 1 || !position.is_finite() { + return Err("invalid face construction axis/position".into()); + } + let Self::Positive { lower, upper } = self else { + return Ok(None); + }; + let lo = lower + .to_f64() + .ok_or("unrepresentable positive face lower endpoint")?; + let hi = upper + .to_f64() + .ok_or("unrepresentable positive face upper endpoint")?; + if !lo.is_finite() || !hi.is_finite() || hi <= lo || !(hi - lo).is_finite() { + return Err( + "exact positive aperture unrepresentable as a positive finite f64 segment".into(), + ); + } + let mut a = [0.0; 2]; + let mut b = [0.0; 2]; + a[axis] = position; + b[axis] = position; + a[1 - axis] = lo; + b[1 - axis] = hi; + if axis == 1 { + std::mem::swap(&mut a, &mut b); + } + Ok(Some(Segment { a, b })) + } +} +#[derive(Clone)] +pub struct LineSection { + bounds: Option<(BigRational, BigRational)>, +} +impl LineSection { + pub fn clip(&self, lo: f64, hi: f64) -> Result { + if !lo.is_finite() || !hi.is_finite() || lo >= hi { + return Err("finite ordered face span required".into()); + } + let Some((lower, upper)) = &self.bounds else { + return Ok(ExactFace::Empty); + }; + let lower = lower.clone().max(rational(lo)?); + let upper = upper.clone().min(rational(hi)?); + Ok(match upper.cmp(&lower) { + std::cmp::Ordering::Less => ExactFace::Empty, + std::cmp::Ordering::Equal => ExactFace::Point(lower), + std::cmp::Ordering::Greater => ExactFace::Positive { lower, upper }, + }) + } +} +#[derive(Clone)] +pub struct ExactPolygon { + points: Vec<[BigRational; 2]>, + inputs: Vec, +} +impl ExactPolygon { + pub fn new(vertices: &[Point]) -> Result { + if !(3..=1024).contains(&vertices.len()) { + return Err("exact reference source requires 3..1024 vertices".into()); + } + let points: Vec<_> = vertices + .iter() + .map(|p| Ok([rational(p[0])?, rational(p[1])?])) + .collect::>()?; + for (i, p) in points.iter().enumerate() { + if points[..i].contains(p) { + return Err("repeated exact source vertex".into()); + } + } + let mut twice_area = BigRational::zero(); + for (i, a) in points.iter().enumerate() { + let b = &points[(i + 1) % points.len()]; + twice_area += &a[0] * &b[1] - &a[1] * &b[0]; + let e = [&b[0] - &a[0], &b[1] - &a[1]]; + for p in &points { + if &e[0] * (&p[1] - &a[1]) - &e[1] * (&p[0] - &a[0]) < BigRational::zero() { + return Err("exact convex CCW source required".into()); + } + } + } + if twice_area <= BigRational::zero() { + return Err("exact positive source area required".into()); + } + Ok(Self { + points, + inputs: vertices.to_vec(), + }) + } + /// f64 comparisons are exact comparisons of the finite represented inputs. + /// Only strict straddles divide; constructed points remain rational. + pub fn line(&self, axis: usize, position: f64) -> Result { + if axis > 1 || !position.is_finite() { + return Err("invalid exact source-line query".into()); + } + let p = rational(position)?; + let tangent = 1 - axis; + let mut hits = Vec::new(); + for (i, a) in self.inputs.iter().enumerate() { + let j = (i + 1) % self.inputs.len(); + let b = self.inputs[j]; + let qa = &self.points[i]; + let qb = &self.points[j]; + if a[axis] == position { + hits.push(qa[tangent].clone()); + } + if (a[axis] < position && b[axis] > position) + || (a[axis] > position && b[axis] < position) + { + hits.push( + &qa[tangent] + + (&p - &qa[axis]) * (&qb[tangent] - &qa[tangent]) + / (&qb[axis] - &qa[axis]), + ); + } + } + Ok(LineSection { + bounds: hits.iter().min().cloned().zip(hits.iter().max().cloned()), + }) + } +} +#[cfg(test)] +mod tests { + use super::*; + fn diamond() -> (Vec, ExactPolygon) { + let p = vec![[-0.5, 0.0], [0.0, -0.5], [0.5, 0.0], [0.0, 0.5]]; + let exact = ExactPolygon::new(&p).unwrap(); + (p, exact) + } + #[test] + fn binary64_conversion_is_exact_not_decimal_approximation() { + assert_eq!( + rational(0.5).unwrap() * rational(2.0).unwrap(), + rational(1.0).unwrap() + ); + assert_ne!( + rational(0.1).unwrap() * rational(10.0).unwrap(), + rational(1.0).unwrap() + ); + assert!(rational(f64::NAN).is_err()); + } + #[test] + fn tangent_and_adjacent_binary64_positions_have_distinct_dimensions() { + let (_, e) = diamond(); + assert!(matches!( + e.line(0, 0.5).unwrap().clip(-1.0, 1.0).unwrap(), + ExactFace::Point(_) + )); + assert_eq!( + e.line(0, 0.5_f64.next_up()) + .unwrap() + .clip(-1.0, 1.0) + .unwrap(), + ExactFace::Empty + ); + assert!(matches!( + e.line(0, 0.5_f64.next_down()) + .unwrap() + .clip(-1.0, 1.0) + .unwrap(), + ExactFace::Positive { .. } + )); + for axis in [0, 1] { + let f = e.line(axis, 0.0).unwrap().clip(-0.25, 0.25).unwrap(); + assert!(f.segment(axis, 0.0).unwrap().unwrap().normal_measure()[axis] > 0.0); + } + } + #[test] + fn positive_exact_interval_cannot_silently_collapse_to_empty() { + let lower = rational(1.0).unwrap(); + let upper = &lower + rational(2.0_f64.powi(-200)).unwrap(); + let face = ExactFace::Positive { lower, upper }; + assert!( + face.segment(0, 0.0) + .unwrap_err() + .contains("unrepresentable") + ); + } + #[test] + fn source_admission_uses_exact_convexity_and_unique_vertices() { + assert!(ExactPolygon::new(&[[0.0, 0.0], [0.0, 1.0], [1.0, 0.0]]).is_err()); + assert!(ExactPolygon::new(&[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 0.0]]).is_err()); + assert!( + ExactPolygon::new(&[ + [0.0, 0.0], + [1.0, 0.0], + [0.5, -f64::MIN_POSITIVE], + [0.0, 1.0] + ]) + .is_err() + ); + } +} diff --git a/examples/grid_geometry_reference/geometry.rs b/examples/grid_geometry_reference/geometry.rs new file mode 100644 index 00000000..13a0db6e --- /dev/null +++ b/examples/grid_geometry_reference/geometry.rs @@ -0,0 +1,338 @@ +//! Private planar common-geometry reference, version 3. No production DOF policy. +use rheon::GridGeometry; +pub type Point = [f64; 2]; +#[derive(Clone, Copy, Debug, Default)] +pub struct Moments { + pub area: f64, + pub first: Point, + pub second: [f64; 3], // xx, xy, yy +} +#[derive(Clone, Copy, Debug)] +pub struct Segment { + pub a: Point, + pub b: Point, +} +impl Segment { + pub fn normal_measure(self) -> Point { + [self.b[1] - self.a[1], self.a[0] - self.b[0]] + } + pub fn middle(self) -> Point { + [(self.a[0] + self.b[0]) * 0.5, (self.a[1] + self.b[1]) * 0.5] + } + pub fn integrate(self, f: impl Fn(Point) -> Point) -> f64 { + let mid = self.middle(); + let offset = + std::array::from_fn::<_, 2, _>(|d| (self.b[d] - self.a[d]) / (2.0 * 3.0_f64.sqrt())); + let left = f(std::array::from_fn(|d| mid[d] - offset[d])); + let right = f(std::array::from_fn(|d| mid[d] + offset[d])); + let normal = self.normal_measure(); + (0..2).map(|d| normal[d] * (left[d] + right[d]) * 0.5).sum() + } +} +fn cross(a: Point, b: Point) -> f64 { + a[0] * b[1] - a[1] * b[0] +} +#[derive(Clone)] +pub struct Polygon { + vertices: Vec, + exact: super::exact::ExactPolygon, +} +impl Polygon { + pub fn vertices(&self) -> &[Point] { + &self.vertices + } + pub fn line(&self, axis: usize, position: f64) -> Result { + self.exact.line(axis, position) + } + pub fn new(vertices: Vec) -> Result { + if vertices.len() < 3 || vertices.iter().flatten().any(|x| !x.is_finite()) { + return Err("finite convex CCW polygon with at least three vertices required".into()); + } + for (i, p) in vertices.iter().enumerate() { + if vertices[..i].contains(p) { + return Err("repeated source vertex or repeated winding unsupported".into()); + } + } + for (a, b) in edges(&vertices) { + if a == b + || vertices + .iter() + .any(|p| cross([b[0] - a[0], b[1] - a[1]], [p[0] - a[0], p[1] - a[1]]) < 0.0) + { + return Err("polygon must be convex CCW without repeated edges".into()); + } + } + if moments(&vertices)?.area <= 0.0 { + return Err("positive polygon area required".into()); + } + let exact = super::exact::ExactPolygon::new(&vertices)?; + Ok(Self { vertices, exact }) + } + pub fn clip(&self, lo: Point, hi: Point) -> Result, String> { + if (0..2).any(|d| !lo[d].is_finite() || !hi[d].is_finite() || lo[d] >= hi[d]) { + return Err("invalid clipping box".into()); + } + let mut v = self.vertices.clone(); + for d in 0..2 { + for (plane, sign) in [(lo[d], 1.0), (hi[d], -1.0)] { + let mut next = Vec::new(); + for (a, b) in edges(&v) { + let inside_a = sign * (a[d] - plane) >= 0.0; + let inside_b = sign * (b[d] - plane) >= 0.0; + if inside_a != inside_b { + let t = (plane - a[d]) / (b[d] - a[d]); + let mut p = std::array::from_fn(|k| a[k] + t * (b[k] - a[k])); + p[d] = plane; + if next.last() != Some(&p) { + next.push(p); + } + } + if inside_b && next.last() != Some(&b) { + next.push(b); + } + } + if next.len() > 1 && next.first() == next.last() { + next.pop(); + } + v = next; + } + } + Ok(v) + } +} +pub fn edges(v: &[Point]) -> impl Iterator + '_ { + v.iter() + .copied() + .zip(v.iter().copied().cycle().skip(1)) + .take(v.len()) +} +pub fn moments(v: &[Point]) -> Result { + if v.len() < 3 { + return Ok(Moments::default()); + } + // Accumulate about a polygon vertex. This avoids cancellation of large + // global shoelace terms for small positive cut regions. + let anchor = v[0]; + let local: Vec = v + .iter() + .map(|p| [p[0] - anchor[0], p[1] - anchor[1]]) + .collect(); + let mut m = Moments::default(); + for (a, b) in edges(&local) { + let c = cross(a, b); + if c < 0.0 { + return Err("unresolved cut orientation; no sliver deletion permitted".into()); + } + m.area += c / 2.0; + for d in 0..2 { + m.first[d] += (a[d] + b[d]) * c / 6.0; + } + m.second[0] += (a[0] * a[0] + a[0] * b[0] + b[0] * b[0]) * c / 12.0; + m.second[1] += + (2.0 * a[0] * a[1] + a[0] * b[1] + b[0] * a[1] + 2.0 * b[0] * b[1]) * c / 24.0; + m.second[2] += (a[1] * a[1] + a[1] * b[1] + b[1] * b[1]) * c / 12.0; + } + if m.area == 0.0 { + // Exact coordinate equality certifies zero measure for represented + // horizontal/vertical tangent polygons. No positive area tolerance. + if (0..2).any(|d| v.iter().all(|p| p[d] == v[0][d])) { + return Ok(Moments::default()); + } + return Err("unresolved zero-area cut with three or more represented vertices".into()); + } + m.second[0] += 2.0 * anchor[0] * m.first[0] + anchor[0] * anchor[0] * m.area; + m.second[1] += anchor[0] * m.first[1] + anchor[1] * m.first[0] + anchor[0] * anchor[1] * m.area; + m.second[2] += 2.0 * anchor[1] * m.first[1] + anchor[1] * anchor[1] * m.area; + for (d, a) in anchor.into_iter().enumerate() { + m.first[d] += a * m.area; + } + if !m.area.is_finite() + || m.area < 0.0 + || m.first.iter().chain(&m.second).any(|x| !x.is_finite()) + { + return Err("invalid polygon moments; no sliver floor permitted".into()); + } + Ok(m) +} +fn clip_segment(s: Segment, lo: Point, hi: Point) -> Option { + let mut lower: f64 = 0.0; + let mut upper: f64 = 1.0; + for d in 0..2 { + let delta = s.b[d] - s.a[d]; + if delta == 0.0 { + if s.a[d] < lo[d] || s.a[d] > hi[d] { + return None; + } + } else { + let t0 = (lo[d] - s.a[d]) / delta; + let t1 = (hi[d] - s.a[d]) / delta; + lower = lower.max(t0.min(t1)); + upper = upper.min(t0.max(t1)); + } + } + if upper <= lower { + return None; + } + let a = std::array::from_fn(|d| s.a[d] + lower * (s.b[d] - s.a[d])); + let b = std::array::from_fn(|d| s.a[d] + upper * (s.b[d] - s.a[d])); + Some(Segment { a, b }) +} +pub struct BoundaryPiece { + pub edge: usize, + pub segment: Segment, +} +pub struct Region { + pub moments: Moments, + pub lo: Point, + pub hi: Point, +} +impl Region { + fn clip(source: &Polygon, lo: Point, hi: Point) -> Result { + Ok(Self { + moments: moments(&source.clip(lo, hi)?)?, + lo, + hi, + }) + } +} +pub struct Cell { + pub region: Region, + pub physical: Vec, + pub clipped: Vec, +} +pub struct Face { + pub segment: Option, + pub dual: Region, + pub exact: super::exact::ExactFace, +} +pub struct Geometry { + pub grid: GridGeometry, + pub source: Polygon, + pub cells: Vec, + pub faces: [Vec; 2], + pub shear: Vec, +} +impl Geometry { + pub fn new(n: usize, origin: Point, extent: f64, source: Polygon) -> Result { + if !(1..=128).contains(&n) || !extent.is_finite() || extent <= 0.0 { + return Err("bounded reference grid n1..128 required".into()); + } + let h = extent / n as f64; + let grid = GridGeometry::new( + [n as u64, n as u64, 1], + [h, h, 1.0], + [origin[0], origin[1], 0.0], + ) + .map_err(|e| format!("{e:?}"))?; + if source + .vertices + .iter() + .any(|p| (0..2).any(|d| p[d] < origin[d] || p[d] > origin[d] + extent)) + { + return Err("source must be contained by reference grid".into()); + } + // A finite source edge on a primal grid plane needs an explicit ownership + // policy. This bounded reference refuses it, rather than counting it twice. + for (a, b) in edges(&source.vertices) { + for d in 0..2 { + if a[d] == b[d] && (0..=n).any(|k| a[d] == origin[d] + k as f64 * h) { + return Err( + "source edge coincident with primal grid plane unsupported in geometry reference" + .into(), + ); + } + } + } + let mut cells = Vec::with_capacity(n * n); + for j in 0..n { + for i in 0..n { + let lo = [origin[0] + i as f64 * h, origin[1] + j as f64 * h]; + let hi = [ + origin[0] + (i + 1) as f64 * h, + origin[1] + (j + 1) as f64 * h, + ]; + let clipped = source + .clip(lo, hi) + .map_err(|e| format!("cell ({i},{j}) clip: {e}"))?; + let m = moments(&clipped).map_err(|e| format!("cell ({i},{j}) moments: {e}"))?; + let physical = edges(&source.vertices) + .enumerate() + .filter_map(|(edge, (a, b))| { + clip_segment(Segment { a, b }, lo, hi) + .map(|segment| BoundaryPiece { edge, segment }) + }) + .collect(); + cells.push(Cell { + region: Region { moments: m, lo, hi }, + physical, + clipped, + }); + } + } + let mut faces: [Vec; 2] = std::array::from_fn(|_| Vec::with_capacity(n * (n + 1))); + for (axis, collection) in faces.iter_mut().enumerate() { + let lines: Vec<_> = (0..=n) + .map(|i| source.line(axis, origin[axis] + i as f64 * h)) + .collect::>()?; + let counts = grid.face_counts(if axis == 0 { + rheon::Axis::X + } else { + rheon::Axis::Y + }); + for y in 0..counts[1] { + for x in 0..counts[0] { + let (i, j) = if axis == 0 { (x, y) } else { (y, x) }; + let position = origin[axis] + i as f64 * h; + let lo = origin[1 - axis] + j as f64 * h; + let hi = origin[1 - axis] + (j + 1) as f64 * h; + let exact = lines[i].clip(lo, hi)?; + let segment = exact + .segment(axis, position) + .map_err(|e| format!("face axis{axis} ({x},{y}): {e}"))?; + let center = if axis == 0 { + [position, (lo + hi) / 2.0] + } else { + [(lo + hi) / 2.0, position] + }; + let dual = Region::clip( + &source, + center.map(|x| x - h / 2.0), + center.map(|x| x + h / 2.0), + ) + .map_err(|e| format!("face axis{axis} ({x},{y}) dual moments: {e}"))?; + collection.push(Face { + segment, + dual, + exact, + }); + } + } + } + let mut shear = Vec::with_capacity((n + 1) * (n + 1)); + for j in 0..=n { + for i in 0..=n { + let c = [origin[0] + i as f64 * h, origin[1] + j as f64 * h]; + shear.push( + Region::clip(&source, c.map(|x| x - h / 2.0), c.map(|x| x + h / 2.0)) + .map_err(|e| format!("shear ({i},{j}) moments: {e}"))?, + ); + } + } + Ok(Self { + grid, + source, + cells, + faces, + shear, + }) + } + pub fn cell_faces(&self, i: usize, j: usize) -> [(usize, usize, f64); 4] { + let n = self.grid.counts()[0]; + [ + (0, i + (n + 1) * j, -1.0), + (0, i + 1 + (n + 1) * j, 1.0), + (1, i + n * j, -1.0), + (1, i + n * (j + 1), 1.0), + ] + } +} diff --git a/examples/grid_static_mms_reference.rs b/examples/grid_static_mms_reference.rs new file mode 100644 index 00000000..be16a5a4 --- /dev/null +++ b/examples/grid_static_mms_reference.rs @@ -0,0 +1,128 @@ +//! CV3-A private static polygon manufactured-solution preparation. +//! Execution requires the separately frozen source/oracle/resource admission. +#[allow(dead_code)] +mod grid_cut_variational_reference { + #[path = "../grid_cut_variational_reference/assembly.rs"] + pub mod assembly; + #[path = "../grid_cut_variational_reference/basis.rs"] + pub mod basis; + #[path = "../grid_cut_variational_reference/clip.rs"] + pub mod clip; + #[path = "../grid_geometry_reference/exact.rs"] + pub mod exact; + #[path = "../grid_cut_variational_reference/export.rs"] + pub mod export; + #[path = "../grid_geometry_reference/geometry.rs"] + pub mod geometry; + #[path = "../grid_cut_variational_reference/observe.rs"] + pub mod observe; + #[path = "../grid_cut_variational_reference/trace.rs"] + pub mod trace; +} +#[allow(dead_code)] +mod grid_cut_coupled_reference { + #[path = "../grid_cut_coupled_reference/solver.rs"] + pub mod solver; +} +mod grid_static_mms_reference { + pub mod cases; + pub mod experiment; + pub mod field; + pub mod loads; +} +const RHO: f64 = 1.0; +const MU: f64 = 0.1; +const GATE: f64 = 1e-10; +fn main() -> Result<(), Box> { + let args: Vec<_> = std::env::args_os().skip(1).collect(); + if args.len() != 2 { + return Err("fresh output directory and one exact CV3-A case required".into()); + } + let name = args[1].to_str().ok_or("UTF8 fixed case required")?; + let case = grid_static_mms_reference::cases::cases() + .into_iter() + .find(|c| c.name == name) + .ok_or("case is not in the frozen nine-case corpus")?; + let root = std::path::Path::new(&args[0]); + std::fs::create_dir(root)?; + match grid_static_mms_reference::experiment::run(root, &case) { + Ok(()) => Ok(()), + Err(e) => { + std::fs::write(root.join("refusal.txt"), &e)?; + Err(e.into()) + } + } +} + +#[cfg(test)] +mod preparation_contracts { + use super::{ + grid_cut_coupled_reference::solver, + grid_cut_variational_reference::{ + basis::{GAUSS_WEIGHTS, Layout, gauss_nodes}, + geometry::Polygon, + }, + grid_static_mms_reference::{cases, field}, + }; + #[test] + #[ignore = "CV3-A preparation: requires the frozen oracle/resource execution admission"] + fn n16_ceiling_retains_complete_lattice_and_refuses_above_ceiling_before_allocation() { + let source = Polygon::new(cases::cases()[0].vertices.clone()).unwrap(); + assert_eq!( + Layout::new(16, [0.0; 2], 1.0, &source).unwrap().nodes.len(), + 544 + ); + for n in [0, 1, 17, usize::MAX] { + assert!( + Layout::new(n, [0.0; 2], 1.0, &source) + .err() + .unwrap() + .contains("n2..16") + ); + } + let mut above_cap = vec![vec![0.0; 545]; 545]; + for (i, row) in above_cap.iter_mut().enumerate() { + row[i] = 1.0; + } + assert!( + solver::cholesky(&above_cap) + .unwrap_err() + .contains("bounded") + ); + assert!( + solver::qr(&vec![vec![1.0]; 545]) + .unwrap_err() + .contains("bounded") + ); + } + #[test] + #[ignore = "CV3-A preparation: requires the frozen oracle/resource execution admission"] + fn new_trace_rule_resolves_degree_four_that_old_two_point_rule_misses() { + let actual: f64 = gauss_nodes() + .iter() + .zip(GAUSS_WEIGHTS) + .map(|(t, w)| w * t.powi(4)) + .sum(); + let old: f64 = [ + (1.0 - 1.0 / 3.0_f64.sqrt()) / 2.0, + (1.0 + 1.0 / 3.0_f64.sqrt()) / 2.0, + ] + .iter() + .map(|t| 0.5 * t.powi(4)) + .sum(); + assert!((actual - 1.0 / 5.0).abs() < 1e-14); + assert!((old - 1.0 / 5.0).abs() > 1e-3); + } + #[test] + #[ignore = "CV3-A preparation: requires the frozen oracle/resource execution admission"] + fn continuum_keeps_absolute_pressure_and_outward_traction_sign() { + let point = [0.375, 0.625]; + let gradient = field::gradient(point); + assert_eq!(gradient[0][0] + gradient[1][1], 0.0); + let sigma = field::stress(point); + assert_eq!(field::traction(point, [1.0, 0.0]), [sigma[0], sigma[1]]); + assert_eq!(field::traction(point, [-1.0, 0.0]), [-sigma[0], -sigma[1]]); + assert!(field::pressure(point) > 1.0); + assert_eq!(cases::cases().len(), 9); + } +} diff --git a/examples/grid_static_mms_reference/cases.rs b/examples/grid_static_mms_reference/cases.rs new file mode 100644 index 00000000..23e52b6c --- /dev/null +++ b/examples/grid_static_mms_reference/cases.rs @@ -0,0 +1,56 @@ +//! Source coordinates are pinned to CV1 raw bytes, never regenerated by trig. +#[derive(Clone)] +pub struct Case { + pub name: String, + pub n: usize, + pub phase: &'static str, + pub geometry: &'static str, + pub source_sha256: &'static str, + pub origin: [f64; 2], + pub vertices: Vec<[f64; 2]>, +} +pub fn cases() -> Vec { + let rect = [ + [0x3fc5c28f5c28f5c3, 0x3fcd70a3d70a3d71], + [0x3fea8f5c28f5c28f, 0x3fcd70a3d70a3d71], + [0x3fea8f5c28f5c28f, 0x3fe947ae147ae148], + [0x3fc5c28f5c28f5c3, 0x3fe947ae147ae148], + ]; + let square = [ + [0x3fdbfe86b0ab8be6, 0x3fd2ab30509fa4da], + [0x3fe72d7a4647bae3, 0x3fd848410ee0cb62], + [0x3fe45ef1e727279f, 0x3fe5525775625aa1], + [0x3fd66175f26a655e, 0x3fe283cf1641c75d], + ]; + let mut out = Vec::new(); + for (geometry, bits, hash, phases) in [ + ( + "rectangle", + rect, + "860b4140b7483797842e6c6bdeb1e661d1e8510fb0855cf9a69b772914208666", + 1, + ), + ( + "square-17", + square, + "2a2938a1ae4b12bfcc6c33ff3cb8fc332fc55436e1247c32638e8b83fde1b6cc", + 2, + ), + ] { + for phase in 0..phases { + for n in [4, 8, 16] { + let phase_name = if phase == 0 { "origin" } else { "quarter" }; + out.push(Case { + name: format!("{geometry}-{phase_name}-n{n}"), + n, + phase: phase_name, + geometry, + source_sha256: hash, + origin: [if phase == 0 { 0.0 } else { 0.25 / n as f64 }; 2], + vertices: bits.map(|p| p.map(f64::from_bits)).to_vec(), + }); + } + } + } + out +} diff --git a/examples/grid_static_mms_reference/experiment.rs b/examples/grid_static_mms_reference/experiment.rs new file mode 100644 index 00000000..a152124c --- /dev/null +++ b/examples/grid_static_mms_reference/experiment.rs @@ -0,0 +1,388 @@ +use super::super::{ + GATE, MU, RHO, + grid_cut_coupled_reference::solver::{Factor, action, dot}, + grid_cut_variational_reference::{ + assembly::Operators, export, geometry::Polygon, observe::Report, trace::Traces, + }, +}; +use super::{cases::Case, field, loads::Loads}; +use std::{ + collections::BTreeMap, + fs::File, + io::{BufWriter, Write}, + path::Path, +}; +fn writer(root: &Path, name: &str, header: &str) -> Result, String> { + let mut w = BufWriter::new(File::create(root.join(name)).map_err(|e| e.to_string())?); + writeln!(w, "{header}").map_err(|e| e.to_string())?; + Ok(w) +} +fn scaled(value: f64, scale: f64) -> Result { + if !value.is_finite() || !scale.is_finite() || scale <= 0.0 { + return Err("invalid CV3 fixed normalization".into()); + } + Ok(value.abs() / scale) +} +pub fn run(root: &Path, case: &Case) -> Result<(), String> { + let operators = root.join("operators"); + std::fs::create_dir(&operators).map_err(|e| e.to_string())?; + export::inputs(&operators, &case.vertices, case.n, case.origin, 1.0) + .map_err(|e| e.to_string())?; + let mut input = writer(root, "input.csv", "key,value,bits")?; + for (k, v) in [ + ("rho", RHO), + ("mu", MU), + ("dt", field::DT), + ("Lref", field::LENGTH), + ("Uref", field::SPEED), + ("Href", field::DEPTH), + ("tau_ref", field::STRESS), + ("extent", 1.0), + ("origin_x", case.origin[0]), + ("origin_y", case.origin[1]), + ] { + writeln!(input, "{k},{v:.17e},{}", v.to_bits()).map_err(|e| e.to_string())?; + } + for (k, v) in [ + ("case", case.name.as_str()), + ("geometry", case.geometry), + ("phase", case.phase), + ("source_csv_sha256", case.source_sha256), + ("model", "CV3-A-static-polygon-MMS-v1"), + ("field_load", "global-polynomial-continuum-v1"), + ("basis", "CV1-full-consistent-Q1-P0"), + ("solver", "CV2-scaled-Cholesky-QR-refinement3-cap544"), + ("traction_rule", "split-three-point-Gauss-v1"), + ("pressure_gauge", "none"), + ("u_star", "zero"), + ] { + writeln!(input, "{k},{v},").map_err(|e| e.to_string())?; + } + writeln!(input, "n,{},", case.n).map_err(|e| e.to_string())?; + for (i, p) in case.vertices.iter().enumerate() { + for (d, value) in p.iter().enumerate() { + writeln!(input, "vertex_{i}_{d},{:.17e},{}", value, value.to_bits()) + .map_err(|e| e.to_string())?; + } + } + input.flush().map_err(|e| e.to_string())?; + let op = Operators::build( + case.n, + case.origin, + 1.0, + Polygon::new(case.vertices.clone())?, + )?; + let tr = Traces::build(&op)?; + let report = Report::new(&op, &tr)?; + export::all(&operators, &op, &tr, &report).map_err(|e| e.to_string())?; + if report.gates.values().any(|v| !v.is_finite() || *v > GATE) { + return Err("inherited operator consistency gate failed".into()); + } + let loads = Loads::new(&op, &tr)?; + let mut w = writer(root, "loads.csv", "index,body,boundary,rhs")?; + let rhs: Vec<_> = loads + .body + .iter() + .zip(&loads.boundary) + .map(|(b, t)| b + t) + .collect(); + for (i, value) in rhs.iter().enumerate() { + writeln!( + w, + "{i},{:.17e},{:.17e},{:.17e}", + loads.body[i], loads.boundary[i], value + ) + .map_err(|e| e.to_string())?; + } + w.flush().map_err(|e| e.to_string())?; + let mut w = writer(root, "h1.csv", "row,column,value")?; + for (i, row) in loads.h1.iter().enumerate() { + for (j, v) in row.iter().enumerate() { + writeln!(w, "{i},{j},{v:.17e}").map_err(|e| e.to_string())?; + } + } + w.flush().map_err(|e| e.to_string())?; + let mut w = writer( + root, + "traction-points.csv", + "q,record,x,y,nx_weight,ny_weight,gx_weight,gy_weight", + )?; + let mut b = writer(root, "traction-basis.csv", "q,index,phi")?; + for (id, p) in loads.points.iter().enumerate() { + writeln!( + w, + "{id},{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + p.record, + p.point[0], + p.point[1], + p.normal_weight[0], + p.normal_weight[1], + p.traction_weight[0], + p.traction_weight[1] + ) + .map_err(|e| e.to_string())?; + for (i, phi) in &p.basis { + writeln!(b, "{id},{i},{phi:.17e}").map_err(|e| e.to_string())?; + } + } + w.flush().map_err(|e| e.to_string())?; + b.flush().map_err(|e| e.to_string())?; + let a = op + .mass + .iter() + .zip(&op.stiffness) + .map(|(m, k)| m.iter().zip(k).map(|(m, k)| m / field::DT + k).collect()) + .collect(); + let factor = Factor::new(a, op.divergence.clone())?; + export_factors(root, &factor)?; + let mut w = writer( + root, + "states.csv", + "method,iteration,kind,index,value,original_residual", + )?; + let (u, p) = factor.refined(&rhs, |iteration, (u, p)| { + let (ru, g) = factor.residual(&rhs, u, p); + for (kind, values, residuals) in [("u", u, &ru), ("p", p, &g)] { + for (i, (v, r)) in values.iter().zip(residuals).enumerate() { + // Actual lower KKT b-Cz is +Bu, opposite correction API g. + let r = if kind == "p" { -r } else { *r }; + writeln!(w, "selected,{iteration},{kind},{i},{v:.17e},{r:.17e}") + .map_err(|e| e.to_string())?; + } + } + w.flush().map_err(|e| e.to_string()) + })?; + let au = action(&factor.a, &u); + let bu = action(&factor.b, &u); + let mut residual = Vec::new(); + let mut gates = BTreeMap::new(); + let mut rowgate = 0.0_f64; + for i in 0..u.len() { + let col: Vec<_> = factor.b.iter().map(|r| r[i]).collect(); + let r = dot(&[au[i], -dot(&col, &p), -rhs[i]], &[1.0; 3]); + residual.push(r); + let denom = factor.a[i].iter().map(|v| v.abs()).sum::() * field::SPEED + + col.iter().map(|v| v.abs()).sum::() * field::STRESS + + rhs[i].abs(); + rowgate = rowgate.max(scaled(r, denom)?); + } + gates.insert("original_momentum_rows", rowgate); + let mut con = 0.0_f64; + let mut flux = 0.0_f64; + let grid = action(&tr.grid, &u); + let boundary_flux = action(&tr.physical, &u); + for c in 0..p.len() { + con = con.max(scaled( + bu[c], + factor.b[c].iter().map(|v| v.abs()).sum::() * field::SPEED, + )?); + flux = flux.max(scaled( + grid[c] + boundary_flux[c] - bu[c], + op.layout.h * field::SPEED, + )?); + flux = flux.max(scaled( + grid[c] + boundary_flux[c], + op.layout.h * field::SPEED, + )?); + } + gates.insert("original_continuity_rows", con); + gates.insert("physical_closed_cell_flux", flux); + let power_body = dot(&u, &loads.body); + let power_boundary = dot(&u, &loads.boundary); + let mut direct_body = 0.0; + for q in &op.quadrature { + let mut uh = [0.0; 2]; + for a in &q.values { + uh[a.axis] += u[op.map[a.global]] * a.phi; + } + direct_body += q.weight * field::DEPTH * dot(&uh, &field::body(q.point)); + } + let mut direct_boundary = 0.0; + for q in &loads.points { + let mut uh = [0.0; 2]; + for &(i, phi) in &q.basis { + uh[op.active[i].axis] += u[i] * phi; + } + direct_boundary += dot(&uh, &q.traction_weight); + } + let volume = op.volume.iter().sum::() * field::DEPTH; + let energy_scale = RHO * volume * field::SPEED * field::SPEED; + let mu = action(&op.mass, &u); + let ku = action(&op.stiffness, &u); + let energy = 0.5 * dot(&u, &mu); + let dissipation = dot(&u, &ku); + let raw = 2.0 * energy + field::DT * (dissipation - power_body - power_boundary); + let pressure_work = dot(&p, &bu); + let residual_work = dot(&u, &residual); + gates.insert("forced_raw_work", scaled(raw, energy_scale)?); + gates.insert( + "forced_residual_corrected_work", + scaled( + raw - field::DT * (pressure_work + residual_work), + energy_scale, + )?, + ); + gates.insert( + "absolute_residual_work", + scaled( + field::DT + * (p.iter().zip(&bu).map(|(p, b)| (p * b).abs()).sum::() + + u.iter() + .zip(&residual) + .map(|(u, r)| (u * r).abs()) + .sum::()), + energy_scale, + )?, + ); + gates.insert( + "physical_body_power", + scaled(field::DT * (direct_body - power_body), energy_scale)?, + ); + gates.insert( + "physical_boundary_power", + scaled(field::DT * (direct_boundary - power_boundary), energy_scale)?, + ); + gates.insert( + "negative_viscous_dissipation", + scaled( + (-dissipation).max(0.0), + MU * volume * field::SPEED * field::SPEED / (field::LENGTH * field::LENGTH), + )?, + ); + let mut observations = BTreeMap::from( + [ + ("energy", energy), + ("dissipation", dissipation), + ("body_power", power_body), + ("boundary_power", power_boundary), + ("direct_body_power", direct_body), + ("direct_boundary_power", direct_boundary), + ("pressure_work", pressure_work), + ("residual_work", residual_work), + ("raw_work", raw), + ] + .map(|(k, v)| (k.to_string(), v)), + ); + for d in 0..3 { + let virtual_field: Vec<_> = op + .active + .iter() + .map(|node| match d { + 0 => { + if node.axis == 0 { + 1.0 + } else { + 0.0 + } + } + 1 => { + if node.axis == 1 { + 1.0 + } else { + 0.0 + } + } + _ => { + if node.axis == 0 { + -node.point[1] + } else { + node.point[0] + } + } + }) + .collect(); + let mom: Vec<_> = op.moment.iter().map(|v| v[d]).collect(); + let body = dot(&virtual_field, &loads.body); + let boundary = dot(&virtual_field, &loads.boundary); + let inertia = dot(&mom, &u) / field::DT; + let scale = + RHO * volume * field::SPEED / field::DT * if d == 2 { field::LENGTH } else { 1.0 }; + let key = match d { + 0 => "x", + 1 => "y", + _ => "torque", + }; + gates.insert( + match d { + 0 => "momentum_x", + 1 => "momentum_y", + _ => "angular_momentum", + }, + scaled(inertia - body - boundary, scale)?, + ); + gates.insert( + match d { + 0 => "body_resultant_x", + 1 => "body_resultant_y", + _ => "body_torque", + }, + scaled(body - loads.body_resultant[d], scale)?, + ); + gates.insert( + match d { + 0 => "boundary_resultant_x", + 1 => "boundary_resultant_y", + _ => "boundary_torque", + }, + scaled(boundary - loads.boundary_resultant[d], scale)?, + ); + for (prefix, v) in [ + ("inertia", inertia), + ("body_nodal", body), + ("boundary_nodal", boundary), + ("body_direct", loads.body_resultant[d]), + ("boundary_direct", loads.boundary_resultant[d]), + ] { + observations.insert(format!("{prefix}_{key}"), v); + } + } + let mut w = writer(root, "metrics.csv", "kind,name,value")?; + for (name, value) in &gates { + writeln!(w, "gate,{name},{value:.17e}").map_err(|e| e.to_string())?; + } + for (name, value) in &observations { + writeln!(w, "observation,{name},{value:.17e}").map_err(|e| e.to_string())?; + } + w.flush().map_err(|e| e.to_string())?; + if gates + .values() + .chain(observations.values()) + .any(|v| !v.is_finite()) + { + return Err("nonfinite CV3 work/momentum observation".into()); + } + if gates.values().any(|v| *v > GATE) { + return Err("fixed CV3 original-equation/work/boundary gate failed".into()); + } + std::fs::write( + root.join("native-status.txt"), + "native algebraic gates passed; independent physical/numerical qualification pending\n", + ) + .map_err(|e| e.to_string())?; + Ok(()) +} + +fn export_factors(root: &Path, f: &Factor) -> Result<(), String> { + let mut w = writer(root, "factors.csv", "block,row,column,value")?; + for (name, matrix) in [ + ("A", &f.a), + ("scaled_A", &f.scaled_a), + ("L", &f.l), + ("Y", &f.y), + ("Z", &f.z), + ("Q", &f.q), + ("R", &f.r), + ] { + for (i, row) in matrix.iter().enumerate() { + for (j, v) in row.iter().enumerate() { + writeln!(w, "{name},{i},{j},{v:.17e}").map_err(|e| e.to_string())?; + } + } + } + for (name, values) in [("D", &f.d), ("E", &f.e)] { + for (i, v) in values.iter().enumerate() { + writeln!(w, "{name},{i},0,{v:.17e}").map_err(|e| e.to_string())?; + } + } + w.flush().map_err(|e| e.to_string()) +} diff --git a/examples/grid_static_mms_reference/field.rs b/examples/grid_static_mms_reference/field.rs new file mode 100644 index 00000000..a2243e83 --- /dev/null +++ b/examples/grid_static_mms_reference/field.rs @@ -0,0 +1,48 @@ +//! CV3-A-v1 continuum fields; all derived constants use represented primitives. +use super::super::{MU, RHO}; +pub const DT: f64 = 1.0; +pub const LENGTH: f64 = 1.0; +pub const SPEED: f64 = 1.0; +pub const DEPTH: f64 = 1.0; +pub const STRESS: f64 = 1.0; +pub fn velocity([x, y]: [f64; 2]) -> [f64; 2] { + let (x, y) = (x / LENGTH, y / LENGTH); + [ + SPEED * (x * x + 2.0 * x * y), + SPEED * (-2.0 * x * y - y * y), + ] +} +pub fn gradient([x, y]: [f64; 2]) -> [[f64; 2]; 2] { + let (x, y) = (x / LENGTH, y / LENGTH); + let s = SPEED / LENGTH; + [ + [2.0 * s * (x + y), 2.0 * s * x], + [-2.0 * s * y, -2.0 * s * (x + y)], + ] +} +pub fn pressure([x, y]: [f64; 2]) -> f64 { + STRESS * (1.0 + x / LENGTH + 2.0 * y / LENGTH + x * y / (LENGTH * LENGTH)) +} +pub fn stress(point: [f64; 2]) -> [f64; 3] { + let g = gradient(point); + let p = pressure(point); + [ + -p + 2.0 * MU * g[0][0], + MU * (g[0][1] + g[1][0]), + -p + 2.0 * MU * g[1][1], + ] +} +pub fn body(point: [f64; 2]) -> [f64; 2] { + let u = velocity(point); + let c = 2.0 * MU * SPEED / (LENGTH * LENGTH); + [ + RHO * u[0] / DT - c + STRESS / LENGTH * (1.0 + point[1] / LENGTH), + RHO * u[1] / DT + c + STRESS / LENGTH * (2.0 + point[0] / LENGTH), + ] +} +/// The caller supplies the outward normal TIMES integration measure. +pub fn traction(point: [f64; 2], normal_measure: [f64; 2]) -> [f64; 2] { + let [xx, xy, yy] = stress(point); + let [nx, ny] = normal_measure; + [xx * nx + xy * ny, xy * nx + yy * ny] +} diff --git a/examples/grid_static_mms_reference/loads.rs b/examples/grid_static_mms_reference/loads.rs new file mode 100644 index 00000000..02fca4ce --- /dev/null +++ b/examples/grid_static_mms_reference/loads.rs @@ -0,0 +1,114 @@ +//! New CV3-A load integration, leaving the old constant-stress trace rule intact. +use super::super::grid_cut_variational_reference::{ + assembly::{Matrix, Operators, zero}, + basis::{GAUSS_WEIGHTS, gauss_nodes}, + trace::Traces, +}; +use super::field; +pub struct BoundaryPoint { + pub record: usize, + pub point: [f64; 2], + pub normal_weight: [f64; 2], + pub traction_weight: [f64; 2], + pub basis: Vec<(usize, f64)>, +} +pub struct Loads { + pub body: Vec, + pub boundary: Vec, + pub body_resultant: [f64; 3], + pub boundary_resultant: [f64; 3], + pub h1: Matrix, + pub points: Vec, +} +impl Loads { + pub fn new(op: &Operators, tr: &Traces) -> Result { + let n = op.active.len(); + let mut out = Self { + body: vec![0.0; n], + boundary: vec![0.0; n], + body_resultant: [0.0; 3], + boundary_resultant: [0.0; 3], + h1: zero(n, n), + points: Vec::new(), + }; + for q in &op.quadrature { + let f = field::body(q.point); + for (r, v) in out.body_resultant.iter_mut().zip([ + f[0], + f[1], + q.point[0] * f[1] - q.point[1] * f[0], + ]) { + *r += q.weight * field::DEPTH * v; + } + for a in &q.values { + let i = op.map[a.global]; + out.body[i] += q.weight * field::DEPTH * a.phi * f[a.axis]; + for b in &q.values { + if a.axis == b.axis { + out.h1[i][op.map[b.global]] += q.weight + * field::DEPTH + * (a.dx * b.dx + + a.dy * b.dy + + a.phi * b.phi / (field::LENGTH * field::LENGTH)); + } + } + } + } + for (record, r) in tr + .records + .iter() + .enumerate() + .filter(|(_, r)| r.kind == "global") + { + for (&t, &w) in gauss_nodes().iter().zip(&GAUSS_WEIGHTS) { + let point = + std::array::from_fn(|d| r.segment.a[d] + t * (r.segment.b[d] - r.segment.a[d])); + if point == r.segment.a || point == r.segment.b { + return Err("CV3 positive load integration point collapsed".into()); + } + let normal_weight = r.segment.normal_measure().map(|v| v * w * field::DEPTH); + let traction_weight = field::traction(point, normal_weight); + for (t, v) in out.boundary_resultant.iter_mut().zip([ + traction_weight[0], + traction_weight[1], + point[0] * traction_weight[1] - point[1] * traction_weight[0], + ]) { + *t += v; + } + let mut basis = Vec::new(); + for (i, node) in op.active.iter().enumerate() { + let phi = op.layout.trace(node, point); + if phi != 0.0 { + basis.push((i, phi)); + } + out.boundary[i] += phi * traction_weight[node.axis]; + } + out.points.push(BoundaryPoint { + record, + point, + normal_weight, + traction_weight, + basis, + }); + } + } + if out + .body + .iter() + .chain(&out.boundary) + .chain(&out.body_resultant) + .chain(&out.boundary_resultant) + .chain(out.h1.iter().flatten()) + .chain(out.points.iter().flat_map(|p| { + p.point + .iter() + .chain(&p.normal_weight) + .chain(&p.traction_weight) + })) + .any(|x| !x.is_finite()) + { + return Err("CV3 nonfinite physical loads or H1 map".into()); + } + Ok(out) + } +} diff --git a/examples/grid_verification.rs b/examples/grid_verification.rs new file mode 100644 index 00000000..e8d2aba4 --- /dev/null +++ b/examples/grid_verification.rs @@ -0,0 +1,21 @@ +//! Q1 native grid-owner verification. Frozen failures are results, never relaxed criteria. +mod grid_verification { + pub mod carrier; + pub mod channel; + pub mod sphere; + pub mod transport; + pub type Result = std::result::Result>; + pub const RHO: f64 = 998.2; + pub const MU: f64 = 0.001002; + pub const NU: f64 = MU / RHO; +} +fn main() -> grid_verification::Result<()> { + let out = std::env::args_os() + .nth(1) + .expect("fresh output directory required"); + std::fs::create_dir(&out)?; + let root = std::path::Path::new(&out); + grid_verification::channel::run(root)?; + grid_verification::transport::run(root)?; + Ok(()) +} diff --git a/examples/grid_verification/carrier.rs b/examples/grid_verification/carrier.rs new file mode 100644 index 00000000..b079f36a --- /dev/null +++ b/examples/grid_verification/carrier.rs @@ -0,0 +1,126 @@ +//! Source-declared f32 exactly discrete-solenoidal RT0 face carrier. +use rheon::{Axis, GridGeometry}; +const AXES: [Axis; 3] = [Axis::X, Axis::Y, Axis::Z]; +pub fn fields(g: &GridGeometry, value: [f32; 3]) -> [Vec; 3] { + std::array::from_fn(|d| vec![value[d]; g.face_len(AXES[d])]) +} +pub fn vortex(g: &GridGeometry) -> [Vec; 3] { + let [n, ny, _] = g.counts(); + assert_eq!(n, ny); + assert!(n.is_power_of_two()); + let mut psi = vec![0_i64; (n + 1) * (n + 1)]; + for j in 1..n { + for i in 1..n { + psi[i + (n + 1) * j] = ((std::f64::consts::PI * i as f64 / n as f64).sin().powi(2) + * (std::f64::consts::PI * j as f64 / n as f64).sin().powi(2) + / std::f64::consts::PI + * 1048576.0) + .round() as i64; + } + } + let mut u = fields(g, [0.0; 3]); + for k in 0..g.counts()[2] { + for j in 0..ny { + for i in 0..=n { + let q = (psi[i + (n + 1) * (j + 1)] - psi[i + (n + 1) * j]) * n as i64; + assert!(q.abs() < (1 << 24)); + u[0][g.face_index(Axis::X, [i, j, k]).unwrap()] = q as f32 * 2.0_f32.powi(-20); + } + } + } + for k in 0..g.counts()[2] { + for j in 0..=ny { + for i in 0..n { + let q = -(psi[i + 1 + (n + 1) * j] - psi[i + (n + 1) * j]) * n as i64; + assert!(q.abs() < (1 << 24)); + u[1][g.face_index(Axis::Y, [i, j, k]).unwrap()] = q as f32 * 2.0_f32.powi(-20); + } + } + } + u +} +pub fn reverse(u: &[Vec; 3]) -> [Vec; 3] { + u.each_ref().map(|f| f.iter().map(|u| -u).collect()) +} +pub fn rates(g: &GridGeometry, u: &[Vec; 3]) -> (f64, f64) { + let [nx, ny, nz] = g.counts(); + let h = g.spacing(); + let mut outward: f64 = 0.0; + let mut divergence: f64 = 0.0; + for k in 0..nz { + for j in 0..ny { + for i in 0..nx { + let p = [i, j, k]; + let mut c = 0.0; + let mut div = 0.0; + for d in 0..3 { + let mut hi = p; + hi[d] += 1; + let a = f64::from(u[d][g.face_index(AXES[d], p).unwrap()]); + let b = f64::from(u[d][g.face_index(AXES[d], hi).unwrap()]); + c += (b.max(0.0) - a.min(0.0)) / h[d]; + div += (b - a) / h[d]; + } + outward = outward.max(c); + divergence = divergence.max(div.abs()); + } + } + } + (outward, divergence) +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn quantized_curl_and_reversal_have_exact_zero_discrete_divergence() { + let g = GridGeometry::new([8; 3], [0.125; 3], [0.0; 3]).unwrap(); + let u = vortex(&g); + let (a, b) = rates(&g, &u); + let (c, d) = rates(&g, &reverse(&u)); + assert_eq!(b, 0.0); + assert_eq!(d, 0.0); + assert_eq!(a, c); + } +} +#[cfg(test)] +mod native_invariance { + use super::*; + use rheon::{LiquidFlowInterval, LiquidVolumeSettings, LiquidVolumeState, VolumeStamp}; + #[test] + fn discrete_curl_preserves_full_and_dry_at_dyadic_step() { + let g = GridGeometry::new([8; 3], [0.125; 3], [0.0; 3]).unwrap(); + let u = vortex(&g); + for fill in [0.0, 1.0] { + let mut state = LiquidVolumeState::new( + g.clone(), + 998.2, + VolumeStamp { id: 1, version: 0 }, + vec![fill; g.cell_len()], + 1 << 20, + ) + .unwrap(); + let flow = LiquidFlowInterval::new( + &g, + VolumeStamp { id: 2, version: 0 }, + u.each_ref().map(|f| f.as_slice()), + 0.0, + 2.0_f64.powi(-10), + ) + .unwrap(); + let r = state + .advance_periodic( + flow, + VolumeStamp { id: 3, version: 0 }, + None, + LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 0.0, + }, + |_| false, + ) + .unwrap(); + assert!(state.state().fraction.iter().all(|v| *v == fill)); + assert_eq!(r.actual_divergence_max, 0.0); + } + } +} diff --git a/examples/grid_verification/channel.rs b/examples/grid_verification/channel.rs new file mode 100644 index 00000000..528f565f --- /dev/null +++ b/examples/grid_verification/channel.rs @@ -0,0 +1,277 @@ +use super::{MU, NU, RHO, Result}; +use rheon::{ + Axis, GridGeometry, ObstacleShearForce, ObstacleShearReport, ObstacleShearWall, + StaticObstacleGeometry, StaticObstacleShear, SurfaceSettings, SurfaceStamp, TriangleSurface, +}; +use std::{io::Write, path::Path}; +fn surface() -> TriangleSurface { + let vertices = (0..8) + .map(|i| std::array::from_fn(|d| if i & (1 << d) == 0 { 0.0 } else { 0.001 })) + .collect(); + let triangles = vec![ + [0, 2, 3], + [0, 3, 1], + [4, 5, 7], + [4, 7, 6], + [0, 1, 5], + [0, 5, 4], + [2, 6, 7], + [2, 7, 3], + [0, 4, 6], + [0, 6, 2], + [1, 3, 7], + [1, 7, 5], + ]; + TriangleSurface::new( + SurfaceStamp { + id: 321, + version: 0, + }, + vertices, + triangles, + SurfaceSettings::default(), + ) + .unwrap() +} +fn ledger_row( + out: &mut impl Write, + case: &str, + n: usize, + steps: usize, + step: usize, + r: &ObstacleShearReport, +) -> std::io::Result<()> { + write!(out, "{case},{n},{steps},{step},{:.17e}", step as f64 * r.dt)?; + for value in [ + r.dt, + r.force_density, + r.kinetic_before, + r.kinetic_after, + r.increment_energy, + r.body_work, + r.dissipation, + r.boundary_dissipation, + r.energy_identity_error, + r.energy_rounding_budget, + r.momentum_before, + r.momentum_after, + r.body_impulse, + r.wall_impulse, + r.momentum_identity_error, + r.momentum_rounding_budget, + r.residual_max, + ] { + write!(out, ",{value:.17e}")?; + } + writeln!(out) +} +fn state_rows( + out: &mut impl Write, + case: &str, + steps: usize, + step_time: (usize, f64), + centers: &[f64], + u: &[f64], + exact: &[f64], +) -> std::io::Result<()> { + let (step, time) = step_time; + for (layer, ((y, value), reference)) in centers.iter().zip(u).zip(exact).enumerate() { + writeln!( + out, + "{case},{},{steps},{step},{time:.17e},{layer},{y:.17e},{value:.17e},{reference:.17e}", + u.len() + )?; + } + Ok(()) +} +pub fn run(root: &Path) -> Result<()> { + let mut out = std::io::BufWriter::new(std::fs::File::create(root.join("channel-summary.csv"))?); + writeln!( + out, + "case,n,steps,dt,time,rms,relative_rms,max_energy_identity,max_momentum_identity,max_energy_increase,lower_traction,upper_traction,flux,exact_flux,max_force_residual" + )?; + let mut ledger = + std::io::BufWriter::new(std::fs::File::create(root.join("channel-ledger.csv"))?); + writeln!( + ledger, + "case,n,steps,step,time,dt,force_density,kinetic_before,kinetic_after,increment_energy,body_work,dissipation,boundary_dissipation,energy_identity_error,energy_rounding_budget,momentum_before,momentum_after,body_impulse,wall_impulse,momentum_identity_error,momentum_rounding_budget,residual_max" + )?; + let mut states = + std::io::BufWriter::new(std::fs::File::create(root.join("channel-states.csv"))?); + writeln!(states, "case,n,steps,step,time,layer,y,u,exact_reference")?; + let mut geometry_out = + std::io::BufWriter::new(std::fs::File::create(root.join("channel-geometry.csv"))?); + writeln!( + geometry_out, + "n,layer,center,volume,mass,conductance_to_next,lower_wall_conductance,upper_wall_conductance" + )?; + for n in [8, 16, 32] { + let dy = 0.001 / n as f64; + let grid = GridGeometry::new([1, (2 * n) as u64, 1], [0.001, dy, 0.001], [0.0; 3])?; + let geometry = StaticObstacleGeometry::new(grid, surface(), 1 << 24, |_, _| false)?; + let mut w = StaticObstacleShear::new( + &geometry, + Axis::Y, + RHO, + MU, + ObstacleShearWall::NoSlip, + 1 << 24, + |_, _| false, + )?; + let exact: Vec<_> = w + .layer_centers() + .iter() + .map(|y| { + let y = y - 0.001; + 0.01 * y * (0.001 - y) / (2.0 * NU) + }) + .collect(); + let walls = w.wall_conductances(); + for layer in 0..n { + writeln!( + geometry_out, + "{n},{layer},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + w.layer_centers()[layer], + w.layer_volumes()[layer], + RHO * w.layer_volumes()[layer], + w.interior_conductances().get(layer).copied().unwrap_or(0.0), + walls[0], + walls[1] + )?; + } + let mut u = exact.clone(); + state_rows( + &mut states, + "steady", + 20, + (0, 0.0), + w.layer_centers(), + &u, + &exact, + )?; + let mut energy: f64 = 0.0; + let mut momentum: f64 = 0.0; + let mut residual: f64 = 0.0; + for step in 1..=20 { + let r = w.step( + &mut u, + 1.0, + ObstacleShearForce::Acceleration(0.01), + |_, _| false, + )?; + ledger_row(&mut ledger, "steady", n, 20, step, &r)?; + state_rows( + &mut states, + "steady", + 20, + (step, step as f64), + w.layer_centers(), + &u, + &exact, + )?; + energy = energy.max(r.energy_identity_error.abs()); + momentum = momentum.max(r.momentum_identity_error.abs()); + residual = residual.max(r.residual_max); + } + let square: f64 = u.iter().zip(&exact).map(|(a, b)| (a - b).powi(2)).sum(); + let rms = (square / n as f64).sqrt(); + let rel = (square / exact.iter().map(|u| u * u).sum::()).sqrt(); + let conductance = w.wall_conductances(); + writeln!( + out, + "steady,{n},20,1.0,20.0,{rms:.17e},{rel:.17e},{energy:.17e},{momentum:.17e},NaN,{:.17e},{:.17e},{:.17e},{:.17e},{residual:.17e}", + conductance[0] * u[0] / 1e-6, + conductance[1] * u[n - 1] / 1e-6, + 0.001 * dy * u.iter().sum::(), + 0.001 * 0.01 * 0.001_f64.powi(3) / (12.0 * NU) + )?; + let mut fields = std::io::BufWriter::new(std::fs::File::create( + root.join(format!("channel-{n}.csv")), + )?); + writeln!(fields, "y,u,exact")?; + for i in 0..n { + writeln!( + fields, + "{:.17e},{:.17e},{:.17e}", + w.layer_centers()[i], + u[i], + exact[i] + )?; + } + fields.flush()?; + if n == 32 { + let lambda = 4.0 * (std::f64::consts::PI / (2.0 * n as f64)).sin().powi(2) / dy.powi(2); + for steps in [8, 16, 32] { + let initial: Vec<_> = w + .layer_centers() + .iter() + .map(|y| (std::f64::consts::PI * (y - 0.001) / 0.001).sin()) + .collect(); + let mut u = initial.clone(); + let mut increase: f64 = 0.0; + let dt = 0.05 / steps as f64; + state_rows( + &mut states, + "temporal", + steps, + (0, 0.0), + w.layer_centers(), + &u, + &initial, + )?; + for step in 1..=steps { + let r = w.step(&mut u, dt, ObstacleShearForce::Acceleration(0.0), |_, _| { + false + })?; + ledger_row(&mut ledger, "temporal", n, steps, step, &r)?; + let reference: Vec<_> = initial + .iter() + .map(|v| v * (-NU * lambda * step as f64 * dt).exp()) + .collect(); + state_rows( + &mut states, + "temporal", + steps, + (step, step as f64 * dt), + w.layer_centers(), + &u, + &reference, + )?; + increase = increase.max(r.kinetic_after - r.kinetic_before); + } + let factor = (-NU * lambda * 0.05).exp(); + let square: f64 = u + .iter() + .zip(&initial) + .map(|(a, b)| (a - factor * b).powi(2)) + .sum(); + let rms = (square / n as f64).sqrt(); + let rel = (square / (factor * factor * initial.iter().map(|u| u * u).sum::())) + .sqrt(); + writeln!( + out, + "temporal,{n},{steps},{dt:.17e},0.05,{rms:.17e},{rel:.17e},NaN,NaN,{increase:.17e},NaN,NaN,NaN,NaN,NaN" + )?; + let mut fields = std::io::BufWriter::new(std::fs::File::create( + root.join(format!("channel-time-{steps}.csv")), + )?); + writeln!(fields, "y,u,exact_semidiscrete")?; + for i in 0..n { + writeln!( + fields, + "{:.17e},{:.17e},{:.17e}", + w.layer_centers()[i], + u[i], + factor * initial[i] + )?; + } + fields.flush()?; + } + } + } + ledger.flush()?; + states.flush()?; + geometry_out.flush()?; + out.flush()?; + Ok(()) +} diff --git a/examples/grid_verification/sphere.rs b/examples/grid_verification/sphere.rs new file mode 100644 index 00000000..b7830c9f --- /dev/null +++ b/examples/grid_verification/sphere.rs @@ -0,0 +1,199 @@ +//! Cell-average sphere/box geometry; paired adaptive quadrature estimates are not rigorous enclosures. +use std::f64::consts::PI; +#[derive(Clone, Copy)] +pub struct Sphere { + pub center: [f64; 3], + pub radius: f64, +} +#[derive(Clone, Copy, Default)] +pub struct Integral { + pub value: f64, + pub estimate: f64, + pub exhausted: bool, +} +fn quadrant(y: f64, z: f64, r: f64) -> f64 { + if r == 0.0 { + return 0.0; + } + let y = y.min(r); + let z = z.min(r); + let s = (r * r - z * z).max(0.0).sqrt().min(y); + let primitive = |t: f64| { + 0.5 * (t * (r * r - t * t).max(0.0).sqrt() + r * r * (t / r).clamp(-1.0, 1.0).asin()) + }; + z * s + primitive(y) - primitive(s) +} +fn disk_area(y: [f64; 2], z: [f64; 2], r: f64) -> f64 { + let nearest = |a: [f64; 2]| { + if a[0] > 0.0 { + a[0] + } else if a[1] < 0.0 { + -a[1] + } else { + 0.0 + } + }; + if nearest(y).powi(2) + nearest(z).powi(2) >= r * r { + return 0.0; + } + if y[0].abs().max(y[1].abs()).powi(2) + z[0].abs().max(z[1].abs()).powi(2) <= r * r { + return (y[1] - y[0]) * (z[1] - z[0]); + } + let c = |a: f64, b: f64| a.signum() * b.signum() * quadrant(a.abs(), b.abs(), r); + c(y[1], z[1]) - c(y[0], z[1]) - c(y[1], z[0]) + c(y[0], z[0]) +} +fn simpson(f: &impl Fn(f64) -> f64, a: f64, b: f64, tol: f64, depth: u32) -> Integral { + fn refine( + f: &impl Fn(f64) -> f64, + a: f64, + b: f64, + v: [f64; 3], + whole: f64, + tol: f64, + depth: u32, + ) -> Integral { + let mid = 0.5 * (a + b); + let l = f(0.5 * (a + mid)); + let r = f(0.5 * (mid + b)); + let left = (mid - a) / 6.0 * (v[0] + 4.0 * l + v[1]); + let right = (b - mid) / 6.0 * (v[1] + 4.0 * r + v[2]); + let error = (left + right - whole).abs() / 15.0; + if error <= tol || depth == 0 { + return Integral { + value: left + right + (left + right - whole) / 15.0, + estimate: if depth == 0 { error.max(tol) } else { error }, + exhausted: depth == 0 && error > tol, + }; + } + let p = refine(f, a, mid, [v[0], l, v[1]], left, tol / 2.0, depth - 1); + let q = refine(f, mid, b, [v[1], r, v[2]], right, tol / 2.0, depth - 1); + Integral { + value: p.value + q.value, + estimate: p.estimate + q.estimate, + exhausted: p.exhausted || q.exhausted, + } + } + let v = [f(a), f(0.5 * (a + b)), f(b)]; + let whole = (b - a) / 6.0 * (v[0] + 4.0 * v[1] + v[2]); + refine(f, a, b, v, whole, tol, depth) +} +impl Sphere { + pub fn volume(self) -> f64 { + 4.0 * PI * self.radius.powi(3) / 3.0 + } + pub fn intersect(self, lo: [f64; 3], hi: [f64; 3], tol: f64) -> Integral { + let low: [f64; 3] = std::array::from_fn(|d| lo[d] - self.center[d]); + let high: [f64; 3] = std::array::from_fn(|d| hi[d] - self.center[d]); + let near: f64 = (0..3) + .map(|d| { + if low[d] > 0.0 { + low[d].powi(2) + } else if high[d] < 0.0 { + high[d].powi(2) + } else { + 0.0 + } + }) + .sum(); + if near >= self.radius * self.radius { + return Integral::default(); + } + if (0..3) + .map(|d| low[d].abs().max(high[d].abs()).powi(2)) + .sum::() + <= self.radius * self.radius + { + return Integral { + value: (hi[0] - lo[0]) * (hi[1] - lo[1]) * (hi[2] - lo[2]), + estimate: 0.0, + exhausted: false, + }; + } + let a = low[0].max(-self.radius); + let b = high[0].min(self.radius); + if a >= b { + return Integral::default(); + } + let mut knots = vec![a, b]; + if a < 0.0 && b > 0.0 { + knots.push(0.0); + } + // Cross-section edge/corner contacts and extrema change the analytic branch. + for y in [0.0, low[1], high[1]] { + for z in [0.0, low[2], high[2]] { + let q = self.radius * self.radius - y * y - z * z; + if q > 0.0 { + for x in [-q.sqrt(), q.sqrt()] { + if x > a && x < b { + knots.push(x); + } + } + } + } + } + knots.sort_by(f64::total_cmp); + knots.dedup(); + let f = |x: f64| { + disk_area( + [low[1], high[1]], + [low[2], high[2]], + (self.radius * self.radius - x * x).max(0.0).sqrt(), + ) + }; + let mut total = Integral::default(); + let pieces = knots.len() - 1; + for w in knots.windows(2) { + let r = simpson(&f, w[0], w[1], tol / pieces as f64, 22); + total.value += r.value; + total.estimate += r.estimate; + total.exhausted |= r.exhausted; + } + total + } + pub fn periodic_cell(self, lo: [f64; 3], hi: [f64; 3], tol: f64) -> Integral { + let mut sum = Integral::default(); + for kz in -1..=1 { + for ky in -1..=1 { + for kx in -1..=1 { + let s = Self { + center: [ + self.center[0] + kx as f64, + self.center[1] + ky as f64, + self.center[2] + kz as f64, + ], + radius: self.radius, + }; + if (0..3) + .any(|d| s.center[d] + s.radius <= lo[d] || s.center[d] - s.radius >= hi[d]) + { + continue; + } + let q = s.intersect(lo, hi, tol); + sum.value += q.value; + sum.estimate += q.estimate; + sum.exhausted |= q.exhausted; + } + } + } + sum + } +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn sphere_octants_and_geometric_full_empty() { + let s = Sphere { + center: [0.0; 3], + radius: 0.15, + }; + let q = s.intersect([0.0; 3], [0.15; 3], 1e-13); + assert!((q.value - s.volume() / 8.0).abs() < 1e-11); + assert_eq!(s.intersect([0.2; 3], [0.3; 3], 1e-13).value, 0.0); + assert!((s.intersect([-0.01; 3], [0.01; 3], 1e-13).value - 0.02_f64.powi(3)).abs() < 1e-20); + } + #[test] + fn disk_quadrant_primitive_is_normalized() { + assert!((quadrant(1.0, 1.0, 1.0) - PI / 4.0).abs() < 1e-15); + } +} diff --git a/examples/grid_verification/transport.rs b/examples/grid_verification/transport.rs new file mode 100644 index 00000000..6fe9c212 --- /dev/null +++ b/examples/grid_verification/transport.rs @@ -0,0 +1,413 @@ +use super::{RHO, Result, carrier, sphere::Sphere}; +use rheon::{ + GridGeometry, LiquidFlowInterval, LiquidVolumeSettings, LiquidVolumeState, VolumeStamp, +}; +use std::{ + io::{BufWriter, Write}, + path::Path, +}; +fn stamp(id: u64, version: u64) -> VolumeStamp { + VolumeStamp { id, version } +} +fn binary(path: &Path, values: &[f64]) -> Result<()> { + let mut f = BufWriter::new(std::fs::File::create(path)?); + for v in values { + f.write_all(&v.to_le_bytes())?; + } + f.flush()?; + Ok(()) +} +fn binary32(path: &Path, values: &[f32]) -> Result<()> { + let mut f = BufWriter::new(std::fs::File::create(path)?); + for v in values { + f.write_all(&v.to_le_bytes())?; + } + f.flush()?; + Ok(()) +} +struct Fixture { + fraction: Vec, + volume: f64, +} +fn fixture(root: &Path, out: &mut impl Write, name: &str, n: usize, s: Sphere) -> Result { + let h = 1.0 / n as f64; + let dv = h * h * h; + let mut a = Vec::with_capacity(n * n * n); + let mut b = Vec::with_capacity(n * n * n); + let mut estimate = 0.0; + let mut exhausted = false; + for k in 0..n { + for j in 0..n { + for i in 0..n { + let lo = [i as f64 * h, j as f64 * h, k as f64 * h]; + let hi = [(i + 1) as f64 * h, (j + 1) as f64 * h, (k + 1) as f64 * h]; + let tolerance = 1e-12 * h * h; + let p = s.periodic_cell(lo, hi, tolerance); + let q = s.periodic_cell(lo, hi, tolerance / 16.0); + a.push(p.value / dv); + b.push(q.value / dv); + estimate += p.estimate + q.estimate; + exhausted |= p.exhausted || q.exhausted; + } + } + } + let va = a.iter().sum::() * dv; + let vb = b.iter().sum::() * dv; + let pair = a + .iter() + .zip(&b) + .map(|(a, b)| (a - b).abs() * dv) + .sum::() + / s.volume(); + let empirical = estimate / s.volume() + pair; + let min = b.iter().copied().fold(f64::INFINITY, f64::min); + let max = b.iter().copied().fold(f64::NEG_INFINITY, f64::max); + writeln!( + out, + "{name},{n},{:.17e},{:.17e},{:.17e},{:.17e},{va:.17e},{vb:.17e},{empirical:.17e},{pair:.17e},{exhausted},{min:.17e},{max:.17e}", + s.center[0], s.center[1], s.center[2], s.radius + )?; + out.flush()?; + binary(&root.join(format!("geometry-{name}-{n}.f64")), &b)?; + binary(&root.join(format!("geometry-pair-{name}-{n}.f64")), &a)?; + if exhausted + || min < 0.0 + || max > 1.0 + || empirical > 1e-4 + || (vb - s.volume()).abs() / s.volume() > 1e-4 + { + return Err(format!( + "sphere geometry admission failed for {name}/{n}; retain geometry summary" + ) + .into()); + } + Ok(Fixture { + fraction: b, + volume: s.volume(), + }) +} +fn moments(f: &[f64], n: usize) -> [[f64; 2]; 3] { + let h = 1.0 / n as f64; + let mut m = [[0.0; 2]; 3]; + let mass = f.iter().sum::(); + for k in 0..n { + for j in 0..n { + for i in 0..n { + let p = [i, j, k]; + let q = f[i + n * (j + n * k)]; + for d in 0..3 { + let a = 2.0 * std::f64::consts::PI * (p[d] as f64 + 0.5) * h; + m[d][0] += q * a.cos() / mass; + m[d][1] += q * a.sin() / mass; + } + } + } + } + m +} +pub fn run(root: &Path) -> Result<()> { + let mut geometry = BufWriter::new(std::fs::File::create(root.join("geometry.csv"))?); + writeln!( + geometry, + "name,n,cx,cy,cz,r,volume_coarse,volume_fine,empirical_uncertainty,paired_l1,exhausted,min,max" + )?; + let mut out = BufWriter::new(std::fs::File::create(root.join("transport-summary.csv"))?); + writeln!( + out, + "case,n,requested_courant,status,steps,time,initial_volume,final_volume,relative_drift,relative_l1,max_balance,max_divergence,max_courant,min,max,fourier_error" + )?; + let mut control = BufWriter::new(std::fs::File::create(root.join("constant-controls.csv"))?); + writeln!(control, "n,requested_courant,fill,status,max_change,error")?; + let mut carriers = BufWriter::new(std::fs::File::create(root.join("carriers.csv"))?); + writeln!( + carriers, + "case,n,outward_rate,reverse_outward_rate,divergence,reverse_divergence" + )?; + for n in [16, 32, 64] { + let h = 1.0 / n as f64; + let grid = GridGeometry::new([n as u64; 3], [h; 3], [0.0; 3])?; + let initial = fixture( + root, + &mut geometry, + "translation-initial", + n, + Sphere { + center: [0.65, 0.5, 0.5], + radius: 0.15, + }, + )?; + let final_ref = fixture( + root, + &mut geometry, + "translation-final", + n, + Sphere { + center: [0.9, 0.625, 0.5625], + radius: 0.15, + }, + )?; + let vortex = fixture( + root, + &mut geometry, + "vortex-initial", + n, + Sphere { + center: [0.35, 0.35, 0.5], + radius: 0.15, + }, + )?; + for (case, source, target, positive) in [ + ( + "translation", + &initial, + &final_ref, + carrier::fields(&grid, [0.25, 0.125, 0.0625]), + ), + ("vortex-adapted", &vortex, &vortex, carrier::vortex(&grid)), + ] { + let negative = carrier::reverse(&positive); + let (rate, div) = carrier::rates(&grid, &positive); + let (reverse_rate, reverse_div) = carrier::rates(&grid, &negative); + if div != 0.0 || reverse_div != 0.0 { + return Err("source-declared discrete curl is not exactly solenoidal".into()); + } + for (d, field) in positive.iter().enumerate() { + binary32(&root.join(format!("carrier-{case}-{n}-{d}.f32")), field)?; + } + writeln!( + carriers, + "{case},{n},{rate:.17e},{reverse_rate:.17e},{div:.17e},{reverse_div:.17e}" + )?; + carriers.flush()?; + if case != "translation" { + for requested in [0.1, 0.25, 0.5] { + for fill in [0.0, 1.0] { + let mut state = LiquidVolumeState::new( + grid.clone(), + RHO, + stamp(400, 0), + vec![fill; grid.cell_len()], + 1 << 28, + )?; + let flow = LiquidFlowInterval::new( + &grid, + stamp(401, 0), + positive.each_ref().map(|f| f.as_slice()), + 0.0, + requested / rate, + )?; + let result = state.advance_periodic( + flow, + stamp(402, 0), + None, + LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 0.0, + }, + |_| false, + ); + let change = state + .state() + .fraction + .iter() + .map(|f| (f - fill).abs()) + .fold(0.0, f64::max); + match result { + Ok(_) => writeln!( + control, + "{n},{requested:.17e},{fill},complete,{change:.17e}," + )?, + Err(e) => writeln!( + control, + "{n},{requested:.17e},{fill},refused,{change:.17e},\"{e:?}\"" + )?, + } + control.flush()?; + } + } + } + for requested in [0.1, 0.25, 0.5] { + let tag = format!("{case}-n{n}-c{:03}", (requested * 100.0) as usize); + let mut state = LiquidVolumeState::new( + grid.clone(), + RHO, + stamp(100, 0), + source.fraction.clone(), + 1 << 28, + )?; + let mut steps = 0usize; + let mut accepted_dt = Vec::new(); + let mut status = "complete"; + let mut failure = String::new(); + let mut balance: f64 = 0.0; + let mut divergence: f64 = 0.0; + let mut courant: f64 = 0.0; + let mut ledger = BufWriter::new(std::fs::File::create( + root.join(format!("ledger-{tag}.csv")), + )?); + writeln!( + ledger, + "step,time,dt,volume,balance,divergence,courant,min,max,external_in,external_out" + )?; + let limit = if case == "translation" { 1.0 } else { 0.5 }; + let dt = requested / rate; + while state.state().time < limit { + let actual = dt.min(limit - state.state().time); + let flow = LiquidFlowInterval::new( + &grid, + stamp(200, steps as u64), + positive.each_ref().map(|a| a.as_slice()), + state.state().time, + actual, + )?; + match state.advance_periodic( + flow, + stamp(300, 0), + None, + LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 0.0, + }, + |_| false, + ) { + Ok(r) => { + steps += 1; + accepted_dt.push(actual); + balance = balance.max(r.volume_balance_error.abs()); + divergence = divergence.max(r.actual_divergence_max); + courant = courant.max(r.max_outward_courant); + writeln!( + ledger, + "{steps},{:.17e},{actual:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + r.time, + r.liquid_volume_after, + r.volume_balance_error, + r.actual_divergence_max, + r.max_outward_courant, + r.fraction_min, + r.fraction_max, + r.inward_boundary_volume, + r.outward_boundary_volume + )?; + } + Err(e) => { + status = "refused"; + failure = format!( + "phase=forward start={:.17e} dt={actual:.17e} error={e:?}", + state.state().time + ); + break; + } + } + } + if status == "complete" && case != "translation" { + let sequence: Vec<_> = accepted_dt.iter().rev().copied().collect(); + let mut j = 0; + while state.state().time < 1.0 { + let remaining = 1.0 - state.state().time; + let actual = sequence + .get(j) + .copied() + .unwrap_or(remaining) + .min(remaining) + .min(dt); + j += 1; + let flow = LiquidFlowInterval::new( + &grid, + stamp(200, steps as u64), + negative.each_ref().map(|a| a.as_slice()), + state.state().time, + actual, + )?; + match state.advance_periodic( + flow, + stamp(300, 0), + None, + LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 0.0, + }, + |_| false, + ) { + Ok(r) => { + steps += 1; + balance = balance.max(r.volume_balance_error.abs()); + divergence = divergence.max(r.actual_divergence_max); + courant = courant.max(r.max_outward_courant); + writeln!( + ledger, + "{steps},{:.17e},{actual:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + r.time, + r.liquid_volume_after, + r.volume_balance_error, + r.actual_divergence_max, + r.max_outward_courant, + r.fraction_min, + r.fraction_max, + r.inward_boundary_volume, + r.outward_boundary_volume + )?; + } + Err(e) => { + status = "refused"; + failure = format!( + "phase=reverse start={:.17e} dt={actual:.17e} rate={reverse_rate:.17e} error={e:?}", + state.state().time + ); + break; + } + } + } + } + ledger.flush()?; + if !failure.is_empty() { + std::fs::write(root.join(format!("refusal-{tag}.txt")), &failure)?; + } + let f = state.state().fraction; + let dv = h * h * h; + let v0 = source.fraction.iter().sum::() * dv; + let vf = f.iter().sum::() * dv; + let diagnostic_l1 = f + .iter() + .zip(&target.fraction) + .map(|(a, b)| (a - b).abs() * dv) + .sum::() + / source.volume; + let m = moments(f, n); + let reference = moments(&target.fraction, n); + let diagnostic_moment_error = (0..3) + .flat_map(|d| (0..2).map(move |j| (m[d][j] - reference[d][j]).abs())) + .fold(0.0, f64::max); + let l1 = if status == "complete" { + diagnostic_l1 + } else { + f64::NAN + }; + let moment_error = if status == "complete" { + diagnostic_moment_error + } else { + f64::NAN + }; + writeln!( + out, + "{case},{n},{requested:.17e},{status},{steps},{:.17e},{v0:.17e},{vf:.17e},{:.17e},{l1:.17e},{balance:.17e},{divergence:.17e},{courant:.17e},{:.17e},{:.17e},{moment_error:.17e}", + state.state().time, + (vf - v0).abs() / v0, + f.iter().copied().fold(f64::INFINITY, f64::min), + f.iter().copied().fold(f64::NEG_INFINITY, f64::max) + )?; + out.flush()?; + binary(&root.join(format!("accepted-{tag}.f64")), f)?; + eprintln!( + "Q1 {tag}: {status}, {steps} steps, t={:.9}", + state.state().time + ); + } + } + } + control.flush()?; + carriers.flush()?; + geometry.flush()?; + out.flush()?; + Ok(()) +} diff --git a/examples/material_partition_gate.rs b/examples/material_partition_gate.rs new file mode 100644 index 00000000..cd7a12b1 --- /dev/null +++ b/examples/material_partition_gate.rs @@ -0,0 +1,268 @@ +//! One n8 material-map reference gate. Not an SPH or production solver. +#[allow(dead_code)] +#[path = "particle_planar_selection/eos.rs"] +mod eos; +#[path = "material_partition_gate/model.rs"] +mod model; +use eos::WATER; +use model::{Model, cholesky_min}; +use std::io::{BufWriter, Write}; +fn dot(a: &[f64], b: &[f64]) -> f64 { + a.iter().zip(b).map(|(a, b)| a * b).sum() +} +fn maxabs(a: &[f64]) -> f64 { + a.iter().map(|a| a.abs()).fold(0.0, f64::max) +} +fn main() -> std::io::Result<()> { + let root = std::env::args_os() + .nth(1) + .expect("fresh output directory required"); + std::fs::create_dir(&root)?; + let root = std::path::Path::new(&root); + let mut s = BufWriter::new(std::fs::File::create(root.join("summary.csv"))?); + let mut nodes = BufWriter::new(std::fs::File::create(root.join("nodes.csv"))?); + let mut elements = BufWriter::new(std::fs::File::create(root.join("elements.csv"))?); + let mut probes = BufWriter::new(std::fs::File::create(root.join("probes.csv"))?); + writeln!( + s, + "perturbed,hydro,deformed,volume_error,mass_error,moment_error,work_error,work_absolute,momentum_error,momentum_absolute,equilibrium_error,bottom_load_error,top_load_error,bottom_load,top_load,wrong_gravity_error,wrong_wall_error,affine_error,cholesky_min,row_bound,quadratic_error,alternating_max,min_density,max_density" + )?; + writeln!( + nodes, + "perturbed,hydro,deformed,i,X,x,mass,force,pressure_force,gravity_force,volume" + )?; + writeln!( + elements, + "perturbed,hydro,deformed,e,L,mass,first,J,pressure" + )?; + writeln!( + probes, + "perturbed,hydro,deformed,translation,eps,energy_fd,energy_analytic,energy_error,volume_error,hessian_error" + )?; + for perturbed in [false, true] { + for hydro in [false, true] { + let m = Model::new(perturbed, hydro); + let p_ref = if hydro { + 100.0 + WATER.rho0 * WATER.gravity + } else { + WATER.rho0 * WATER.sound_speed.powi(2) * 0.005 + }; + let power = p_ref * 0.01; + for deformed in [false, true] { + let x: Vec<_> = m + .reference + .iter() + .enumerate() + .map(|(i, x)| { + x + if deformed && i > 0 && i < 8 { + 0.001 * (std::f64::consts::PI * x).sin() + } else { + 0.0 + } + }) + .collect(); + let v = m.evaluate(&x).unwrap(); + let direction: Vec<_> = (0..=8) + .map(|i| { + if i == 0 || i == 8 { + 0.0 + } else { + 0.01 * (i as f64 * 2.0_f64.sqrt()).sin() + } + }) + .collect(); + let ue_rate: f64 = (0..8) + .map(|e| -v.pressure[e] * (direction[e + 1] - direction[e])) + .sum(); + let ug_rate = m.gravity * dot(&m.nodal_mass, &direction); + let work = dot(&direction, &v.force) + ue_rate + ug_rate; + let momentum = + v.force.iter().sum::() + m.gravity * m.nodal_mass.iter().sum::(); + let equilibrium = if deformed { + f64::NAN + } else if hydro { + (1..8) + .map(|i| v.force[i].abs() / (m.gravity * m.nodal_mass[i])) + .fold(0.0, f64::max) + } else { + maxabs(&v.force[1..8]) / p_ref + }; + let pb = WATER.sound_speed.powi(2) * (m.source_density(0.0) - WATER.rho0); + let pt = WATER.sound_speed.powi(2) * (m.source_density(1.0) - WATER.rho0); + let bottom_error = if deformed { + f64::NAN + } else { + (v.force[0] + pb).abs() / p_ref + }; + let top_error = if deformed { + f64::NAN + } else { + (v.force[8] - pt).abs() / p_ref + }; + let wrong = m.wrong_half_mass(); + let wrong_gravity = if hydro && !deformed { + (1..8) + .map(|i| { + (v.pressure_force[i] - m.gravity * wrong[i]).abs() + / (m.gravity * m.nodal_mass[i]) + }) + .fold(0.0, f64::max) + } else { + f64::NAN + }; + let wrong_wall = if hydro && !deformed { + (v.pressure_force[0] + pb) + .abs() + .max((v.pressure_force[8] - pt).abs()) + / p_ref + } else { + f64::NAN + }; + let cell_pressure: Vec<_> = x + .windows(2) + .map(|a| 100.0 + 1000.0 * 0.5 * (a[0] + a[1])) + .collect(); + let affine = m.manufactured_force(&x, &cell_pressure); + let nodal_volume: Vec<_> = (0..=8) + .map(|i| { + 0.5 * (if i > 0 { x[i] - x[i - 1] } else { 0.0 }) + + 0.5 * (if i < 8 { x[i + 1] - x[i] } else { 0.0 }) + }) + .collect(); + let affine_error = (0..=8) + .map(|i| { + let lift = if i == 0 { + -(100.0 + 1000.0 * x[0]) + } else if i == 8 { + 100.0 + 1000.0 * x[8] + } else { + 0.0 + }; + (affine[i] - lift + 1000.0 * nodal_volume[i]).abs() / 1000.0 + }) + .fold(0.0, f64::max); + let q: Vec<_> = (0..=8) + .map(|i| { + if i == 0 || i == 8 { + 0.0 + } else { + 0.001 * (i as f64 * 3.0_f64.sqrt()).sin() + } + }) + .collect(); + let quadratic: f64 = (0..=8) + .map(|i| (0..=8).map(|j| q[i] * v.hessian[i][j] * q[j]).sum::()) + .sum(); + let edge: f64 = (0..8) + .map(|e| { + WATER.sound_speed.powi(2) * m.mass[e] + / ((m.reference[e + 1] - m.reference[e]).powi(2) + * v.jacobian[e].powi(2)) + * (q[e + 1] - q[e]).powi(2) + }) + .sum(); + let row_bound = (1..8) + .map(|i| { + (1..8) + .map(|j| { + v.hessian[i][j].abs() / (m.nodal_mass[i] * m.nodal_mass[j]).sqrt() + }) + .sum::() + }) + .fold(0.0, f64::max); + let alternate: Vec<_> = (0..8) + .map(|e| 100.0 + if e % 2 == 0 { 10.0 } else { -10.0 }) + .collect(); + let alternating = m.manufactured_force(&x, &alternate); + writeln!( + s, + "{perturbed},{hydro},{deformed},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{equilibrium:.17e},{bottom_error:.17e},{top_error:.17e},{:.17e},{:.17e},{wrong_gravity:.17e},{wrong_wall:.17e},{affine_error:.17e},{:.17e},{row_bound:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + (v.volume - (x[8] - x[0])).abs(), + (m.mass.iter().sum::() - m.nodal_mass.iter().sum::()).abs() + / WATER.rho0, + (v.mass_moment - dot(&m.nodal_mass, &x)).abs() / WATER.rho0, + work.abs() / power, + work.abs(), + momentum.abs() / p_ref, + momentum.abs(), + v.force[0], + v.force[8], + cholesky_min(&v.hessian), + (quadratic - edge).abs() / p_ref.max(quadratic.abs()), + maxabs(&alternating[1..8]), + v.min_density, + v.max_density + )?; + for i in 0..=8 { + writeln!( + nodes, + "{perturbed},{hydro},{deformed},{i},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + m.reference[i], + x[i], + m.nodal_mass[i], + v.force[i], + v.pressure_force[i], + -m.gravity * m.nodal_mass[i], + nodal_volume[i] + )?; + } + for e in 0..8 { + writeln!( + elements, + "{perturbed},{hydro},{deformed},{e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + m.reference[e + 1] - m.reference[e], + m.mass[e], + m.first[e], + v.jacobian[e], + v.pressure[e] + )?; + } + for translation in [false, true] { + let velocity = if translation { + vec![0.01; 9] + } else { + direction.clone() + }; + let expected = if translation { + m.gravity * m.nodal_mass.iter().sum::() * 0.01 + } else { + -dot(&v.force, &velocity) + }; + for eps in [1e-5, 1e-6, 1e-7] { + let xp: Vec<_> = + x.iter().zip(&velocity).map(|(x, v)| x + eps * v).collect(); + let xm: Vec<_> = + x.iter().zip(&velocity).map(|(x, v)| x - eps * v).collect(); + let plus = m.evaluate(&xp).unwrap(); + let minus = m.evaluate(&xm).unwrap(); + let rate = (plus.energy - minus.energy) / (2.0 * eps); + let hessian_error = (0..=8) + .map(|i| { + let analytic: f64 = + (0..=8).map(|j| -v.hessian[i][j] * velocity[j]).sum(); + ((plus.force[i] - minus.force[i]) / (2.0 * eps) - analytic).abs() + / (WATER.rho0 * WATER.sound_speed.powi(2) * 0.01) + }) + .fold(0.0, f64::max); + let volume_error = if translation { + (plus.volume - v.volume) + .abs() + .max((minus.volume - v.volume).abs()) + } else { + 0.0 + }; + writeln!( + probes, + "{perturbed},{hydro},{deformed},{translation},{eps:.17e},{rate:.17e},{expected:.17e},{:.17e},{volume_error:.17e},{hessian_error:.17e}", + (rate - expected).abs() / power + )?; + } + } + } + } + } + s.flush()?; + nodes.flush()?; + elements.flush()?; + probes.flush() +} diff --git a/examples/material_partition_gate/model.rs b/examples/material_partition_gate/model.rs new file mode 100644 index 00000000..55d6201c --- /dev/null +++ b/examples/material_partition_gate/model.rs @@ -0,0 +1,242 @@ +use super::eos::WATER; +#[derive(Debug, PartialEq)] +pub enum Refusal { + Geometry, + WetEnvelope, +} +pub struct Model { + pub reference: Vec, + pub mass: Vec, + pub first: Vec, + pub nodal_mass: Vec, + pub gravity: f64, + pub hydro: bool, +} +pub struct Value { + pub force: Vec, + pub pressure_force: Vec, + pub hessian: Vec>, + pub pressure: Vec, + pub jacobian: Vec, + pub energy: f64, + pub volume: f64, + pub mass_moment: f64, + pub min_density: f64, + pub max_density: f64, +} +impl Model { + pub fn new(perturbed: bool, hydro: bool) -> Self { + let reference: Vec<_> = (0..=8) + .map(|i| { + if i == 0 || i == 8 { + i as f64 / 8.0 + } else { + (i as f64 + + if perturbed { + 0.1 * (i as f64 * 2.399963229728653).sin() + } else { + 0.0 + }) + / 8.0 + } + }) + .collect(); + let gravity = if hydro { WATER.gravity } else { 0.0 }; + let mut mass = Vec::new(); + let mut first = Vec::new(); + let mut nodal_mass = vec![0.0; 9]; + for e in 0..8 { + let l = reference[e + 1] - reference[e]; + let left = if hydro { + WATER.rho0 + * (1.0 + 100.0 / (WATER.rho0 * WATER.sound_speed.powi(2))) + * (gravity * (1.0 - reference[e]) / WATER.sound_speed.powi(2)).exp() + } else { + 1.005 * WATER.rho0 + }; + let m = source_moment(left, gravity / WATER.sound_speed.powi(2), l, 0); + let q = source_moment(left, gravity / WATER.sound_speed.powi(2), l, 1); + mass.push(m); + first.push(q); + nodal_mass[e] += m - q / l; + nodal_mass[e + 1] += q / l; + } + assert!(nodal_mass.iter().all(|m| *m > 0.0)); + Self { + reference, + mass, + first, + nodal_mass, + gravity, + hydro, + } + } + pub fn source_density(&self, x: f64) -> f64 { + if self.hydro { + WATER.rho0 + * (1.0 + 100.0 / (WATER.rho0 * WATER.sound_speed.powi(2))) + * (self.gravity * (1.0 - x) / WATER.sound_speed.powi(2)).exp() + } else { + 1.005 * WATER.rho0 + } + } + pub fn evaluate(&self, x: &[f64]) -> Result { + if x.len() != 9 || x.iter().any(|x| !x.is_finite()) || x.windows(2).any(|w| w[1] <= w[0]) { + return Err(Refusal::Geometry); + } + let mut pressure = vec![0.0; 8]; + let mut jacobian = vec![0.0; 8]; + let mut pressure_force = vec![0.0; 9]; + let mut hessian = vec![vec![0.0; 9]; 9]; + let mut energy = 0.0; + let mut volume = 0.0; + let mut mass_moment = 0.0; + let mut min_density = f64::INFINITY; + let mut max_density: f64 = 0.0; + for e in 0..8 { + let l = self.reference[e + 1] - self.reference[e]; + let dl = x[e] - self.reference[e]; + let dr = x[e + 1] - self.reference[e + 1]; + let eta = (dr - dl) / l; + let j = 1.0 + eta; + if !j.is_finite() || j <= 0.0 { + return Err(Refusal::Geometry); + } + for a in [self.reference[e], self.reference[e + 1]] { + let density = self.source_density(a) / j; + if !density.is_finite() || density <= WATER.rho0 || density > 1.01 * WATER.rho0 { + return Err(Refusal::WetEnvelope); + } + min_density = min_density.min(density); + max_density = max_density.max(density); + } + jacobian[e] = j; + volume += x[e + 1] - x[e]; + pressure[e] = WATER.sound_speed.powi(2) * (self.mass[e] / (l * j) - WATER.rho0); + pressure_force[e] -= pressure[e]; + pressure_force[e + 1] += pressure[e]; + let stiffness = WATER.sound_speed.powi(2) * self.mass[e] / (l * l * j * j); + hessian[e][e] += stiffness; + hessian[e + 1][e + 1] += stiffness; + hessian[e][e + 1] -= stiffness; + hessian[e + 1][e] -= stiffness; + energy += WATER.sound_speed.powi(2) + * ((WATER.rho0 * l - self.mass[e]) * eta + self.mass[e] * log_remainder(eta)); + energy += self.gravity * (self.mass[e] * dl + (dr - dl) * self.first[e] / l); + mass_moment += self.mass[e] * x[e] + (x[e + 1] - x[e]) * self.first[e] / l; + } + let force = pressure_force + .iter() + .zip(&self.nodal_mass) + .map(|(f, m)| f - self.gravity * m) + .collect(); + Ok(Value { + force, + pressure_force, + hessian, + pressure, + jacobian, + energy, + volume, + mass_moment, + min_density, + max_density, + }) + } + pub fn manufactured_force(&self, x: &[f64], p: &[f64]) -> Vec { + assert_eq!(x.len(), 9); + assert_eq!(p.len(), 8); + let mut f = vec![0.0; 9]; + for e in 0..8 { + f[e] -= p[e]; + f[e + 1] += p[e]; + } + f + } + pub fn wrong_half_mass(&self) -> Vec { + let mut m = vec![0.0; 9]; + for e in 0..8 { + m[e] += 0.5 * self.mass[e]; + m[e + 1] += 0.5 * self.mass[e]; + } + m + } +} +fn source_moment(left: f64, a: f64, l: f64, k: i32) -> f64 { + assert!((a * l).abs() <= 0.01); + let mut term = 1.0; + let mut sum = 0.0; + for r in 0..=12 { + if r > 0 { + term *= -a * l / r as f64; + } + sum += term / (r + k + 1) as f64; + } + left * l.powi(k + 1) * sum +} +fn log_remainder(eta: f64) -> f64 { + if eta.abs() >= 0.01 { + return eta - eta.ln_1p(); + } + let mut power = eta * eta; + let mut sum = 0.0; + for r in 2..=18 { + sum += if r % 2 == 0 { + power / r as f64 + } else { + -power / r as f64 + }; + power *= eta; + } + sum +} +pub fn cholesky_min(h: &[Vec]) -> f64 { + let mut l = vec![vec![0.0; 7]; 7]; + let mut min = f64::INFINITY; + for i in 0..7 { + for j in 0..=i { + let s = h[i + 1][j + 1] - (0..j).map(|k| l[i][k] * l[j][k]).sum::(); + if i == j { + assert!(s > 0.0); + min = min.min(s); + l[i][j] = s.sqrt(); + } else { + l[i][j] = s / l[j][j]; + } + } + } + min +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn material_map_refuses_inversion_and_outside_wet_envelope() { + let m = Model::new(true, false); + let mut x = m.reference.clone(); + x.swap(2, 3); + assert!(matches!(m.evaluate(&x), Err(Refusal::Geometry))); + let x: Vec<_> = m.reference.iter().map(|x| 2.0 * x).collect(); + assert!(matches!(m.evaluate(&x), Err(Refusal::WetEnvelope))); + } + #[test] + fn source_moments_retain_constant_source_and_lumped_mass() { + let m = Model::new(true, false); + for e in 0..8 { + let l = m.reference[e + 1] - m.reference[e]; + assert!((m.first[e] - 0.5 * m.mass[e] * l).abs() < 1e-13); + } + assert!((m.nodal_mass.iter().sum::() - m.mass.iter().sum::()).abs() < 1e-12); + } + #[test] + fn incidence_stiffness_has_no_fixed_end_displacement_null() { + let m = Model::new(true, true); + let v = m.evaluate(&m.reference).unwrap(); + assert!(cholesky_min(&v.hessian) > 0.0); + let a: Vec<_> = (0..8) + .map(|e| 100.0 + if e % 2 == 0 { 10.0 } else { -10.0 }) + .collect(); + let f = m.manufactured_force(&m.reference, &a); + assert!(f[1..8].iter().all(|f| f.abs() == 20.0)); + } +} diff --git a/examples/particle_adjoint_selection.rs b/examples/particle_adjoint_selection.rs new file mode 100644 index 00000000..ef9538e3 --- /dev/null +++ b/examples/particle_adjoint_selection.rs @@ -0,0 +1,212 @@ +//! Static, deliberately unqualified P1 method-selection probes; see frozen protocol. +// Reuses immutable preview-independent fixture modules; unused APIs stay private. +#[allow(dead_code)] +#[path = "particle_planar_selection/eos.rs"] +mod eos; +#[allow(dead_code)] +#[path = "particle_planar_selection/kernel.rs"] +mod kernel; +#[path = "particle_adjoint_selection/model.rs"] +mod model; +use eos::WATER; +use model::{Map, State}; +use std::io::{BufWriter, Write}; + +fn main() -> std::io::Result<()> { + let root = std::env::args_os() + .nth(1) + .expect("fresh output directory required"); + std::fs::create_dir(&root)?; + let root = std::path::Path::new(&root); + let mut summary = BufWriter::new(std::fs::File::create(root.join("summary.csv"))?); + let mut sites = BufWriter::new(std::fs::File::create(root.join("sites.csv"))?); + let mut fd = BufWriter::new(std::fs::File::create(root.join("derivatives.csv"))?); + writeln!( + summary, + "map,n,perturbed,hydro,work_normalized,momentum_normalized,e0_force_over_pressure,hydro_max_over_g,hydro_rms_over_g,volume,min_gamma,min_numerator,min_offset,max_offset,linear_interior_error,linear_boundary_error,alternating_nonendpoint_force,work_absolute,momentum_absolute,bottom_load,top_load,bottom_load_error,top_load_error,hydro_interior_max_over_g,hydro_boundary_max_over_g,bottom_load_absolute_error,top_load_absolute_error,max_pressure_acceleration" + )?; + writeln!( + sites, + "map,n,perturbed,hydro,i,y,mass,rho,pressure,volume,force,density_rate,volume_gradient,bottom_density_derivative,top_density_derivative" + )?; + writeln!( + fd, + "map,n,perturbed,hydro,eps,energy_fd,energy_analytic,energy_error,volume_fd,volume_analytic,volume_error,density_error" + )?; + for map in [Map::Gamma, Map::Voronoi] { + for n in [32, 64] { + for perturbed in [false, true] { + for hydro in [false, true] { + let state = State::new(map, n, perturbed, hydro); + let p_ref = if hydro { + 1000.0 + WATER.rho0 * WATER.gravity + } else { + WATER.sound_speed.powi(2) * WATER.rho0 * 0.005 + }; + let u_ref = 0.01; + let value = state.evaluate(&state.y); + let boundary = + |i: usize| state.y[i] < 3.0 / n as f64 || state.y[i] > 1.0 - 3.0 / n as f64; + let v: Vec<_> = (0..n) + .map(|i| 0.01 * ((i + 1) as f64 * 2.0_f64.sqrt()).sin()) + .collect(); + let rate = value.density_rate(&v); + let p: Vec<_> = value.rho.iter().map(|r| WATER.pressure(*r)).collect(); + let (force, walls) = state.force(&state.y, &value, &p); + let kinetic = dot(&v, &force); + let internal: f64 = (0..n) + .map(|i| state.mass[i] * p[i] / value.rho[i].powi(2) * rate[i]) + .sum(); + let work = (kinetic + internal).abs() / (p_ref * u_ref); + let momentum = (force.iter().sum::() + walls[0] + walls[1]).abs() / p_ref; + let volume_gradient = value.volume_gradient(&state.mass); + let expected_walls = if hydro { + let a = 1.0 + 1000.0 / (WATER.rho0 * WATER.sound_speed.powi(2)); + [ + -WATER.rho0 + * WATER.sound_speed.powi(2) + * (a * (WATER.gravity / WATER.sound_speed.powi(2)).exp() - 1.0), + 1000.0, + ] + } else { + [-p_ref, p_ref] + }; + let uniform_pressure = WATER.pressure(1.005 * WATER.rho0); + let e0 = if hydro { + f64::NAN + } else { + max_abs(&force) / uniform_pressure + }; + let residual: Vec<_> = force + .iter() + .zip(&state.mass) + .map(|(f, m)| { + if hydro { + (f / m - WATER.gravity) / WATER.gravity + } else { + f64::NAN + } + }) + .collect(); + let linear: Vec<_> = state.y.iter().map(|y| 1000.0 + 1000.0 * y).collect(); + let (linear_force, _) = state.force(&state.y, &value, &linear); + let linear_error: Vec<_> = (0..n) + .map(|i| { + (linear_force[i] + 1000.0 * state.mass[i] / value.rho[i]).abs() + / (1000.0 * state.mass[i] / value.rho[i]) + }) + .collect(); + let alternating: Vec<_> = (0..n) + .map(|i| 1000.0 + if i % 2 == 0 { 100.0 } else { -100.0 }) + .collect(); + let (alternating_force, _) = state.force(&state.y, &value, &alternating); + writeln!( + summary, + "{},{n},{perturbed},{hydro},{work:.17e},{momentum:.17e},{e0:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + map.name(), + if hydro { max_abs(&residual) } else { f64::NAN }, + (dot(&residual, &residual) / n as f64).sqrt(), + value.total_volume(&state.mass), + value.min_gamma, + value.min_numerator, + state.offset.iter().copied().fold(f64::INFINITY, f64::min), + state + .offset + .iter() + .copied() + .fold(f64::NEG_INFINITY, f64::max), + (0..n) + .filter(|i| !boundary(*i)) + .map(|i| linear_error[i]) + .fold(0.0, f64::max), + (0..n) + .filter(|i| boundary(*i)) + .map(|i| linear_error[i]) + .fold(0.0, f64::max), + max_abs(&alternating_force[1..n - 1]), + (kinetic + internal).abs(), + (force.iter().sum::() + walls[0] + walls[1]).abs(), + walls[0], + walls[1], + (walls[0] - expected_walls[0]).abs() / expected_walls[0].abs(), + (walls[1] - expected_walls[1]).abs() / expected_walls[1].abs(), + if hydro { + (0..n) + .filter(|i| !boundary(*i)) + .map(|i| residual[i].abs()) + .fold(0.0, f64::max) + } else { + f64::NAN + }, + if hydro { + (0..n) + .filter(|i| boundary(*i)) + .map(|i| residual[i].abs()) + .fold(0.0, f64::max) + } else { + f64::NAN + }, + (walls[0] - expected_walls[0]).abs(), + (walls[1] - expected_walls[1]).abs(), + force + .iter() + .zip(&state.mass) + .map(|(f, m)| (f / m).abs()) + .fold(0.0, f64::max) + )?; + for i in 0..n { + writeln!( + sites, + "{},{n},{perturbed},{hydro},{i},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + map.name(), + state.y[i], + state.mass[i], + value.rho[i], + p[i], + state.mass[i] / value.rho[i], + force[i], + rate[i], + volume_gradient[i], + value.wall_jac[i][0], + value.wall_jac[i][1] + )?; + } + for eps in [1e-5, 1e-6, 1e-7] { + let yp: Vec<_> = state.y.iter().zip(&v).map(|(y, v)| y + eps * v).collect(); + let ym: Vec<_> = state.y.iter().zip(&v).map(|(y, v)| y - eps * v).collect(); + let plus = state.evaluate(&yp); + let minus = state.evaluate(&ym); + let energy_fd = + (plus.energy(&state.mass) - minus.energy(&state.mass)) / (2.0 * eps); + let volume_fd = (plus.total_volume(&state.mass) + - minus.total_volume(&state.mass)) + / (2.0 * eps); + let volume_analytic = dot(&volume_gradient, &v); + let density_error = (0..n) + .map(|i| { + ((plus.rho[i] - minus.rho[i]) / (2.0 * eps) - rate[i]).abs() + / (WATER.rho0 * u_ref * n as f64) + }) + .fold(0.0, f64::max); + writeln!( + fd, + "{},{n},{perturbed},{hydro},{eps:.17e},{energy_fd:.17e},{internal:.17e},{:.17e},{volume_fd:.17e},{volume_analytic:.17e},{:.17e},{density_error:.17e}", + map.name(), + (energy_fd - internal).abs() / (p_ref * u_ref), + (volume_fd - volume_analytic).abs() / u_ref + )?; + } + } + } + } + } + summary.flush()?; + sites.flush()?; + fd.flush() +} +fn dot(a: &[f64], b: &[f64]) -> f64 { + a.iter().zip(b).map(|(a, b)| a * b).sum() +} +fn max_abs(a: &[f64]) -> f64 { + a.iter().map(|a| a.abs()).fold(0.0, f64::max) +} diff --git a/examples/particle_adjoint_selection/model.rs b/examples/particle_adjoint_selection/model.rs new file mode 100644 index 00000000..f7e36709 --- /dev/null +++ b/examples/particle_adjoint_selection/model.rs @@ -0,0 +1,272 @@ +use super::{eos::WATER, kernel::Kernel}; +#[derive(Clone, Copy)] +pub enum Map { + Gamma, + Voronoi, +} +impl Map { + pub fn name(self) -> &'static str { + match self { + Self::Gamma => "gamma-offset-adjoint-planar-v1", + Self::Voronoi => "clipped-voronoi-1d-reference-v1", + } + } +} +pub struct State { + pub map: Map, + pub y: Vec, + pub mass: Vec, + pub offset: Vec, + kernel: Kernel, +} +pub struct Value { + pub rho: Vec, + pub jac: Vec>, + pub wall_jac: Vec<[f64; 2]>, + pub min_gamma: f64, + pub min_numerator: f64, +} +fn faces(y: &[f64]) -> Vec { + std::iter::once(0.0) + .chain(y.windows(2).map(|a| 0.5 * (a[0] + a[1]))) + .chain(std::iter::once(1.0)) + .collect() +} +impl State { + pub fn new(map: Map, n: usize, perturbed: bool, hydro: bool) -> Self { + let dx = 1.0 / n as f64; + let y: Vec<_> = (0..n) + .map(|i| { + (i as f64 + + 0.5 + + if perturbed { + 0.1 * ((i + 1) as f64 * 2.399963229728653).sin() + } else { + 0.0 + }) + * dx + }) + .collect(); + let f = faces(&y); + let a = 1.0 + 1000.0 / (WATER.rho0 * WATER.sound_speed.powi(2)); + let mass: Vec<_> = (0..n) + .map(|i| { + let (lo, hi) = match map { + Map::Gamma => (i as f64 * dx, (i + 1) as f64 * dx), + Map::Voronoi => (f[i], f[i + 1]), + }; + if hydro { + a * WATER.column_mass(lo, hi, 1.0) + } else { + 1.005 * WATER.rho0 * (hi - lo) + } + }) + .collect(); + let kernel = Kernel { radius: 3.0 * dx }; + let offset = (0..n) + .map(|i| { + if matches!(map, Map::Voronoi) { + return 0.0; + } + let rho = if hydro { + WATER.rho0 + * a + * (WATER.gravity * (1.0 - y[i]) / WATER.sound_speed.powi(2)).exp() + } else { + 1.005 * WATER.rho0 + }; + rho * kernel.gamma(y[i], 1.0, true).0 + - (0..n) + .map(|j| mass[j] * kernel.line(y[i] - y[j])) + .sum::() + }) + .collect(); + Self { + map, + y, + mass, + offset, + kernel, + } + } + pub fn evaluate(&self, y: &[f64]) -> Value { + let n = y.len(); + assert!(y[0] > 0.0 && y[n - 1] < 1.0 && y.windows(2).all(|a| a[1] > a[0])); + let mut rho = vec![0.0; n]; + let mut jac = vec![vec![0.0; n]; n]; + let mut wall_jac = vec![[0.0; 2]; n]; + let mut min_gamma = if matches!(self.map, Map::Gamma) { + f64::INFINITY + } else { + f64::NAN + }; + let mut min_numerator = min_gamma; + match self.map { + Map::Gamma => { + for i in 0..n { + let (gamma, gp) = self.kernel.gamma(y[i], 1.0, true); + let numerator = self.offset[i] + + (0..n) + .map(|j| self.mass[j] * self.kernel.line(y[i] - y[j])) + .sum::(); + assert!(gamma > 0.0 && numerator > 0.0 && numerator.is_finite()); + min_gamma = min_gamma.min(gamma); + min_numerator = min_numerator.min(numerator); + rho[i] = numerator / gamma; + for k in 0..n { + let g = self.kernel.line_gradient(y[i] - y[k]); + jac[i][i] += self.mass[k] * g / gamma; + jac[i][k] -= self.mass[k] * g / gamma; + } + jac[i][i] -= rho[i] * gp / gamma; + wall_jac[i] = [ + rho[i] * self.kernel.line(y[i]) / gamma, + -rho[i] * self.kernel.line(y[i] - 1.0) / gamma, + ]; + } + } + Map::Voronoi => { + let f = faces(y); + for i in 0..n { + let volume = f[i + 1] - f[i]; + assert!(volume > 0.0); + rho[i] = self.mass[i] / volume; + if i + 1 < n { + jac[i][i] -= 0.5 * rho[i] / volume; + jac[i][i + 1] -= 0.5 * rho[i] / volume; + } + if i > 0 { + jac[i][i - 1] += 0.5 * rho[i] / volume; + jac[i][i] += 0.5 * rho[i] / volume; + } + if i == 0 { + wall_jac[i][0] = rho[i] / volume; + } + if i + 1 == n { + wall_jac[i][1] = -rho[i] / volume; + } + } + } + } + assert!(rho.iter().all(|r| r.is_finite() && *r > WATER.rho0)); + Value { + rho, + jac, + wall_jac, + min_gamma, + min_numerator, + } + } + pub fn force(&self, y: &[f64], value: &Value, p: &[f64]) -> (Vec, [f64; 2]) { + let n = y.len(); + let mut force = vec![0.0; n]; + let mut walls = [0.0; 2]; + match self.map { + Map::Gamma => { + let gamma: Vec<_> = y + .iter() + .map(|y| self.kernel.gamma(*y, 1.0, true).0) + .collect(); + for i in 0..n { + for j in i + 1..n { + let pair = -self.mass[i] + * self.mass[j] + * (p[i] / value.rho[i].powi(2) / gamma[i] + + p[j] / value.rho[j].powi(2) / gamma[j]) + * self.kernel.line_gradient(y[i] - y[j]); + force[i] += pair; + force[j] -= pair; + } + let factor = self.mass[i] * p[i] / (value.rho[i] * gamma[i]); + let bottom = factor * self.kernel.line(y[i]); + let top = -factor * self.kernel.line(y[i] - 1.0); + force[i] += bottom + top; + walls[0] -= bottom; + walls[1] -= top; + } + } + Map::Voronoi => { + for j in 1..n { + let shared = 0.5 * (p[j - 1] - p[j]); + force[j - 1] += shared; + force[j] += shared; + } + walls = [-p[0], p[n - 1]]; + } + } + (force, walls) + } +} +impl Value { + pub fn density_rate(&self, v: &[f64]) -> Vec { + self.jac.iter().map(|row| super::dot(row, v)).collect() + } + pub fn volume_gradient(&self, mass: &[f64]) -> Vec { + (0..mass.len()) + .map(|k| { + (0..mass.len()) + .map(|i| -mass[i] / self.rho[i].powi(2) * self.jac[i][k]) + .sum() + }) + .collect() + } + pub fn total_volume(&self, mass: &[f64]) -> f64 { + mass.iter().zip(&self.rho).map(|(m, r)| m / r).sum() + } + pub fn energy(&self, mass: &[f64]) -> f64 { + mass.iter() + .zip(&self.rho) + .map(|(m, r)| m * WATER.energy(*r)) + .sum() + } +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn jacobian_and_independent_pair_force_are_adjoint() { + for map in [Map::Gamma, Map::Voronoi] { + let s = State::new(map, 32, true, true); + let v = s.evaluate(&s.y); + let p: Vec<_> = (0..32).map(|i| 1000.0 + (i as f64).sin() * 100.0).collect(); + let (f, w) = s.force(&s.y, &v, &p); + for (k, fk) in f.iter().enumerate() { + let adjoint: f64 = (0..32) + .map(|i| -s.mass[i] * p[i] / v.rho[i].powi(2) * v.jac[i][k]) + .sum(); + assert!((fk - adjoint).abs() < 1e-10); + } + for (b, wb) in w.iter().enumerate() { + let expected: f64 = (0..32) + .map(|i| -s.mass[i] * p[i] / v.rho[i].powi(2) * v.wall_jac[i][b]) + .sum(); + assert!((wb - expected).abs() < 1e-10); + } + } + } + #[test] + fn reference_has_exact_partition_and_retains_null_mode() { + let s = State::new(Map::Voronoi, 32, true, false); + let v = s.evaluate(&s.y); + assert!((v.total_volume(&s.mass) - 1.0).abs() < 1e-14); + assert!(v.volume_gradient(&s.mass).iter().all(|g| g.abs() < 1e-14)); + let (f, _) = s.force(&s.y, &v, &[1234.0; 32]); + assert!(f.iter().all(|f| *f == 0.0)); + let p: Vec<_> = (0..32) + .map(|i| if i % 2 == 0 { 1100.0 } else { 900.0 }) + .collect(); + let (f, _) = s.force(&s.y, &v, &p); + assert!(f[1..31].iter().all(|f| *f == 0.0)); + assert_eq!(f[0], 100.0); + assert_eq!(f[31], 100.0); + } + #[test] + fn offsets_are_not_reset_by_displacement() { + let s = State::new(Map::Gamma, 32, true, false); + let mut shifted = s.y.clone(); + shifted[8] += 1e-5; + let original = s.evaluate(&s.y); + let moved = s.evaluate(&shifted); + assert!((moved.rho[8] - original.rho[8]).abs() > 1e-7); + } +} diff --git a/examples/particle_planar_selection.rs b/examples/particle_planar_selection.rs new file mode 100644 index 00000000..8d305d5e --- /dev/null +++ b/examples/particle_planar_selection.rs @@ -0,0 +1,145 @@ +//! Pre-admission P1 native numerical experiment. Exit 0 means measurements +//! completed; it never means the fixed scientific acceptance gates passed. +#[path = "particle_planar_selection/cloud.rs"] +mod cloud; +#[path = "particle_planar_selection/eos.rs"] +mod eos; +#[path = "particle_planar_selection/fixtures.rs"] +mod fixtures; +#[path = "particle_planar_selection/isolation.rs"] +mod isolation; +#[path = "particle_planar_selection/kernel.rs"] +mod kernel; +#[path = "particle_planar_selection/matrix.rs"] +mod matrix; +#[path = "particle_planar_selection/planar.rs"] +mod planar; +use planar::Method; +use std::{ + fs::{self, File}, + io::{BufWriter, Write}, + path::Path, +}; +/// Reproducible signed uniform sample in [-1,1), independent of platform RNG. +fn noise(index: u64, stream: u64) -> f64 { + let mut x = index + .wrapping_add(stream.wrapping_mul(0x9e3779b97f4a7c15)) + .wrapping_add(0x123456789abcdef0); + x = (x ^ (x >> 30)).wrapping_mul(0xbf58476d1ce4e5b9); + x = (x ^ (x >> 27)).wrapping_mul(0x94d049bb133111eb); + x ^= x >> 31; + 2.0 * ((x >> 11) as f64 / (1_u64 << 53) as f64) - 1.0 +} +fn writer(path: impl AsRef) -> std::io::Result> { + Ok(BufWriter::new(File::create(path)?)) +} +fn main() -> Result<(), Box> { + let args: Vec<_> = std::env::args_os().collect(); + if args.len() != 2 { + return Err("usage: particle_planar_selection FRESH_DIRECTORY".into()); + } + let root = Path::new(&args[1]); + fs::create_dir(root)?; + let mut hydro = writer(root.join("hydro.csv"))?; + writeln!( + hydro, + "method,n,h_over_dx,perturbed,requested_dt_s,status,steps,time_s,initial_acceleration_rms_m_s2,max_speed_m_s,density_relative_rms,pressure_relative_rms,mass_relative_defect,energy_change_j_m2,pressure_work_defect_j_m2,viscous_work_j_m2,energy_ledger_closure_j_m2,kick_drift_remainder_j_m2,density_kick_remainder_j_m2,eos_chain_remainder_j_m2,pair_momentum_defect_kg_m_s_m2,max_neighbors_1d" + )?; + for method in [Method::Dummy, Method::Gamma] { + for n in [16, 24, 32] { + for ratio in [1.5, 2.0, 2.5] { + for perturbed in [false, true] { + for dt in [1e-4, 5e-5, 2.5e-5] { + let name = + format!("hydro-{}-{n}-{ratio}-{perturbed}-{dt}.csv", method.name()); + let mut raw = writer(root.join(name))?; + fixtures::hydro(method, n, ratio, perturbed, dt, &mut hydro, &mut raw)?; + raw.flush()?; + } + } + } + } + } + hydro.flush()?; + println!("hydrostatic reduced screens measured (not production acceptance)"); + let mut shear = writer(root.join("shear.csv"))?; + writeln!( + shear, + "method,case,n,h_over_dx,requested_dt_s,status,steps,actual_dt_s,contraction_limit_s,velocity_relative_rms,traction_relative_error,momentum_ledger_kg_m_s_m2,max_pair_momentum_defect_pa,wall_work_j_m2,viscous_fluid_work_j_m2,viscous_exchange_after_wall_work_j_m2,temporal_energy_j_m2,lower_traction_pa,upper_traction_pa,time_s,final_dt_s" + )?; + for method in [Method::Dummy, Method::Gamma] { + for n in [16, 32, 64] { + for ratio in [1.5, 2.0, 2.5] { + for dt in [1e-4, 5e-5, 2.5e-5] { + for kind in [ + fixtures::ShearKind::Poiseuille, + fixtures::ShearKind::Couette, + fixtures::ShearKind::Slip, + ] { + let label = match kind { + fixtures::ShearKind::Poiseuille => "poiseuille", + fixtures::ShearKind::Couette => "couette", + fixtures::ShearKind::Slip => "slip", + }; + let name = format!("shear-{}-{n}-{ratio}-{dt}-{label}.csv", method.name()); + let mut raw = writer(root.join(name))?; + fixtures::shear(method, n, ratio, dt, kind, &mut shear, &mut raw)?; + raw.flush()?; + } + } + } + } + } + shear.flush()?; + println!("native assembled viscous matrix and reduced shear screens measured"); + let mut clouds = writer(root.join("clouds.csv"))?; + writeln!( + clouds, + "stencil,n,h_over_dx,perturbed,min_neighbors,max_neighbors,mean_neighbors,partition_rms_error,gradient_y_rms_error,laplacian_y_rms_error,decay_rate_s_inverse,decay_relative_error,momentum_rate_n,kinetic_power_w" + )?; + for stencil in [cloud::Stencil::Wendland, cloud::Stencil::Preview] { + for n in [16, 24, 32] { + for ratio in [1.5, 2.0, 2.5] { + for perturbed in [false, true] { + let name = format!("cloud-{}-{n}-{ratio}-{perturbed}.csv", stencil.name()); + let mut raw = writer(root.join(name))?; + cloud::run(n, ratio, perturbed, stencil, &mut clouds, &mut raw)?; + raw.flush()?; + } + } + } + } + clouds.flush()?; + let mut isolation = writer(root.join("isolation.csv"))?; + isolation::run(&mut isolation)?; + isolation.flush()?; + // These APIs intentionally keep the missing scientific admission visible. + let mut admission = writer(root.join("admission.txt"))?; + writeln!( + admission, + "production dt: {:?}", + eos::WATER.production_dt(1.0, 0.0) + )?; + writeln!( + admission, + "thin volumetric support: {:?}", + isolation::Slab::new([1.0, 0.0, 0.0], -0.01, 0.01) + .and_then(|s| s.admit_volumetric_support(0.1)) + )?; + admission.flush()?; + println!("3D cloud instantaneous operator screens measured; inspect retained failures"); + Ok(()) +} +#[cfg(test)] +mod tests { + #[test] + fn perturbation_bound_and_reproducibility() { + for i in 0..10000 { + for d in 0..3 { + let x = super::noise(i, d); + assert!((-1.0..1.0).contains(&x)); + assert_eq!(x, super::noise(i, d)); + } + } + } +} diff --git a/examples/particle_planar_selection/cloud.rs b/examples/particle_planar_selection/cloud.rs new file mode 100644 index 00000000..37202a61 --- /dev/null +++ b/examples/particle_planar_selection/cloud.rs @@ -0,0 +1,248 @@ +//! Actual 3D periodic ordered/perturbed native operator consistency screens. +use super::{eos::WATER, kernel::Kernel, noise}; +use std::{f64::consts::PI, io::Write}; +#[derive(Clone, Copy, Debug)] +pub enum Stencil { + Wendland, + Preview, +} +impl Stencil { + pub fn name(self) -> &'static str { + match self { + Self::Wendland => "wendland-c2-morris-3d-screen-v1", + Self::Preview => "preview-poly6-spiky-3d-support-screen-v1", + } + } + fn weights(self, k: Kernel, r: f64) -> (f64, f64, f64) { + match self { + Self::Wendland => (k.volume(r), k.phi(r), 2.0 * k.phi(r)), + Self::Preview => { + let h = k.radius; + let poly = 315.0 / (64.0 * PI * h.powi(9)); + ( + poly * (h * h - r * r).powi(3), + 6.0 * poly * (h * h - r * r).powi(2), + 45.0 / (PI * h.powi(6)) * (h - r), + ) + } + } + } +} +pub fn run( + n: usize, + ratio: f64, + perturbed: bool, + stencil: Stencil, + summary: &mut impl Write, + raw: &mut impl Write, +) -> std::io::Result<()> { + let length = 0.001; + let dx = length / n as f64; + let volume = dx.powi(3); + let mass = WATER.rho0 * volume; + let k = Kernel { + radius: 2.0 * ratio * dx, + }; + let count = n * n * n; + let mut positions = Vec::with_capacity(count); + let mut velocities = Vec::with_capacity(count); + for z in 0..n { + for y in 0..n { + for x in 0..n { + let id = positions.len(); + let displacement = std::array::from_fn::<_, 3, _>(|d| noise(id as u64, d as u64)); + let scale = displacement + .iter() + .map(|v| v * v) + .sum::() + .sqrt() + .max(1.0); + let p: [f64; 3] = std::array::from_fn(|d| { + let coordinate = [x, y, z][d]; + (coordinate as f64 + 0.5) * dx + + if perturbed { + 0.1 * dx * displacement[d] / scale + } else { + 0.0 + } + }); + positions.push(p); + velocities.push(0.001 * (2.0 * PI * p[1] / length).sin()); + } + } + } + let self_weight = stencil.weights(k, 0.0).0 * volume; + let mut partition = vec![self_weight; count]; + let mut gradient = vec![0.0; count]; + let mut laplacian = vec![0.0; count]; + let mut acceleration = vec![0.0; count]; + let mut neighbors = vec![0_usize; count]; + let reach = (k.radius / dx + if perturbed { 0.2 } else { 0.0 }).ceil() as isize; + assert!(2 * reach + 1 < n as isize); // This bounded source never duplicates periodic cells. + for i in 0..count { + let base = [i % n, (i / n) % n, i / (n * n)]; + for oz in -reach..=reach { + for oy in -reach..=reach { + for ox in -reach..=reach { + let index = |d: usize, offset: isize| { + (base[d] as isize + offset).rem_euclid(n as isize) as usize + }; + let j = (index(2, oz) * n + index(1, oy)) * n + index(0, ox); + if j <= i { + continue; + } + let delta = std::array::from_fn::<_, 3, _>(|d| { + let v = positions[i][d] - positions[j][d]; + v - length * (v / length).round() + }); + let r2: f64 = delta.iter().map(|v| v * v).sum(); + if r2 >= k.radius.powi(2) { + continue; + } + let (w, g, lap) = stencil.weights(k, r2.sqrt()); + let a = WATER.mu / WATER.rho0 * volume * lap * (velocities[j] - velocities[i]); + for id in [i, j] { + partition[id] += volume * w; + gradient[id] += volume * g * delta[1].powi(2); + laplacian[id] += 0.5 * volume * lap * delta[1].powi(2); + neighbors[id] += 1; + } + acceleration[i] += a; + acceleration[j] -= a; + } + } + } + } + let rms = |x: &[f64]| (x.iter().map(|v| (v - 1.0).powi(2)).sum::() / count as f64).sqrt(); + let power: f64 = velocities + .iter() + .zip(&acceleration) + .map(|(v, a)| mass * v * a) + .sum(); + let momentum_rate: f64 = acceleration.iter().map(|a| mass * a).sum(); + let rayleigh = -velocities + .iter() + .zip(&acceleration) + .map(|(v, a)| v * a) + .sum::() + / velocities.iter().map(|v| v * v).sum::(); + let exact = WATER.mu / WATER.rho0 * (2.0 * PI / length).powi(2); + writeln!( + summary, + "{},{},{},{},{},{},{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + stencil.name(), + n, + ratio, + perturbed, + neighbors.iter().min().unwrap(), + neighbors.iter().max().unwrap(), + neighbors.iter().sum::() as f64 / count as f64, + rms(&partition), + rms(&gradient), + rms(&laplacian), + rayleigh, + (rayleigh / exact - 1.0).abs(), + momentum_rate, + power + )?; + writeln!( + raw, + "index,x_m,y_m,z_m,velocity_x_m_s,acceleration_x_m_s2,partition,gradient_y_moment,laplacian_y_moment,neighbors" + )?; + for i in 0..count { + writeln!( + raw, + "{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{}", + i, + positions[i][0], + positions[i][1], + positions[i][2], + velocities[i], + acceleration[i], + partition[i], + gradient[i], + laplacian[i], + neighbors[i] + )?; + } + Ok(()) +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn periodic_three_dimensional_native_operator_has_dissipative_pair_power() { + for stencil in [Stencil::Wendland, Stencil::Preview] { + let mut summary = Vec::new(); + run(16, 1.5, true, stencil, &mut summary, &mut std::io::sink()).unwrap(); + let row = String::from_utf8(summary).unwrap(); + let values: Vec<_> = row.trim().split(',').collect(); + let momentum: f64 = values[12].parse().unwrap(); + let power: f64 = values[13].parse().unwrap(); + assert!(momentum.abs() < 1e-20); + assert!(power < 0.0); + } + } + + #[test] + fn linked_offsets_agree_with_independent_periodic_all_pairs() { + let n = 10; + let length = 0.001; + let dx = length / n as f64; + let h = 1.5 * dx; + let radius = 2.0 * h; + let mut raw = Vec::new(); + run( + n, + 1.5, + true, + Stencil::Wendland, + &mut std::io::sink(), + &mut raw, + ) + .unwrap(); + let text = String::from_utf8(raw).unwrap(); + let rows: Vec> = text + .lines() + .skip(1) + .map(|line| line.split(',').map(|x| x.parse().unwrap()).collect()) + .collect(); + for (i, row) in rows.iter().enumerate() { + let base = [i % n, (i / n) % n, i / (n * n)]; + let displacement: f64 = (0..3) + .map(|d| ((row[d + 1] - (base[d] as f64 + 0.5) * dx) / dx).powi(2)) + .sum(); + assert!(displacement.sqrt() <= 0.1 + 1e-14); + let mut partition = 0.0; + let mut acceleration = 0.0; + let mut neighbors = 0; + // Deliberately no linked-cell offsets, shared kernel helper or + // shared minimum-image expression in this enumeration oracle. + for (j, other) in rows.iter().enumerate() { + let r2: f64 = (0..3) + .map(|d| { + let direct = (row[d + 1] - other[d + 1]).abs(); + direct.min(length - direct).powi(2) + }) + .sum(); + if r2 >= radius * radius { + continue; + } + if i != j { + neighbors += 1; + } + let q = r2.sqrt() / (2.0 * h); + let weight = 21.0 / (16.0 * PI * h.powi(3)) * (1.0 - q).powi(4) * (1.0 + 4.0 * q); + partition += dx.powi(3) * weight; + let minus_derivative_over_r = 105.0 / (16.0 * PI * h.powi(5)) * (1.0 - q).powi(3); + acceleration += 2.0 * WATER.mu / WATER.rho0 + * dx.powi(3) + * minus_derivative_over_r + * (other[4] - row[4]); + } + assert!((partition - row[6]).abs() < 2e-13); + assert!((acceleration - row[5]).abs() < 2e-13); + assert_eq!(neighbors, row[9] as usize); + } + } +} diff --git a/examples/particle_planar_selection/eos.rs b/examples/particle_planar_selection/eos.rs new file mode 100644 index 00000000..8c14d3a1 --- /dev/null +++ b/examples/particle_planar_selection/eos.rs @@ -0,0 +1,146 @@ +//! Linear compressed EOS reference, SI. No production defaults are changed. +#[derive(Clone, Copy, Debug)] +pub struct Water { + pub rho0: f64, + pub mu: f64, + pub gravity: f64, + pub sound_speed: f64, +} +pub const WATER: Water = Water { + rho0: 998.2, + mu: 0.001002, + gravity: 9.80665, + sound_speed: 32.0, +}; +#[derive(Debug, PartialEq)] +pub enum AdmissionError { + InvalidInput, + Compression, + Mach, + /// No selected, qualified discrete pressure/geometry stability bound exists. + UnqualifiedAcousticOperator, +} +impl Water { + pub fn validate(self) -> Result { + if [self.rho0, self.sound_speed] + .iter() + .any(|x| !x.is_finite() || *x <= 0.0) + || !self.mu.is_finite() + || self.mu < 0.0 + || !self.gravity.is_finite() + || self.gravity < 0.0 + || !self.sound_speed.powi(2).is_normal() + { + return Err(AdmissionError::InvalidInput); + } + Ok(self) + } + pub fn equilibrium(self, depth: f64) -> Result<(f64, f64), AdmissionError> { + self.validate()?; + if !depth.is_finite() || depth < 0.0 { + return Err(AdmissionError::InvalidInput); + } + let compression = (self.gravity * depth / self.sound_speed.powi(2)).exp_m1(); + let rho = self.rho0 * (1.0 + compression); + let p = self.rho0 * self.sound_speed.powi(2) * compression; + if !rho.is_finite() || !p.is_finite() { + return Err(AdmissionError::InvalidInput); + } + Ok((rho, p)) + } + /// Exact exponential profile integrated through a parcel; kg/m². + pub fn column_mass(self, lower: f64, upper: f64, height: f64) -> f64 { + if self.gravity == 0.0 { + return self.rho0 * (upper - lower); + } + let a = self.gravity / self.sound_speed.powi(2); + self.rho0 * (a * (height - upper)).exp() * (a * (upper - lower)).exp_m1() / a + } + pub fn pressure(self, rho: f64) -> f64 { + self.sound_speed.powi(2) * (rho - self.rho0).max(0.0) + } + pub fn energy(self, rho: f64) -> f64 { + let x = (rho / self.rho0 - 1.0).max(0.0); + // Avoid cancellation of the two O(x) terms near the branch endpoint. + let reduced = if x < 1e-3 { + x * x * (0.5 + x * (-2.0 / 3.0 + x * (0.75 + x * (-0.8 + x * 5.0 / 6.0)))) + } else { + x.ln_1p() - x / (1.0 + x) + }; + self.sound_speed.powi(2) * reduced + } + pub fn envelope(self, height: f64, epsilon: f64, speed: f64) -> Result<(), AdmissionError> { + self.validate()?; + if !height.is_finite() + || height < 0.0 + || !epsilon.is_finite() + || epsilon <= 0.0 + || !speed.is_finite() + || speed < 0.0 + { + return Err(AdmissionError::InvalidInput); + } + if self.sound_speed.powi(2) < self.gravity * height / epsilon.ln_1p() { + return Err(AdmissionError::Compression); + } + if speed / self.sound_speed > 0.1 { + return Err(AdmissionError::Mach); + } + Ok(()) + } + /// Deliberately refuses production admission until the selected operator + /// has a verified discrete bound. A scale such as h/c is not that bound. + pub fn production_dt(self, height: f64, speed: f64) -> Result { + self.envelope(height, 0.01, speed)?; + Err(AdmissionError::UnqualifiedAcousticOperator) + } +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn eos_equilibrium_and_thermodynamic_derivative() { + let (rho, p) = WATER.equilibrium(1.0).unwrap(); + assert!((WATER.pressure(rho) - p).abs() < 2e-10); + assert!(rho / WATER.rho0 - 1.0 < 0.01); + let d = 1e-3; + let derivative = (WATER.energy(rho + d) - WATER.energy(rho - d)) / (2.0 * d); + assert!((derivative - p / rho.powi(2)).abs() < 1e-10); + assert_eq!(WATER.energy(WATER.rho0 * 0.9), 0.0); + let mass = WATER.column_mass(0.0, 1.0, 1.0); + let independent = WATER.rho0 * WATER.sound_speed.powi(2) / WATER.gravity + * (WATER.gravity / WATER.sound_speed.powi(2)).exp_m1(); + assert!((mass - independent).abs() < 1e-12); + } + #[test] + fn admission_never_confuses_scale_with_stability() { + let zero_g = Water { + gravity: 0.0, + ..WATER + }; + zero_g.validate().unwrap(); + assert_eq!(zero_g.equilibrium(1.0).unwrap(), (WATER.rho0, 0.0)); + assert_eq!(zero_g.column_mass(0.0, 1.0, 1.0), WATER.rho0); + assert_eq!( + WATER.production_dt(1.0, 0.0), + Err(AdmissionError::UnqualifiedAcousticOperator) + ); + assert_eq!(WATER.envelope(1.0, 0.01, 3.21), Err(AdmissionError::Mach)); + let soft = Water { + sound_speed: 20.0, + ..WATER + }; + assert_eq!( + soft.envelope(1.0, 0.01, 0.0), + Err(AdmissionError::Compression) + ); + assert_eq!( + WATER.envelope(f64::NAN, 0.01, 0.0), + Err(AdmissionError::InvalidInput) + ); + assert_eq!( + WATER.equilibrium(f64::INFINITY), + Err(AdmissionError::InvalidInput) + ); + } +} diff --git a/examples/particle_planar_selection/fixtures.rs b/examples/particle_planar_selection/fixtures.rs new file mode 100644 index 00000000..1dfbc4fc --- /dev/null +++ b/examples/particle_planar_selection/fixtures.rs @@ -0,0 +1,433 @@ +use super::{ + matrix, + planar::{Column, Method}, +}; +use std::io::Write; + +pub fn hydro( + method: Method, + n: usize, + ratio: f64, + perturbed: bool, + dt: f64, + summary: &mut impl Write, + raw: &mut impl Write, +) -> std::io::Result<()> { + let mut c = Column::hydrostatic(n, ratio, perturbed); + let initial_state = c.clone(); + let mut rejected_state = None; + let initial_energy = c.energy(); + let mass0: f64 = c.mass.iter().sum(); + let initial = c.evaluate(method, false, 0.0, false); + let defect = (initial + .pressure_acceleration + .iter() + .map(|a| (a - c.water.gravity).powi(2)) + .sum::() + / n as f64) + .sqrt(); + let mut time = 0.0_f64; + let mut max_speed = 0.0_f64; + let mut pressure_work = 0.0; + let mut viscous_work = 0.0; + let mut momentum_defect = 0.0; + let mut kick_drift_remainder = 0.0; + let mut density_kick_remainder = 0.0; + let mut eos_chain_remainder = 0.0; + let mut steps = 0; + let mut status = "complete"; + let mut max_neighbors = initial.max_neighbors; + while time < 0.1 { + let actual_dt = dt.min(0.1 - time); + let e = c.evaluate(method, false, 0.0, false); + max_neighbors = max_neighbors.max(e.max_neighbors); + let pair_defect: f64 = c + .mass + .iter() + .zip(e.pressure_acceleration.iter().zip(&e.viscous_acceleration)) + .map(|(m, (a, b))| m * (a + b)) + .sum::() + + e.wall_pressure_force + + e.wall_viscous_force; + // Velocity kick then continuity/drift with the kicked velocity. This + // research adaptation is NOT simultaneous forward Euler acoustics. + let mut kicked_state = c.clone(); + for i in 0..n { + kicked_state.velocity[i] += actual_dt + * (e.pressure_acceleration[i] + e.viscous_acceleration[i] - c.water.gravity); + } + let kicked = kicked_state.evaluate(method, false, 0.0, false); + let mut next = kicked_state; + for i in 0..n { + next.rho[i] += actual_dt * kicked.density_rate[i]; + next.y[i] += actual_dt * next.velocity[i]; + } + let finite = next + .y + .iter() + .chain(&next.rho) + .chain(&next.velocity) + .all(|v| v.is_finite()); + let speed = next + .velocity + .iter() + .map(|v| v.abs()) + .fold(0.0_f64, f64::max); + if !finite { + status = "nonfinite-refused"; + rejected_state = Some(next); + break; + } + if next.rho.iter().any(|r| *r <= 0.0) { + status = "density-refused"; + rejected_state = Some(next); + break; + } + if next.y.iter().any(|y| *y <= 0.0) { + status = "crossing-refused"; + rejected_state = Some(next); + break; + } + if speed / c.water.sound_speed > 0.1 { + status = "mach-refused"; + rejected_state = Some(next); + break; + } + // Independent exact finite-step decomposition: kinetic kick and + // affine gravitational drift, density's use of kicked velocity, then + // the nonlinear EOS Taylor remainder. None is inferred from ΔE. + for i in 0..n { + let acceleration = + e.pressure_acceleration[i] + e.viscous_acceleration[i] - c.water.gravity; + kick_drift_remainder += c.mass[i] + * actual_dt.powi(2) + * (0.5 * acceleration.powi(2) + c.water.gravity * acceleration); + let eprime = c.water.pressure(c.rho[i]) / c.rho[i].powi(2); + density_kick_remainder += + c.mass[i] * eprime * actual_dt * (kicked.density_rate[i] - e.density_rate[i]); + eos_chain_remainder += c.mass[i] + * (c.water.energy(next.rho[i]) + - c.water.energy(c.rho[i]) + - eprime * (next.rho[i] - c.rho[i])); + } + pressure_work += actual_dt * e.pressure_work_defect; + viscous_work += actual_dt * e.viscous_power; + momentum_defect += actual_dt * pair_defect; + c = next; + time += actual_dt; + steps += 1; + max_speed = max_speed.max(speed); + } + let density_error = + (c.y.iter() + .enumerate() + .map(|(i, y)| { + let exact = c.water.equilibrium((c.height - y).max(0.0)).unwrap().0; + ((c.rho[i] - exact) / exact).powi(2) + }) + .sum::() + / n as f64) + .sqrt(); + let pressure_error = + (c.y.iter() + .enumerate() + .map(|(i, y)| { + let exact = c.water.equilibrium((c.height - y).max(0.0)).unwrap().1; + (c.water.pressure(c.rho[i]) - exact).powi(2) + }) + .sum::() + / n as f64) + .sqrt() + / (c.water.rho0 * c.water.gravity * c.height); + let energy_change = c.energy() - initial_energy; + let mass: f64 = c.mass.iter().sum(); + // Closure now compares independently evaluated finite-step terms. + let remainder = energy_change + - pressure_work + - viscous_work + - kick_drift_remainder + - density_kick_remainder + - eos_chain_remainder; + writeln!( + summary, + "{},{},{},{},{:.17e},{},{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{}", + method.name(), + n, + ratio, + perturbed, + dt, + status, + steps, + time, + defect, + max_speed, + density_error, + pressure_error, + (mass - mass0) / mass0, + energy_change, + pressure_work, + viscous_work, + remainder, + kick_drift_remainder, + density_kick_remainder, + eos_chain_remainder, + momentum_defect, + max_neighbors + )?; + writeln!( + raw, + "state,index,time_s,y_m,velocity_m_s,rho_kg_m3,pressure_pa,mass_kg_m2" + )?; + for (label, state, t) in [ + ("initial", &initial_state, 0.0), + ("last-accepted", &c, time), + ] { + for i in 0..n { + writeln!( + raw, + "{},{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + label, + i, + t, + state.y[i], + state.velocity[i], + state.rho[i], + state.water.pressure(state.rho[i]), + state.mass[i] + )?; + } + } + if let Some(state) = rejected_state { + for i in 0..n { + writeln!( + raw, + "refused-candidate,{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + i, + time + dt.min(0.1 - time), + state.y[i], + state.velocity[i], + state.rho[i], + state.water.pressure(state.rho[i]), + state.mass[i] + )?; + } + } + Ok(()) +} + +#[derive(Clone, Copy)] +pub enum ShearKind { + Couette, + Poiseuille, + Slip, +} +pub fn shear( + method: Method, + n: usize, + ratio: f64, + dt: f64, + kind: ShearKind, + summary: &mut impl Write, + raw: &mut impl Write, +) -> std::io::Result<()> { + let mut c = Column::channel(n, ratio); + let nu = c.water.mu / c.water.rho0; + let couette = matches!(kind, ShearKind::Couette); + let slip = matches!(kind, ShearKind::Slip); + let upper = if couette { 0.001 } else { 0.0 }; + let body = if matches!(kind, ShearKind::Poiseuille) { + 0.01 + } else { + 0.0 + }; + let exact: Vec<_> = + c.y.iter() + .map(|y| { + if slip { + 0.001 + } else if couette { + upper * y / c.height + } else { + body * y * (c.height - y) / (2.0 * nu) + } + }) + .collect(); + // Assemble from the same native evaluation that advances the profile, + // including nonlocal extrapolated dummy velocities and wall slope law. + let mut a = vec![vec![0.0; n]; n]; + for j in 0..n { + c.velocity.fill(0.0); + c.velocity[j] = 1.0; + let e = c.evaluate(method, true, 0.0, slip); + for (i, row) in a.iter_mut().enumerate() { + row[j] = e.viscous_acceleration[i]; + } + } + c.velocity.fill(0.0); + let source = c.evaluate(method, true, upper, slip).viscous_acceleration; + // Uniform channel masses make the Euclidean norm exactly proportional + // to kinetic energy. Slip has a constant null mode, so use its directly + // derived nonnegative row/Markov bound only for this constant invariant. + let bound = if slip { + Some( + 1.0 / a + .iter() + .enumerate() + .map(|(i, row)| -row[i]) + .fold(0.0_f64, f64::max), + ) + } else { + matrix::contraction_limit(&a) + }; + let mut status = "complete"; + let mut time = 0.0_f64; + let mut actual_dt = 0.0_f64; + let mut steps = 0; + let mut final_dt = 0.0; + let mut lower_impulse = 0.0; + let mut upper_impulse = 0.0; + let mut source_impulse = 0.0; + let mut wall_work = 0.0; + let mut viscous_fluid_work = 0.0; + let mut max_momentum_defect = 0.0_f64; + let mut temporal_energy = 0.0; + let mass: f64 = c.mass.iter().sum(); + c.velocity = exact.clone(); + if let Some(limit) = bound { + actual_dt = dt.min(0.9 * limit); + while time < 0.1 { + let step = actual_dt.min(0.1 - time); + let e = c.evaluate(method, true, upper, slip); + let acceleration = matrix::multiply(&a, &c.velocity); + let momentum_rate: f64 = c + .mass + .iter() + .zip(&acceleration) + .enumerate() + .map(|(i, (m, a))| m * (a + source[i])) + .sum(); + let pair_defect = momentum_rate + e.wall_viscous_force; + max_momentum_defect = max_momentum_defect.max(pair_defect.abs()); + lower_impulse += step * e.lower_viscous_force; + upper_impulse += step * e.upper_viscous_force; + source_impulse += step * body * mass; + wall_work -= step * e.upper_viscous_force * upper; + viscous_fluid_work += step * e.viscous_power; + for i in 0..n { + let acc = acceleration[i] + source[i] + body; + temporal_energy += 0.5 * c.mass[i] * (step * acc).powi(2); + c.velocity[i] += step * acc; + } + final_dt = step; + time += step; + steps += 1; + } + } else { + status = "viscous-contraction-refused"; + } + let numerator: f64 = c + .velocity + .iter() + .zip(&exact) + .map(|(u, e)| (u - e).powi(2)) + .sum(); + let denominator: f64 = exact.iter().map(|v| v * v).sum(); + let error = (numerator / denominator).sqrt(); + let e = c.evaluate(method, true, upper, slip); + let exact_lower = if couette { + c.water.mu * upper / c.height + } else { + c.water.rho0 * body * c.height / 2.0 + }; + let exact_upper = if couette { -exact_lower } else { exact_lower }; + let traction_error = if slip { + e.lower_viscous_force.abs().max(e.upper_viscous_force.abs()) + / (c.water.mu * 0.001 / c.height) + } else { + ((e.lower_viscous_force - exact_lower) + .abs() + .max((e.upper_viscous_force - exact_upper).abs())) + / exact_lower.abs() + }; + let momentum_change: f64 = c + .mass + .iter() + .zip(c.velocity.iter().zip(&exact)) + .map(|(m, (u, e))| m * (u - e)) + .sum(); + let momentum_ledger = momentum_change - source_impulse + lower_impulse + upper_impulse; + writeln!( + summary, + "{},{},{},{},{:.17e},{},{},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e},{:.17e}", + method.name(), + if slip { + "free-slip-constant" + } else if couette { + "couette" + } else { + "poiseuille" + }, + n, + ratio, + dt, + status, + steps, + actual_dt, + bound.unwrap_or(0.0), + error, + traction_error, + momentum_ledger, + max_momentum_defect, + wall_work, + viscous_fluid_work, + viscous_fluid_work - wall_work, + temporal_energy, + e.lower_viscous_force, + e.upper_viscous_force, + time, + final_dt + )?; + writeln!(raw, "index,y_m,velocity_x_m_s,exact_velocity_x_m_s")?; + for (i, expected) in exact.iter().enumerate() { + writeln!( + raw, + "{},{:.17e},{:.17e},{:.17e}", + i, c.y[i], c.velocity[i], expected + )?; + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn free_slip_fixture_advances_a_nonzero_invariant_and_measures_traction() { + for method in [Method::Dummy, Method::Gamma] { + let mut summary = Vec::new(); + let mut raw = Vec::new(); + shear( + method, + 16, + 1.5, + 1e-4, + ShearKind::Slip, + &mut summary, + &mut raw, + ) + .unwrap(); + let summary = String::from_utf8(summary).unwrap(); + let fields: Vec<_> = summary.trim().split(',').collect(); + assert_eq!(fields.len(), 21); + assert_eq!(fields[5], "complete"); + assert!(fields[9].parse::().unwrap() < 1e-12); + assert_eq!(fields[10].parse::().unwrap(), 0.0); + assert_eq!(fields[19].parse::().unwrap(), 0.1); + for line in String::from_utf8(raw).unwrap().lines().skip(1) { + let fields: Vec = line.split(',').map(|v| v.parse().unwrap()).collect(); + assert_eq!(fields[3], 0.001); + assert!((fields[2] - 0.001).abs() < 1e-15); + } + } + } +} diff --git a/examples/particle_planar_selection/isolation.rs b/examples/particle_planar_selection/isolation.rs new file mode 100644 index 00000000..9cfda8f7 --- /dev/null +++ b/examples/particle_planar_selection/isolation.rs @@ -0,0 +1,153 @@ +//! Infinite planar volumetric slab screen, deliberately no imported mesh claim. +use super::kernel::Kernel; +#[derive(Clone, Copy, Debug)] +pub struct Slab { + normal: [f64; 3], + lower: f64, + upper: f64, +} +pub fn run(output: &mut impl std::io::Write) -> std::io::Result<()> { + writeln!( + output, + "angle_deg,thickness_over_spacing,volumetric_support,unmasked_density_kernel,masked_density_kernel,masked_pressure_gradient,masked_viscous_kernel" + )?; + let spacing = 0.025; + let k = Kernel { + radius: 4.0 * spacing, + }; + for angle in [0.0_f64, 17.0, 31.0] { + let theta = angle.to_radians(); + let normal = [theta.cos(), theta.sin(), 0.0]; + for cells in [8.1, 4.0, 2.0, 1.0, 0.5, 0.0] { + let thickness = cells * spacing; + let slab = Slab::new(normal, -thickness / 2.0, thickness / 2.0).unwrap(); + let offset = thickness / 2.0 + 0.01 * k.radius; + let a = normal.map(|v| -offset * v); + let b = normal.map(|v| offset * v); + let values = slab.pair(a, b, k); + writeln!( + output, + "{},{},{},{:.17e},{:.17e},{:.17e},{:.17e}", + angle, + cells, + if slab.admit_volumetric_support(k.radius).is_ok() { + "supported-screen" + } else { + "refused" + }, + k.volume(2.0 * offset), + values[0], + values[1], + values[2] + )?; + } + } + Ok(()) +} +#[derive(Debug, PartialEq)] +pub enum SlabError { + InvalidGeometry, + UnresolvedSupport, +} +impl Slab { + pub fn new(normal: [f64; 3], lower: f64, upper: f64) -> Result { + let norm = normal.iter().map(|v| v * v).sum::().sqrt(); + if normal.iter().any(|v| !v.is_finite()) + || !lower.is_finite() + || !upper.is_finite() + || upper < lower + || (norm - 1.0).abs() > 1e-12 + { + return Err(SlabError::InvalidGeometry); + } + Ok(Self { + normal, + lower, + upper, + }) + } + pub fn admit_volumetric_support(self, radius: f64) -> Result { + if !radius.is_finite() || radius <= 0.0 { + return Err(SlabError::InvalidGeometry); + } + if self.upper - self.lower < 2.0 * radius { + return Err(SlabError::UnresolvedSupport); + } + Ok(self) + } + fn side(self, p: [f64; 3]) -> i8 { + let d: f64 = self.normal.iter().zip(p).map(|(n, p)| n * p).sum(); + if d < self.lower { + -1 + } else if d > self.upper { + 1 + } else { + 0 + } + } + pub fn visible(self, a: [f64; 3], b: [f64; 3]) -> bool { + let side = self.side(a); + side != 0 && side == self.side(b) + } + /// All three native contributions share the same side/segment gate. + pub fn pair(self, a: [f64; 3], b: [f64; 3], k: Kernel) -> [f64; 3] { + if !self.visible(a, b) { + return [0.0; 3]; + } + let r2: f64 = a.iter().zip(b).map(|(a, b)| (a - b).powi(2)).sum(); + let r = r2.sqrt(); + [k.volume(r), k.phi(r) * r, k.phi(r)] + } +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn rotated_slab_oracle_covers_all_three_interactions_and_refusals() { + for degrees in [0.0_f64, 17.0, 31.0] { + let theta = degrees.to_radians(); + let normal = [theta.cos(), theta.sin(), 0.0]; + let k = Kernel { radius: 0.2 }; + let slab = Slab::new(normal, -0.25, 0.25) + .unwrap() + .admit_volumetric_support(k.radius) + .unwrap(); + // Independent local-coordinate construction/inverse rotation. + for x in [-0.7, -0.26, 0.0, 0.26, 0.7] { + for y in [-0.7, -0.26, 0.0, 0.26, 0.7] { + let a = [theta.cos() * x, theta.sin() * x, 0.01]; + let b = [theta.cos() * y, theta.sin() * y, -0.01]; + let crosses = if x.min(y) <= 0.25 && x.max(y) >= -0.25 { + // Infinite slab intersects the full segment interval. + true + } else { + false + }; + assert_eq!(slab.visible(a, b), !crosses); + if crosses { + assert_eq!(slab.pair(a, b, k), [0.0; 3]); + } + } + } + let thin = Slab::new(normal, -0.01, 0.01).unwrap(); + let a = normal.map(|v| v * -0.02); + let b = normal.map(|v| v * 0.02); + assert!(k.volume(0.04) > 0.0 && k.phi(0.04) > 0.0); + assert_eq!(thin.pair(a, b, k), [0.0; 3]); + assert_eq!( + Slab::new(normal, -0.1, 0.1) + .unwrap() + .admit_volumetric_support(k.radius) + .unwrap_err(), + SlabError::UnresolvedSupport + ); + assert_eq!( + Slab::new(normal, 0.0, 0.0) + .unwrap() + .admit_volumetric_support(k.radius) + .unwrap_err(), + SlabError::UnresolvedSupport + ); + } + } +} diff --git a/examples/particle_planar_selection/kernel.rs b/examples/particle_planar_selection/kernel.rs new file mode 100644 index 00000000..7f633b2a --- /dev/null +++ b/examples/particle_planar_selection/kernel.rs @@ -0,0 +1,87 @@ +//! 3D Wendland C2, support R=2h; exact integration over tangential planes. +use std::f64::consts::PI; +#[derive(Clone, Copy)] +pub struct Kernel { + pub radius: f64, +} +impl Kernel { + pub fn volume(self, r: f64) -> f64 { + let q = r / self.radius; + if q >= 1.0 { + return 0.0; + } + 21.0 / (2.0 * PI * self.radius.powi(3)) * (1.0 - q).powi(4) * (1.0 + 4.0 * q) + } + /// -W'(r)/r in 3D, continuous at r=0. + pub fn phi(self, r: f64) -> f64 { + let q = r / self.radius; + if q >= 1.0 { + return 0.0; + } + 210.0 / (PI * self.radius.powi(5)) * (1.0 - q).powi(3) + } + pub fn line(self, s: f64) -> f64 { + let q = s.abs() / self.radius; + if q >= 1.0 { + return 0.0; + } + // Factorization avoids cancellation near the support endpoint. + 3.0 / (2.0 * self.radius) * (1.0 - q).powi(5) * (1.0 + 5.0 * q + 8.0 * q * q) + } + pub fn line_gradient(self, s: f64) -> f64 { + -s * self.line_phi(s) + } + pub fn line_phi(self, s: f64) -> f64 { + let q = s.abs() / self.radius; + if q >= 1.0 { + return 0.0; + } + 21.0 / self.radius.powi(3) * (1.0 - q).powi(4) * (1.0 + 4.0 * q) + } + pub fn cdf(self, s: f64) -> f64 { + let q = s.abs() / self.radius; + if q >= 1.0 { + return if s > 0.0 { 1.0 } else { 0.0 }; + } + let v = 21.0 + * (q / 14.0 - q.powi(3) / 6.0 + q.powi(5) / 2.0 - 2.0 * q.powi(6) / 3.0 + + 5.0 * q.powi(7) / 14.0 + - q.powi(8) / 14.0); + 0.5 + s.signum() * v + } + pub fn gamma(self, y: f64, height: f64, top_wall: bool) -> (f64, f64) { + let gamma = self.cdf(y) - if top_wall { self.cdf(y - height) } else { 0.0 }; + let gradient = self.line(y) - if top_wall { self.line(y - height) } else { 0.0 }; + (gamma, gradient) + } +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn independent_integrals_and_gradient() { + let k = Kernel { radius: 0.3 }; + let n = 100000; + let dx = 2.0 * k.radius / n as f64; + let mass: f64 = (0..n) + .map(|i| k.line(-k.radius + (i as f64 + 0.5) * dx) * dx) + .sum(); + assert!((mass - 1.0).abs() < 1e-12); + let ds = 1e-6; + for s in [0.0, 0.04, 0.15, 0.29] { + let derivative = (k.line(s + ds) - k.line(s - ds)) / (2.0 * ds); + assert!((derivative - k.line_gradient(s)).abs() < 2e-8); + let derivative = (k.cdf(s + ds) - k.cdf(s - ds)) / (2.0 * ds); + assert!((derivative - k.line(s)).abs() < 2e-8); + // Independent radial annulus integration of the 3D source kernel. + let dr = (k.radius - s) / n as f64; + let integral: f64 = (0..n) + .map(|i| { + let r = s + (i as f64 + 0.5) * dr; + 2.0 * PI * r * k.volume(r) * dr + }) + .sum(); + assert!((integral - k.line(s)).abs() < 1e-9); + } + } +} diff --git a/examples/particle_planar_selection/matrix.rs b/examples/particle_planar_selection/matrix.rs new file mode 100644 index 00000000..3ec520de --- /dev/null +++ b/examples/particle_planar_selection/matrix.rs @@ -0,0 +1,82 @@ +//! Native constant-density viscous explicit-update contraction screen. +//! This is a floating-point matrix calculation, not an interval proof. +pub fn multiply(a: &[Vec], x: &[f64]) -> Vec { + a.iter() + .map(|row| row.iter().zip(x).map(|(a, x)| a * x).sum()) + .collect() +} +fn positive_definite(mut a: Vec>) -> bool { + let n = a.len(); + for i in 0..n { + for j in 0..=i { + let s = a[i][j] - (0..j).map(|k| a[i][k] * a[j][k]).sum::(); + if i == j { + if !s.is_finite() || s <= 0.0 { + return false; + } + a[i][j] = s.sqrt(); + } else { + a[i][j] = s / a[j][j]; + } + } + } + true +} +pub fn contraction_limit(a: &[Vec]) -> Option { + let n = a.len(); + let square: Vec> = (0..n) + .map(|i| { + (0..n) + .map(|j| (0..n).map(|k| a[k][i] * a[k][j]).sum()) + .collect() + }) + .collect(); + let admissible = |dt: f64| { + positive_definite( + (0..n) + .map(|i| { + (0..n) + .map(|j| -a[i][j] - a[j][i] - dt * square[i][j]) + .collect() + }) + .collect(), + ) + }; + if !admissible(0.0) { + return None; + } + let mut hi = 1.0; + while admissible(hi) { + hi *= 2.0; + if !hi.is_finite() { + return None; + } + } + let mut lo = 0.0; + for _ in 0..50 { + let mid = 0.5 * (lo + hi); + if admissible(mid) { + lo = mid; + } else { + hi = mid; + } + } + Some(lo) +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn explicit_bound_comes_from_actual_operator() { + let a = vec![vec![-2.0, 1.0], vec![1.0, -2.0]]; + assert!((contraction_limit(&a).unwrap() - 2.0 / 3.0).abs() < 1e-13); + assert!(contraction_limit(&[vec![0.0, 1.0], vec![-1.0, 0.0]]).is_none()); + assert!(contraction_limit(&[vec![1.0, 0.0], vec![0.0, -1.0]]).is_none()); + let x = [0.3, -0.7]; + let y = multiply(&a, &x); + let dt = 0.9 * contraction_limit(&a).unwrap(); + let old: f64 = x.iter().map(|v| v * v).sum(); + let new: f64 = x.iter().zip(y).map(|(x, y)| (x + dt * y).powi(2)).sum(); + assert!(new < old); + } +} diff --git a/examples/particle_planar_selection/planar.rs b/examples/particle_planar_selection/planar.rs new file mode 100644 index 00000000..38a7f70e --- /dev/null +++ b/examples/particle_planar_selection/planar.rs @@ -0,0 +1,341 @@ +//! Necessary wall-normal selection screen, not an admitted production solver. +//! Parcels have mass per tangential area (kg/m²), volume per area (m). +//! Integrating the 3D equal tangential cell area A cancels A from AHA's +//! (V_i²+V_j²)/m_i and the tangential quadrature 1/A, yielding this 1D form. +use super::eos::{WATER, Water}; +use super::kernel::Kernel; +#[derive(Clone, Copy, Debug)] +pub enum Method { + Dummy, + Gamma, +} +impl Method { + pub fn name(self) -> &'static str { + match self { + Self::Dummy => "aha2012-linear-wendland-planar-screen-v1", + Self::Gamma => "mayrhofer2013-k0-si-mu-planar-screen-v1", + } + } +} +#[derive(Clone)] +pub struct Column { + pub y: Vec, + pub rho: Vec, + pub mass: Vec, + pub velocity: Vec, + pub height: f64, + pub dx: f64, + pub kernel: Kernel, + pub water: Water, + pub top_wall: bool, +} +pub struct Evaluation { + pub pressure_acceleration: Vec, + pub viscous_acceleration: Vec, + pub density_rate: Vec, + pub wall_pressure_force: f64, + pub wall_viscous_force: f64, + pub lower_viscous_force: f64, + pub upper_viscous_force: f64, + pub pressure_work_defect: f64, + pub viscous_power: f64, + pub max_neighbors: usize, +} +impl Column { + pub fn hydrostatic(n: usize, ratio: f64, perturbed: bool) -> Self { + let dx = 1.0 / n as f64; + let mut y: Vec<_> = (0..n).map(|i| (i as f64 + 0.5) * dx).collect(); + if perturbed { + for (i, p) in y.iter_mut().enumerate() { + *p += 0.1 * dx * super::noise(i as u64, 11); + } + } + let rho = y + .iter() + .map(|y| WATER.equilibrium(1.0 - y).unwrap().0) + .collect(); + let mass = (0..n) + .map(|i| WATER.column_mass(i as f64 * dx, (i + 1) as f64 * dx, 1.0)) + .collect(); + Self { + y, + rho, + mass, + velocity: vec![0.0; n], + height: 1.0, + dx, + kernel: Kernel { + radius: 2.0 * ratio * dx, + }, + water: WATER, + top_wall: false, + } + } + pub fn channel(n: usize, ratio: f64) -> Self { + let height = 0.001; + let dx = height / n as f64; + let water = Water { + gravity: 0.0, + ..WATER + }; + Self { + y: (0..n).map(|i| (i as f64 + 0.5) * dx).collect(), + rho: vec![water.rho0; n], + mass: vec![water.rho0 * dx; n], + velocity: vec![0.0; n], + height, + dx, + kernel: Kernel { + radius: 2.0 * ratio * dx, + }, + water, + top_wall: true, + } + } + pub fn energy(&self) -> f64 { + self.y + .iter() + .enumerate() + .map(|(i, y)| { + self.mass[i] + * (0.5 * self.velocity[i].powi(2) + + self.water.gravity * y + + self.water.energy(self.rho[i])) + }) + .sum() + } + pub fn evaluate( + &self, + method: Method, + tangent: bool, + upper_speed: f64, + slip: bool, + ) -> Evaluation { + let n = self.y.len(); + let mut result = Evaluation { + pressure_acceleration: vec![0.0; n], + viscous_acceleration: vec![0.0; n], + density_rate: vec![0.0; n], + wall_pressure_force: 0.0, + wall_viscous_force: 0.0, + lower_viscous_force: 0.0, + upper_viscous_force: 0.0, + pressure_work_defect: 0.0, + viscous_power: 0.0, + max_neighbors: 0, + }; + let pressure: Vec<_> = self.rho.iter().map(|r| self.water.pressure(*r)).collect(); + let volume: Vec<_> = self + .rho + .iter() + .enumerate() + .map(|(i, r)| self.mass[i] / r) + .collect(); + let k = self.kernel; + // Fixed wall quadrature and prescribed wall velocity in continuity. + // Ghost velocity is exclusively the viscous extrapolation, never a + // fictitious moving boundary in density evolution or wall-work ledgers. + let mut ghosts = Vec::new(); + if matches!(method, Method::Dummy) { + let layers = (k.radius / self.dx).ceil() as usize; + for top in [false, true] { + if top && !self.top_wall { + continue; + } + let uw = if top { upper_speed } else { 0.0 }; + for layer in 0..layers { + let yb = if top { + self.height + (layer as f64 + 0.5) * self.dx + } else { + -(layer as f64 + 0.5) * self.dx + }; + let mut weight = 0.0; + let mut pb = 0.0; + let mut ub = 0.0; + for (j, fluid_pressure) in pressure.iter().enumerate() { + let w = k.line(yb - self.y[j]); + weight += w; + pb += w + * (fluid_pressure + - self.water.gravity * self.rho[j] * (yb - self.y[j])); + ub += w * self.velocity[j]; + } + if weight > 0.0 { + pb /= weight; + let rhob = self.water.rho0 + pb / self.water.sound_speed.powi(2); + ghosts.push((yb, pb, rhob, 2.0 * uw - ub / weight, top)); + } + } + } + } + let mut surfaces = Vec::new(); + if matches!(method, Method::Gamma) { + for top in [false, true] { + if top && !self.top_wall { + continue; + } + let yb = if top { self.height } else { 0.0 }; + let mut weight = 0.0; + let mut pb = 0.0; + for j in 0..n { + let w = volume[j] * k.line(yb - self.y[j]); + weight += w; + pb += w * (pressure[j] - self.water.gravity * self.rho[j] * (yb - self.y[j])); + } + if weight > 0.0 { + surfaces.push((yb, pb / weight, top)); + } + } + } + for i in 0..n { + let (gamma, gamma_prime) = k.gamma(self.y[i], self.height, self.top_wall); + let mut neighbors = 0; + for j in 0..n { + if i == j { + continue; + } + let s = self.y[i] - self.y[j]; + if s.abs() >= k.radius { + continue; + } + neighbors += 1; + let grad = k.line_gradient(s); + let du = self.velocity[i] - self.velocity[j]; + match method { + Method::Dummy => { + let v2 = volume[i].powi(2) + volume[j].powi(2); + let pbar = (self.rho[j] * pressure[i] + self.rho[i] * pressure[j]) + / (self.rho[i] + self.rho[j]); + result.pressure_acceleration[i] -= v2 * pbar * grad / self.mass[i]; + result.viscous_acceleration[i] -= + self.water.mu * v2 / self.mass[i] * k.line_phi(s) * du; + if !tangent { + result.density_rate[i] += self.rho[i] * volume[j] * du * grad; + } + } + Method::Gamma => { + result.pressure_acceleration[i] -= + volume[j] * (pressure[i] + pressure[j]) * grad / (self.rho[i] * gamma); + result.viscous_acceleration[i] -= 2.0 * self.water.mu * volume[j] + / (self.rho[i] * gamma) + * k.line_phi(s) + * du; + if !tangent { + result.density_rate[i] += self.rho[i] / gamma * volume[j] * du * grad; + } + } + } + } + result.max_neighbors = result.max_neighbors.max(neighbors); + match method { + Method::Dummy => { + for &(yb, pb, rhob, ghost_velocity, top) in &ghosts { + let s = self.y[i] - yb; + if s.abs() >= k.radius { + continue; + } + let v2 = volume[i].powi(2) + self.dx.powi(2); + let pbar = (rhob * pressure[i] + self.rho[i] * pb) / (self.rho[i] + rhob); + let ap = -v2 * pbar * k.line_gradient(s) / self.mass[i]; + result.pressure_acceleration[i] += ap; + result.wall_pressure_force -= self.mass[i] * ap; + if !tangent { + result.density_rate[i] += + self.rho[i] * self.dx * self.velocity[i] * k.line_gradient(s); + } + if !slip { + let av = -self.water.mu * v2 / self.mass[i] + * k.line_phi(s) + * (self.velocity[i] - ghost_velocity); + result.viscous_acceleration[i] += av; + let reaction = -self.mass[i] * av; + result.wall_viscous_force += reaction; + if top { + result.upper_viscous_force += reaction; + } else { + result.lower_viscous_force += reaction; + } + } + } + } + Method::Gamma => { + if !tangent { + result.density_rate[i] -= + self.rho[i] / gamma * self.velocity[i] * gamma_prime; + } + for &(yb, pb, top) in &surfaces { + let inward = if top { -1.0 } else { 1.0 }; + let surface_gradient = inward * k.line(self.y[i] - yb); + let ap = (pressure[i] + pb) * surface_gradient / (self.rho[i] * gamma); + result.pressure_acceleration[i] += ap; + result.wall_pressure_force -= self.mass[i] * ap; + if !slip { + // Native near-wall linear wall law, eq20 adaptation; + // no exact analytic profile derivative is supplied. + let uw = if top { upper_speed } else { 0.0 }; + let av = -2.0 * self.water.mu / (self.rho[i] * gamma) + * (self.velocity[i] - uw) + / (self.y[i] - yb).abs() + * k.line(self.y[i] - yb); + result.viscous_acceleration[i] += av; + let reaction = -self.mass[i] * av; + result.wall_viscous_force += reaction; + if top { + result.upper_viscous_force += reaction; + } else { + result.lower_viscous_force += reaction; + } + } + } + } + } + if !tangent { + result.pressure_work_defect += self.mass[i] + * (self.velocity[i] * result.pressure_acceleration[i] + + pressure[i] / self.rho[i].powi(2) * result.density_rate[i]); + } + result.viscous_power += + self.mass[i] * self.velocity[i] * result.viscous_acceleration[i]; + } + result + } +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn closed_pressure_pairs_have_opposite_forces_but_work_is_measured() { + for method in [Method::Dummy, Method::Gamma] { + let mut c = Column::hydrostatic(32, 2.0, true); + for (i, v) in c.velocity.iter_mut().enumerate() { + *v = 0.01 * (std::f64::consts::PI * c.y[i]).sin(); + } + let e = c.evaluate(method, false, 0.0, false); + let fluid_force: f64 = c + .mass + .iter() + .zip(&e.pressure_acceleration) + .map(|(m, a)| m * a) + .sum(); + // Gamma normalization can break pair cancellation; expose, not erase. + assert!(e.pressure_work_defect.is_finite()); + if matches!(method, Method::Dummy) { + assert!((fluid_force + e.wall_pressure_force).abs() < 1e-10); + } + assert!(e.pressure_work_defect.abs() > 1e-7); + } + } + #[test] + fn slip_and_no_slip_have_distinct_wall_tractions() { + for method in [Method::Dummy, Method::Gamma] { + let mut c = Column::channel(32, 2.0); + c.velocity.fill(0.001); + let slip = c.evaluate(method, true, 0.0, true); + let no_slip = c.evaluate(method, true, 0.0, false); + assert_eq!(slip.wall_viscous_force, 0.0); + assert!(slip.viscous_acceleration.iter().all(|a| *a == 0.0)); + assert!(no_slip.wall_viscous_force > 0.0); + assert!(no_slip.viscous_power < 0.0); + } + } +} diff --git a/src/bin/desktop/ai_comparison/configured_track.rs b/src/bin/desktop/ai_comparison/configured_track.rs index f3d026c7..70f66998 100644 --- a/src/bin/desktop/ai_comparison/configured_track.rs +++ b/src/bin/desktop/ai_comparison/configured_track.rs @@ -64,6 +64,8 @@ pub(crate) struct ConfiguredTrack { provider: Option, failure: Option, runtime_observation: Option, + attempt_id: u64, + workflow: Option>, } impl ConfiguredTrack { /// Validate exact executor custody before allocating state. No filesystem @@ -134,6 +136,8 @@ impl ConfiguredTrack { provider: None, failure: None, runtime_observation: None, + attempt_id: 0, + workflow: None, }) } @@ -213,6 +217,8 @@ impl ConfiguredTrack { ) -> Result { self.failure = None; self.runtime_observation = None; + // A pre-execution refusal must never reuse the previous attempt. + self.workflow = None; if let Some(provider) = &mut self.provider { provider.begin_interval_observation(); } @@ -245,9 +251,15 @@ impl ConfiguredTrack { dynamic_viscosity_pa_s, } => self.viscosity.as_mut().map(|w| (w, dynamic_viscosity_pa_s)), }; + self.attempt_id = self + .attempt_id + .checked_add(1) + .ok_or(SessionError::PressureBinding( + ProviderRejection::Unsupported("Workflow attempt identity exhausted"), + ))?; let result = self .session - .step_with_configured_pressure( + .step_with_configured_pressure_observed( LiquidStepInputs { requested_dt: self.frozen.future.requested_dt_s, smoke_source: None, @@ -261,6 +273,8 @@ impl ConfiguredTrack { preferred, deadline, |_| self.cancelled.load(Ordering::Relaxed), + self.attempt_id, + &mut self.workflow, ) .map(|(report, _)| report); self.runtime_observation = self @@ -303,6 +317,9 @@ impl ConfiguredTrack { ) -> Option<&rheon::recording::provider::runtime::RuntimeObservation> { self.runtime_observation.as_ref() } + pub(crate) fn workflow_attempt(&self) -> Option<&Arc> { + self.workflow.as_ref() + } #[cfg(test)] pub(crate) fn runtime_ready(&self) -> bool { self.provider.is_some() diff --git a/src/bin/desktop/ai_comparison/cpu_contract_tests.rs b/src/bin/desktop/ai_comparison/cpu_contract_tests.rs index 83bc5fe9..a619fbb3 100644 --- a/src/bin/desktop/ai_comparison/cpu_contract_tests.rs +++ b/src/bin/desktop/ai_comparison/cpu_contract_tests.rs @@ -11,7 +11,10 @@ use sha2::{Digest, Sha256}; use std::{ path::PathBuf, process::Command, - sync::{Arc, Mutex, atomic::AtomicBool}, + sync::{ + Arc, Mutex, + atomic::{AtomicBool, AtomicU64, Ordering}, + }, time::{Duration, SystemTime, UNIX_EPOCH}, }; @@ -35,6 +38,42 @@ pub(crate) fn assert_child_liveness(pid: u32, expected_alive: bool) { ); } +// Wall-clock timestamps can repeat on coarse clocks and concurrent test threads. +// Atomic directory creation owns the path; a stale or competing path is skipped. +fn fixture_directory(timestamp: u128) -> PathBuf { + static NEXT: AtomicU64 = AtomicU64::new(0); + loop { + let sequence = NEXT.fetch_add(1, Ordering::Relaxed); + let root = std::env::temp_dir().join(format!( + "rheon-cpu-contract-{}-{timestamp}-{sequence}", + std::process::id(), + )); + match std::fs::create_dir(&root) { + Ok(()) => return root, + Err(error) if error.kind() == std::io::ErrorKind::AlreadyExists => continue, + Err(error) => panic!("create fixture directory {}: {error}", root.display()), + } + } +} + +#[test] +fn fixture_directories_are_distinct_with_same_timestamp() { + let roots: Vec<_> = std::thread::scope(|scope| { + let threads: Vec<_> = (0..32) + .map(|_| scope.spawn(|| fixture_directory(0))) + .collect(); + threads + .into_iter() + .map(|thread| thread.join().unwrap()) + .collect() + }); + let unique: std::collections::HashSet<_> = roots.iter().collect(); + assert_eq!(unique.len(), roots.len()); + for root in roots { + std::fs::remove_dir(root).unwrap(); + } +} + pub(crate) struct Fixture { pub root: PathBuf, pub manifest: PathBuf, @@ -51,15 +90,12 @@ impl Fixture { ) } pub fn source(source: &str, correction: bool) -> Self { - let root = std::env::temp_dir().join(format!( - "rheon-cpu-contract-{}-{}", - std::process::id(), + let root = fixture_directory( SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() - .as_nanos() - )); - std::fs::create_dir(&root).unwrap(); + .as_nanos(), + ); let output = Command::new(std::env::var_os("RHEON_TEST_PYTHON").unwrap_or_else(|| "python3".into())) .args(["-I", "-S", "-c", "import sys; print(sys.executable)"]) diff --git a/src/bin/desktop/comparison.rs b/src/bin/desktop/comparison.rs index a752ed0b..08cdc029 100644 --- a/src/bin/desktop/comparison.rs +++ b/src/bin/desktop/comparison.rs @@ -77,6 +77,46 @@ pub struct SelectedNativePair<'a> { pub pair: &'a PairComparison, } +#[derive(Clone, PartialEq)] +pub struct WorkflowComparisonKey { + root: PathBuf, + run_set: [u8; 32], + recipe_sha256: [u8; 32], + analysis_version: u32, + reference_member: String, + candidate_member: String, + recipe: Recipe, + pair: PairComparison, + pub side: super::comparison_archive::Side, +} +impl WorkflowComparisonKey { + fn new( + selected: &SelectedNativePair<'_>, + side: super::comparison_archive::Side, + ) -> Result { + Ok(Self { + root: selected.root.into(), + run_set: selected.recipe.run_set_sha256, + recipe_sha256: selected + .recipe + .sha256() + .map_err(|error| SelectedFieldsError::Source(error.to_string()))?, + analysis_version: selected.recipe.analysis_version, + reference_member: selected.recipe.reference.member_id.clone(), + candidate_member: selected.recipe.candidate.member_id.clone(), + recipe: selected.recipe.recipe, + pair: selected.pair.clone(), + side, + }) + } +} +pub struct SelectedWorkflow { + pub key: WorkflowComparisonKey, + pub run: rheon::recording::RecordingRun, + pub ordinal: usize, + pub attempt: Option>, +} + #[derive(Debug)] pub enum SelectedFieldsError { Source(String), @@ -189,6 +229,75 @@ impl SavedComparisonPage { pair: result.coverage().pairs.get(self.selected)?, }) } + pub fn workflow_key( + &self, + side: super::comparison_archive::Side, + ) -> Option { + self.selected_pair() + .and_then(|selected| WorkflowComparisonKey::new(&selected, side).ok()) + } + /// Explicit action, with the same pinned source and exact selection proof as + /// native field inspection. Only compact graph facts survive the load. + pub fn load_selected_workflow( + &mut self, + side: super::comparison_archive::Side, + ) -> Result, SelectedFieldsError> { + let result = (|| { + let Some(selected) = self.selected_pair() else { + return Ok(None); + }; + let (member_id, expected) = match side { + super::comparison_archive::Side::Reference => ( + &selected.recipe.reference.member_id, + &selected.pair.reference, + ), + super::comparison_archive::Side::Candidate => ( + &selected.recipe.candidate.member_id, + &selected.pair.candidate, + ), + }; + let member = selected.recipe.run_set.member(member_id).ok_or_else(|| { + SelectedFieldsError::Source("selected workflow member missing".into()) + })?; + let reader = match member.open(selected.root) { + MemberState::Ready(reader) => reader, + MemberState::Invalid(error) => { + return Err(SelectedFieldsError::Source(error.to_string())); + } + MemberState::Unsupported(reason) => { + return Err(SelectedFieldsError::Source(reason.into())); + } + _ => { + return Err(SelectedFieldsError::Source( + "exact workflow archive is unavailable or not pinned".into(), + )); + } + }; + let source = Selection::read(&reader, expected.ordinal) + .map_err(|error| SelectedFieldsError::Source(error.to_string()))?; + if source.identity() != expected { + return Err(SelectedFieldsError::Source( + "exact selected workflow publication changed".into(), + )); + } + let attempt = if source.run().solver == rheon::recording::provider::PROFILE { + rheon::recording::workflow::selection(&reader, source.publication()) + .map_err(|error| SelectedFieldsError::Source(error.to_string()))? + } else { + None + }; + Ok(Some(SelectedWorkflow { + key: WorkflowComparisonKey::new(&selected, side)?, + run: source.run().clone(), + ordinal: expected.ordinal, + attempt, + })) + })(); + if let Err(error) = &result { + self.fail(error); + } + result + } /// Explicit synchronous materialization, not a per-frame getter. An /// unverified/no-pair page returns None without source I/O. Callers may cache /// successful arrays by the exact pair identities and recipe for rendering. @@ -699,10 +808,14 @@ impl SavedComparisonPage { ui.label("No matched physical publications. No numerical metric is available."); return; } - ui.add( + let response = ui.add( egui::Slider::new(&mut self.selected, 0..=coverage.pairs.len() - 1) .text("Matched pair"), ); + #[cfg(test)] + self.controls.insert("matched-pair", response.rect); + #[cfg(not(test))] + let _ = response; let pair = &coverage.pairs[self.selected]; ui.label(format!( "Reference ordinal {}, generation {} · candidate ordinal {}, generation {}", diff --git a/src/bin/desktop/inspector.rs b/src/bin/desktop/inspector.rs index 754bfbaa..5ad67b5a 100644 --- a/src/bin/desktop/inspector.rs +++ b/src/bin/desktop/inspector.rs @@ -1,9 +1,7 @@ //! Exact selected disk publication. The worker owns recording; UI owns selection. use super::export_ui::ExportFile; use eframe::egui; -use rheon::recording::provider::{ - RecordedConfiguredSession, configured_publication_with_runtime, configured_run, -}; +use rheon::recording::provider::{RecordedConfiguredSession, configured_run}; use rheon::recording::{ RecordedCarrier, RecordedMaterial, RecordedStep, RecordingLimits, RecordingReader, StepRecorder, carrier_publication, carrier_publication_with_force_fields, carrier_run, @@ -27,6 +25,7 @@ struct State { carrier: Option>, configured: Option>, record: Option>, + workflow: Option>, field_name: String, scalar_index: usize, selected: usize, @@ -45,6 +44,7 @@ impl Default for State { carrier: None, configured: None, record: None, + workflow: None, field_name: String::new(), scalar_index: 0, selected: 0, @@ -54,6 +54,11 @@ impl Default for State { } } } +pub struct WorkflowSelection { + pub run: rheon::recording::RecordingRun, + pub step: Arc, + pub attempt: Option>, +} #[derive(Default)] pub struct Inspector(Mutex); impl Inspector { @@ -70,7 +75,7 @@ impl Inspector { "Configured constructor/header changed; accepted interval unrecorded".into(), ); } - let step = configured_publication_with_runtime( + let step = rheon::recording::workflow::configured_publication_with_workflow( snapshot, recorder.recorded_count(), recorder.limits().max_record_bytes, @@ -85,6 +90,41 @@ impl Inspector { })?; Ok(()) } + /// Immutable selected publication for the workflow view. This performs no + /// I/O and never substitutes a newer publication when selection is absent. + pub fn workflow_selection(&self) -> Result, String> { + let s = self.0.lock().map_err(|_| "Inspector owner failed")?; + if s.selected_step.is_some() && s.record.is_none() && !s.feedback.is_empty() { + return Err(s.feedback.clone()); + } + Ok(match (&s.reader, &s.record) { + (Some(reader), Some(record)) => Some(WorkflowSelection { + run: reader.run().clone(), + step: Arc::clone(record), + attempt: s.workflow.clone(), + }), + _ => None, + }) + } + pub fn workflow_identity(&self) -> Option { + self.0 + .lock() + .ok()? + .reader + .as_ref() + .map(|reader| reader.run().identity.clone()) + } + /// Explicit terminal-evidence load. Call only on a user load/refresh action, + /// then retain the immutable result for paint. + pub fn load_workflow_terminal( + &self, + ) -> Result>, String> { + let s = self.0.lock().map_err(|_| "Inspector owner failed")?; + let reader = s.reader.as_ref().ok_or("No archive selected")?; + rheon::recording::workflow::terminal(reader) + .map(|audit| audit.and_then(|audit| audit.attempt)) + .map_err(|error| error.to_string()) + } #[cfg(test)] pub fn selected_identity(&self) -> Option<(u64, u64, f64)> { let s = self.0.lock().ok()?; @@ -287,6 +327,7 @@ impl Inspector { s.material = None; s.carrier = None; s.configured = None; + s.workflow = None; s.feedback = e.clone(); } result @@ -296,10 +337,16 @@ impl Inspector { let reader = s.reader.as_ref().ok_or("No archive selected")?; let result = if reader.run().solver == rheon::recording::provider::PROFILE { match reader.status() { + Ok(status) if status.detail.starts_with("RCT2:") => { + rheon::recording::workflow::terminal(reader).map(|_| ()) + } Ok(status) if status.detail.starts_with("RCT1:") => { rheon::recording::provider::runtime::audit_runtime_termination(reader) .map(|_| ()) } + Ok(status) if status.detail.starts_with("RCT") => Err( + rheon::recording::RecordingError::Unsupported("runtime termination version"), + ), Ok(_) => { rheon::recording::provider::verify_configured_recording(reader).map(|_| ()) } @@ -314,6 +361,7 @@ impl Inspector { s.material = None; s.carrier = None; s.configured = None; + s.workflow = None; s.feedback = e.clone(); } result @@ -325,6 +373,7 @@ impl Inspector { s.material = None; s.carrier = None; s.configured = None; + s.workflow = None; s.record = None; s.path = None; s.field_name.clear(); @@ -332,6 +381,19 @@ impl Inspector { s.selected_step = None; s.reader = None; match RecordingReader::open(path, limits) { + Ok(reader) + if reader + .run() + .solver + .starts_with("rheon-native-projection-session-") + || reader + .run() + .solver + .starts_with("rheon-native-projection-selection-") => + { + s.feedback = "Native projection archives require the typed projection reader; workflow graph inspection is unavailable for this profile".into(); + Err(s.feedback.clone()) + } Ok(reader) => { s.reader = Some(reader); s.path = Some(path.to_owned()); @@ -406,6 +468,7 @@ impl Inspector { s.material = None; s.carrier = None; s.configured = None; + s.workflow = None; s.record = None; let result = s .reader @@ -436,10 +499,20 @@ impl Inspector { } else { None }; - Ok((Arc::new(record), material, carrier, configured)) + let workflow = if run.solver == rheon::recording::provider::PROFILE { + rheon::recording::workflow::selection( + s.reader.as_ref().ok_or("No archive selected")?, + &record, + ) + .map_err(|e| e.to_string())? + } else { + None + }; + Ok((Arc::new(record), material, carrier, configured, workflow)) }); match result { - Ok((record, material, carrier, configured)) => { + Ok((record, material, carrier, configured, workflow)) => { + s.workflow = workflow; s.material = material; s.carrier = carrier; s.configured = configured; @@ -500,7 +573,8 @@ impl Inspector { match reader.status() { Ok(status) => { if reader.run().solver == rheon::recording::provider::PROFILE - && status.detail.starts_with("RCT1:") + && (status.detail.starts_with("RCT1:") + || status.detail.starts_with("RCT2:")) { match rheon::recording::provider::runtime::RuntimeTermination::decode( reader.run(), @@ -516,6 +590,12 @@ impl Inspector { ui.label(error.to_string()); } } + } else if reader.run().solver == rheon::recording::provider::PROFILE + && status.detail.starts_with("RCT") + { + let error = "Unsupported runtime termination version".to_string(); + ui.label(&error); + metadata_error = Some(error); } else { ui.small(format!("{}: {}", status.outcome, status.detail)); } @@ -534,6 +614,7 @@ impl Inspector { s.material = None; s.carrier = None; s.configured = None; + s.workflow = None; s.feedback = error; } if !s.feedback.is_empty() { diff --git a/src/bin/desktop/run_sets/configured/archive.rs b/src/bin/desktop/run_sets/configured/archive.rs index 671da9c7..a512aa75 100644 --- a/src/bin/desktop/run_sets/configured/archive.rs +++ b/src/bin/desktop/run_sets/configured/archive.rs @@ -64,7 +64,7 @@ pub fn runtime_custody( verify_configured_recording(reader)?; return Ok(ConfiguredRuntimeCustody::LegacyUnavailable); }; - if version != "1" { + if version != "1" && version != "2" { return Err(RunSetError::Unsupported( "configured runtime termination version", )); @@ -74,7 +74,27 @@ pub fn runtime_custody( "configured runtime termination payload", )); } - let audit = audit_runtime_termination(reader)?; + let workflow = if version == "2" { + Some( + rheon::recording::workflow::terminal(reader)?.ok_or(RunSetError::Integrity( + "configured workflow terminal absent", + ))?, + ) + } else { + None + }; + let audit = if let Some(workflow) = &workflow { + workflow.runtime.clone() + } else { + audit_runtime_termination(reader)? + }; + if let Some(attempt) = workflow + .as_ref() + .and_then(|workflow| workflow.attempt.as_ref()) + { + validate_workflow_intent(attempt, spec)?; + } + let future = &spec.future; if audit.termination.accepted_generation > future.requested_steps as u64 { return Err(RunSetError::Integrity( @@ -128,6 +148,63 @@ pub fn runtime_custody( Ok(ConfiguredRuntimeCustody::Typed(Box::new(audit))) } +fn validate_workflow_intent( + attempt: &rheon::workflow::WorkflowAttempt, + spec: &FrozenConfiguredSpec, +) -> Result<(), RunSetError> { + if attempt.attempted_generation > spec.future.requested_steps as u64 + || attempt.requested_dt.to_bits() != spec.future.requested_dt_s.to_bits() + || attempt.descriptor.viscosity.is_some() != declared_viscosity(spec).0 + || attempt.descriptor.viscosity.unwrap_or(0.0).to_bits() + != declared_viscosity(spec).1.to_bits() + { + return Err(RunSetError::Integrity( + "configured workflow attempt differs from intent", + )); + } + let forces = spec + .future + .forces + .iter() + .map(super::ForceSpec::body_force) + .collect::>(); + let inlet_id = (0..=2) + .find(|id| *id != spec.constructor.carrier_id && *id != spec.constructor.volume_stamp.id) + .ok_or(RunSetError::Integrity("configured zero inlet identity"))?; + let inlet = rheon::LiquidInlet::new( + rheon::VolumeStamp { + id: inlet_id, + version: 0, + }, + [[0.0; 2]; 3], + ) + .map_err(|_| RunSetError::Integrity("configured zero inlet"))?; + if !attempt.matches_request(rheon::LiquidStepInputs { + requested_dt: spec.future.requested_dt_s, + smoke_source: None, + forces: &forces, + inlet, + source: None, + volume: spec.future.volume.settings(), + }) { + return Err(RunSetError::Integrity( + "configured workflow actual controls differ from intent", + )); + } + if let Some(actual) = attempt + .pressure + .as_ref() + .and_then(|pressure| pressure.binding.as_ref()) + { + expected_provider(spec, attempt.attempted_generation) + .ok_or(RunSetError::Integrity( + "configured workflow provider in native phase", + ))? + .validate_resolved_identity(actual)?; + } + Ok(()) +} + fn declared_viscosity(spec: &FrozenConfiguredSpec) -> (bool, f64) { match spec.future.viscosity { ViscosityIntent::Disabled => (false, 0.0), @@ -348,6 +425,9 @@ fn validate_publications( for ordinal in 0..count { let step = reader.select(ordinal)?; let observed = RecordedConfiguredSession::decode(reader.run(), &step)?; + if let Some(attempt) = rheon::recording::workflow::publication(reader.run(), &step)? { + validate_workflow_intent(&attempt, spec)?; + } let initial = future.capture_constructor && ordinal == 0; let generation = (ordinal + 1 - constructor_count) as u64; if observed.generation != generation diff --git a/src/bin/desktop/workflow_inspector.rs b/src/bin/desktop/workflow_inspector.rs new file mode 100644 index 00000000..26671be0 --- /dev/null +++ b/src/bin/desktop/workflow_inspector.rs @@ -0,0 +1,769 @@ +//! Cached, read-only native projection of numerical workflow receipts. +//! Selection and explicit archive reads happen before paint; rendering never +//! starts a provider, reads a package, or opens a recording. +use super::inspector::Inspector; +use eframe::egui; +use rheon::{ + recording::{RecordedStep, RecordingRun}, + workflow::{EdgeKind, NodeKind, NodeStatus, WorkflowAttempt}, +}; +use std::sync::Arc; + +const LANES: [&str; 5] = [ + "Geometry", + "State", + "Algorithm", + "Qualification", + "Publication", +]; +const NODE_SIZE: egui::Vec2 = egui::vec2(174.0, 58.0); + +#[derive(Default)] +pub struct WorkflowInspector { + pub open: bool, + source: Option<(RecordingRun, Arc)>, + attempt: Option>, + message: String, + selected: usize, + zoom: f32, + pan: egui::Vec2, + pan_drag: Option<(egui::Pos2, egui::Vec2)>, + evidence: bool, + restore_focus: bool, + terminal_request: bool, + terminal_mode: bool, + identity: Option, + return_focus: Option, + evidence_focus: Option, + navigated: bool, + focus_text: bool, + comparison_key: Option, + comparison_source: Option<(RecordingRun, usize)>, + comparison_context: bool, + #[cfg(test)] + controls: std::collections::BTreeMap, +} +impl WorkflowInspector { + /// Consumes only an immutable cached exact publication, including clearing + /// the previous graph when the upstream selection becomes unavailable. + pub fn select(&mut self, inspector: Option<&Inspector>) { + if self.comparison_context { + self.terminal_request = false; + self.terminal_mode = false; + } + self.comparison_key = None; + self.comparison_source = None; + self.comparison_context = false; + let identity = inspector.and_then(Inspector::workflow_identity); + let identity_changed = self.identity != identity; + self.identity = identity; + let cached = inspector.map_or(Ok(None), Inspector::workflow_selection); + let attempt = cached + .as_ref() + .ok() + .and_then(|s| s.as_ref()) + .and_then(|selection| selection.attempt.clone()); + let selection = + cached.map(|selection| selection.map(|selection| (selection.run, selection.step))); + if self.terminal_request { + self.terminal_request = false; + let source = selection.as_ref().ok().and_then(|s| s.as_ref()).cloned(); + self.terminal_mode = true; + match inspector + .ok_or_else(|| "No recorded source selected".to_string()) + .and_then(Inspector::load_workflow_terminal) + { + Ok(Some(attempt)) => self.set_attempt(attempt), + Ok(None) => self.unavailable( + "Terminal workflow execution evidence unavailable (active or legacy archive).", + ), + Err(error) => self.unavailable(&format!( + "Invalid terminal workflow execution evidence: {error}" + )), + } + self.source = source; + return; + } + if self.terminal_mode && !identity_changed { + let unchanged = match (selection.as_ref(), self.source.as_ref()) { + (Ok(None), None) => true, + (Ok(Some((run, step))), Some((old_run, old_step))) => { + old_run == run && Arc::ptr_eq(old_step, step) + } + _ => false, + }; + if unchanged { + return; + } + } + self.terminal_mode = false; + match selection { + Ok(Some((run, step))) => { + if self.source.as_ref().is_some_and(|(old_run, old_step)| { + old_run == &run && Arc::ptr_eq(old_step, &step) + }) { + return; + } + self.attempt = None; + self.message.clear(); + self.evidence = false; + match attempt { + Some(attempt) => self.set_attempt(attempt), + None => self.message = "Workflow execution evidence unavailable for this publication (constructor or legacy archive).".into(), + } + self.source = Some((run, step)); + } + Ok(None) => self.unavailable( + "Workflow execution evidence unavailable: no exact recorded publication selected.", + ), + Err(error) => self.unavailable(&format!("Workflow selection unavailable: {error}")), + } + } + fn unavailable(&mut self, message: &str) { + self.pan_drag = None; + self.source = None; + self.attempt = None; + self.evidence = false; + self.message = message.into(); + } + pub fn load_comparison( + &mut self, + loaded: Result< + Option, + super::saved_comparison::SelectedFieldsError, + >, + ) { + self.unavailable( + "Workflow execution evidence unavailable: choose a verified comparison publication.", + ); + self.comparison_key = None; + self.comparison_source = None; + self.comparison_context = true; + self.terminal_request = false; + self.terminal_mode = false; + match loaded { + Ok(Some(loaded)) => { + self.comparison_key = Some(loaded.key); + self.comparison_source = Some((loaded.run, loaded.ordinal)); + match loaded.attempt {Some(attempt)=>self.set_attempt(attempt),None=>self.message="Workflow execution evidence unavailable for this comparison publication (constructor or legacy archive).".into()} + } + Ok(None) => {} + Err(error) => { + self.message = + format!("Invalid or unavailable selected comparison workflow: {error}") + } + } + } + pub fn comparison_side(&self) -> Option { + self.comparison_key.as_ref().map(|key| key.side) + } + pub fn validate_comparison( + &mut self, + current: Option<&super::saved_comparison::WorkflowComparisonKey>, + ) { + if !self.comparison_context + || (self.comparison_key.is_some() && self.comparison_key.as_ref() != current) + { + self.unavailable("Workflow execution evidence unavailable: comparison source, recipe or selected pair changed; inspect the exact side again."); + self.comparison_key = None; + self.comparison_source = None; + self.comparison_context = true; + } + } + fn set_attempt(&mut self, attempt: Arc) { + self.pan_drag = None; + match attempt.validate() { + Ok(()) => { + self.selected = self.selected.min(attempt.descriptor.nodes().len() - 1); + self.attempt = Some(attempt); + self.message.clear(); + if self.zoom == 0.0 { + self.reset(); + } + } + Err(error) => { + self.unavailable(&format!("Invalid workflow execution evidence: {error}")) + } + } + } + pub fn open(&mut self) { + self.pan_drag = None; + self.open = true; + self.focus_text = false; + self.restore_focus = true; + } + pub fn open_from(&mut self, trigger: egui::Id) { + self.open(); + self.return_focus = Some(trigger); + } + fn reset(&mut self) { + self.pan_drag = None; + self.zoom = 0.85; + self.pan = egui::Vec2::ZERO; + } + fn control(&mut self, name: impl Into, response: egui::Response) -> egui::Response { + #[cfg(test)] + self.controls.insert(name.into(), response.rect); + #[cfg(not(test))] + let _ = name; + response + } + pub fn show(&mut self, ctx: &egui::Context) { + if !self.open { + self.pan_drag = None; + return; + } + if ctx.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::Escape)) { + if self.evidence { + self.evidence = false; + if let Some(id) = self.evidence_focus { + ctx.memory_mut(|memory| memory.request_focus(id)); + } + } else { + self.open = false; + if let Some(id) = self.return_focus { + ctx.memory_mut(|memory| memory.request_focus(id)); + } + return; + } + } + let mut open = true; + egui::Window::new("Executed workflow") + .id(egui::Id::new("executed-workflow")) + .open(&mut open) + .default_width(1100.0) + .default_height(700.0) + .resizable(true) + .show(ctx, |ui| self.ui(ui)); + if !open { + self.open = false; + self.evidence = false; + } + if self.evidence { + let mut open = true; + egui::Window::new("Retained workflow evidence") + .id(egui::Id::new("retained-workflow-evidence")) + .open(&mut open) + .default_width(640.0) + .show(ctx, |ui| { + ui.label("Exact retained attempt; no provider execution is needed for inspection."); + let scroll = egui::ScrollArea::vertical() + .id_salt("workflow-evidence-scroll") + .max_height((ctx.content_rect().bottom() - ui.cursor().top() - 60.0).clamp(80.0, 600.0)) + .show(ui, |ui| { + if let Some(attempt) = &self.attempt { + ui.monospace(format!("descriptor SHA-256 {}", hex(&attempt.descriptor_sha256))); + ui.monospace(format!("Accepted native input state SHA-256 {}", hex(&attempt.input_sha256))); + ui.monospace(format!("Actual request controls SHA-256 {}", hex(&attempt.request_sha256))); + ui.label(format!("{} prescribed forces · smoke source {} · volume source {}", attempt.force_count, attempt.smoke_source_present, attempt.volume_source_present)); + ui.label(format!("Run {} · attempt {} · publication {:?}", attempt.run_id, attempt.attempt_id, attempt.publication)); + ui.label(&attempt.diagnostic); + if let Some((run, step)) = &self.source { + ui.label(format!("Source {} · recorded ordinal {}", run.identity.source_revision, step.ordinal)); + ui.label(&run.provenance); + } + if let Some((run, ordinal)) = &self.comparison_source { + ui.label(format!("Verified comparison source {} · recorded ordinal {}", run.identity.source_revision, ordinal)); + ui.label(&run.provenance); + } + if let Some(pressure) = &attempt.pressure { + if let Some(binding) = &pressure.binding { + ui.label(format!("Provider binding: {} / {}", binding.id, binding.version)); + ui.monospace(format!("Provider manifest SHA-256 {}", hex(&binding.manifest_sha256))); + ui.monospace(format!("Provider checkpoint SHA-256 {}", binding.checkpoint_sha256.map_or_else(|| "unavailable".into(), |hash| hex(&hash)))); + ui.label(format!("Provider runtime {} · source {} · training run {}", binding.runtime, binding.source_revision, binding.training_run_id.as_deref().unwrap_or("unavailable"))); + } else { + ui.label("Configured provider binding unavailable; native selection is recorded separately."); + } + if let Some(hash) = pressure.rhs_sha256 { ui.monospace(format!("Input RHS SHA-256 {}", hex(&hash))); } + } + } + }); + #[cfg(test)] + self.controls.insert("evidence-scroll".into(), scroll.inner_rect); + #[cfg(not(test))] + let _ = scroll; + let close = ui.button("Close evidence"); + if self.control("close-evidence", close).clicked() { self.evidence = false; } + }); + self.evidence &= open; + if !self.evidence + && let Some(id) = self.evidence_focus + { + ctx.memory_mut(|memory| memory.request_focus(id)); + } + } + if !self.open + && let Some(id) = self.return_focus + { + ctx.memory_mut(|memory| memory.request_focus(id)); + } + } + fn ui(&mut self, ui: &mut egui::Ui) { + self.navigated = false; + #[cfg(test)] + self.controls.clear(); + ui.label("Read-only native sealed MAC composition and actual execution receipts"); + if let Some(key) = &self.comparison_key { + ui.label(format!("Verified comparison side: {:?}", key.side)); + } + ui.horizontal(|ui| { + if self.comparison_context { ui.small("Exact verified comparison publication. Inspect its archive for terminal attempts."); } + else { + if self + .control("terminal", ui.button("Load terminal attempt")) + .clicked() + { + self.terminal_request = true; + } + if self + .control("publication", ui.button("Inspect selected publication")) + .clicked() + { + self.source = None; + self.terminal_mode = false; + } + } + }); + if !self.message.is_empty() { + ui.label(&self.message); + } + let Some(attempt) = self.attempt.clone() else { + if ui.button("Close workflow").clicked() { + self.open = false; + } + return; + }; + ui.horizontal_wrapped(|ui| { + ui.label(format!( + "Run {} · attempt {} · {:?}", + attempt.run_id, attempt.attempt_id, attempt.outcome + )); + ui.label(format!( + "Input generation {} → attempted {} · publication {:?}", + attempt.accepted_generation, attempt.attempted_generation, attempt.publication + )); + }); + if let Some(pressure) = &attempt.pressure { + ui.label(format!( + "Actual pressure provider: {} · fallback/rejection: {}", + if pressure.selected.is_empty() { + "unavailable" + } else { + &pressure.selected + }, + pressure.rejection.as_deref().unwrap_or("none recorded") + )); + } + ui.horizontal_wrapped(|ui| { + let response = + ui.add(egui::Slider::new(&mut self.zoom, 0.5..=1.5).text("Workflow zoom")); + self.control("zoom", response); + let response = ui.button("Reset workflow view"); + if self.control("reset", response).clicked() { + self.reset(); + } + let response = ui.button("Open retained evidence"); + let response = self.control("evidence", response); + if response.clicked() { + self.evidence = true; + self.evidence_focus = Some(response.id); + } + let response = ui.button("Close workflow"); + if self.control("close", response).clicked() { + self.open = false; + self.evidence = false; + } + }); + ui.small("Select a node with the pointer or Tab. Arrow keys / Home / End move the focused workflow selection. Drag background to pan; use zoom or Reset. Escape closes this view."); + self.canvas(ui, &attempt); + ui.separator(); + egui::ScrollArea::vertical() + .id_salt("workflow-details") + .max_height(300.0) + .show(ui, |ui| { + self.details(ui, &attempt); + egui::CollapsingHeader::new("Pressure iteration loop details").show(ui, |ui| { + ui.label(format!("Native iteration cap {}", attempt.descriptor.pressure.max_iterations)); + if let Some(report) = attempt.pressure.as_ref().and_then(|p| p.accepted) { + ui.label(format!("Accepted pressure iterations: {}", report.iterations)); + } else { ui.label("Actual iteration count unavailable"); } + ui.small("Bounded summary only. Per-iteration residual history and whole-workflow timing are unavailable."); + }); + egui::CollapsingHeader::new( + "Ordered text equivalent: nodes and typed dependencies", + ) + .default_open(true) + .show(ui, |ui| { + for (index, node) in attempt.descriptor.nodes().iter().copied().enumerate() { + let response = ui.scope_builder(egui::UiBuilder::new().id(("workflow-text-node", node as u8)), |ui| ui.selectable_label( + self.selected == index, + format!( + "{} · {} · {}", + index + 1, + node.label(), + status(&attempt, node) + ), + )).inner; + let response = self.control(format!("text-{index}"), response); + if self.restore_focus && self.focus_text && self.selected == index { + response.request_focus();response.scroll_to_me_animation(Some(egui::Align::Center), egui::style::ScrollAnimation::none());self.restore_focus=false; + } + if response.clicked() || (response.gained_focus() && !self.navigated) { + self.selected = index;self.focus_text=true; + if response.clicked(){response.request_focus();} + } + self.keyboard(ui, &response, attempt.descriptor.nodes().len()); + } + for edge in attempt.descriptor.edges() { + ui.small(format!( + "{} → {} · {:?} · {:?}, {} · {}", + edge.from.label(), + edge.to.label(), + edge.kind, + edge.port, + edge.port.units(), + edge.port.association() + )); + } + }); + }); + } + fn keyboard(&mut self, ui: &egui::Ui, response: &egui::Response, count: usize) { + if !response.has_focus() || self.navigated { + return; + } + ui.memory_mut(|memory| { + memory.set_focus_lock_filter( + response.id, + egui::EventFilter { + horizontal_arrows: true, + vertical_arrows: true, + escape: true, + tab: false, + }, + ) + }); + ui.memory_mut(|memory| memory.move_focus(egui::FocusDirection::None)); + let previous = self.selected; + ui.input_mut(|input| { + if input.consume_key(egui::Modifiers::NONE, egui::Key::ArrowRight) + || input.consume_key(egui::Modifiers::NONE, egui::Key::ArrowDown) + { + self.selected = (self.selected + 1).min(count - 1); + } + if input.consume_key(egui::Modifiers::NONE, egui::Key::ArrowLeft) + || input.consume_key(egui::Modifiers::NONE, egui::Key::ArrowUp) + { + self.selected = self.selected.saturating_sub(1); + } + if input.consume_key(egui::Modifiers::NONE, egui::Key::Home) { + self.selected = 0; + } + if input.consume_key(egui::Modifiers::NONE, egui::Key::End) { + self.selected = count - 1; + } + if input.consume_key(egui::Modifiers::NONE, egui::Key::Escape) { + self.open = false; + self.evidence = false; + } + }); + self.restore_focus |= self.selected != previous; + self.navigated = self.selected != previous; + } + fn canvas(&mut self, ui: &mut egui::Ui, attempt: &WorkflowAttempt) { + let size = egui::vec2(ui.available_width().max(300.0), 390.0); + let (rect, response) = ui.allocate_exact_size(size, egui::Sense::drag()); + let response = self.control("canvas", response); + let painter = ui.painter_at(rect); + painter.rect_filled(rect, 5.0, ui.visuals().extreme_bg_color); + let position = |node: NodeKind| { + let rank = match node { + NodeKind::Geometry | NodeKind::AcceptedState => 0, + NodeKind::Interval => 1, + NodeKind::Advection => 2, + NodeKind::Forces => 3, + NodeKind::Viscosity => 4, + NodeKind::PressureRequest => 5, + NodeKind::PressureCandidate => 6, + NodeKind::PressureQualification | NodeKind::NativeFallback => 7, + NodeKind::Projection => 8, + NodeKind::TracerTransport => 9, + NodeKind::VolumeTransport => 10, + NodeKind::Publication => 11, + }; + egui::pos2(node.lane() as f32 * 200.0 + 12.0, rank as f32 * 72.0 + 32.0) + }; + if response.drag_started() { + self.pan_drag = ui + .input(|input| input.pointer.press_origin()) + .filter(|origin| { + rect.contains(*origin) + && !attempt.descriptor.nodes().iter().any(|node| { + egui::Rect::from_min_size( + rect.min + self.pan + position(*node).to_vec2() * self.zoom, + (NODE_SIZE * self.zoom).max(egui::vec2(80.0, 36.0)), + ) + .contains(*origin) + }) + }) + .map(|origin| (origin, self.pan)); + } + if response.dragged() { + if let Some(((origin, initial_pan), pointer)) = + self.pan_drag.zip(response.interact_pointer_pos()) + { + self.pan = (initial_pan + (pointer - origin)) + .clamp(egui::vec2(-1500.0, -1500.0), egui::vec2(1500.0, 1500.0)); + } + } else { + self.pan_drag = None; + } + if self.restore_focus && !self.focus_text { + let node_position = position(attempt.descriptor.nodes()[self.selected]).to_vec2() + * self.zoom + + self.pan; + if node_position.x < 0.0 { + self.pan.x -= node_position.x; + } + if node_position.x + NODE_SIZE.x * self.zoom > rect.width() { + self.pan.x -= node_position.x + NODE_SIZE.x * self.zoom - rect.width(); + } + if node_position.y < 0.0 { + self.pan.y -= node_position.y; + } + if node_position.y + NODE_SIZE.y * self.zoom > rect.height() { + self.pan.y -= node_position.y + NODE_SIZE.y * self.zoom - rect.height(); + } + } + let zoom = self.zoom; + let pan = self.pan; + let transform = |p: egui::Pos2| rect.min + pan + p.to_vec2() * zoom; + let mut graph = ui.new_child(egui::UiBuilder::new().max_rect(rect)); + graph.set_clip_rect(rect); + for (lane, label) in LANES.iter().enumerate() { + painter.text( + transform(egui::pos2(lane as f32 * 200.0 + 12.0, 10.0)), + egui::Align2::LEFT_TOP, + label, + egui::FontId::proportional(13.0), + ui.visuals().text_color(), + ); + } + for edge in attempt.descriptor.edges() { + let a = transform(position(edge.from) + NODE_SIZE * 0.5); + let b = transform(position(edge.to) + NODE_SIZE * 0.5); + let color = match edge.kind { + EdgeKind::Fallback => egui::Color32::from_rgb(235, 175, 80), + EdgeKind::TimeLoop | EdgeKind::IterationLoop => { + egui::Color32::from_rgb(150, 165, 220) + } + EdgeKind::Data => ui.visuals().weak_text_color(), + }; + if edge.from == edge.to { + let start = a + egui::vec2(NODE_SIZE.x * 0.5, 0.0) * self.zoom; + let outer = start + egui::vec2(35.0, 0.0) * self.zoom; + let top = outer + egui::vec2(0.0, -55.0) * self.zoom; + let inner = egui::pos2(a.x, top.y); + let end = a - egui::vec2(0.0, NODE_SIZE.y * 0.5) * self.zoom; + painter.add(egui::Shape::line( + vec![start, outer, top, inner], + egui::Stroke::new(1.0, color), + )); + painter.arrow(inner, end - inner, egui::Stroke::new(1.0, color)); + painter.text( + outer + egui::vec2(4.0, -20.0), + egui::Align2::LEFT_CENTER, + "pressure iteration loop", + egui::FontId::proportional(10.0), + color, + ); + } else { + painter.arrow(a, b - a, egui::Stroke::new(1.0, color)); + } + painter.circle_filled(a, 2.5, color); + painter.circle_filled(b, 2.5, color); + let selected = attempt.descriptor.nodes()[self.selected]; + if edge.from != edge.to && (edge.from == selected || edge.to == selected) { + painter.text( + a.lerp(b, 0.5), + egui::Align2::CENTER_CENTER, + format!("{:?} · {} · {:?}", edge.port, edge.port.units(), edge.kind), + egui::FontId::proportional(10.0), + color, + ); + } + } + for (index, node) in attempt.descriptor.nodes().iter().copied().enumerate() { + let node_rect = egui::Rect::from_min_size( + transform(position(node)), + (NODE_SIZE * self.zoom).max(egui::vec2(80.0, 36.0)), + ); + if !node_rect.intersects(rect) { + continue; + } + let response = graph + .scope_builder( + egui::UiBuilder::new().id(("workflow-canvas-node", node as u8)), + |ui| { + ui.put( + node_rect, + egui::Button::new( + egui::RichText::new(format!( + "{}\n{}", + node.label(), + status(attempt, node) + )) + .size((13.0 * self.zoom).max(10.0)), + ) + .wrap_mode(egui::TextWrapMode::Truncate) + .selected(self.selected == index), + ) + }, + ) + .inner; + let response = self.control(format!("node-{index}"), response); + if self.restore_focus && !self.focus_text && self.selected == index { + response.request_focus(); + self.restore_focus = false; + } + if response.clicked() || (response.gained_focus() && !self.navigated) { + self.selected = index; + self.focus_text = false; + if response.clicked() { + response.request_focus(); + } + } + self.keyboard(ui, &response, attempt.descriptor.nodes().len()); + if response.has_focus() { + painter.rect_stroke( + node_rect.expand(3.0), + 3.0, + egui::Stroke::new(2.0, ui.visuals().text_color()), + egui::StrokeKind::Inside, + ); + } + } + } + fn details(&self, ui: &mut egui::Ui, attempt: &WorkflowAttempt) { + let node = attempt.descriptor.nodes()[self.selected]; + ui.heading(format!("{} · {}", node.label(), status(attempt, node))); + ui.label(format!( + "Requested dt {:.9e} s · actual dt {} · interval start {:.9e} s", + attempt.requested_dt, + number(attempt.actual_dt, "s"), + attempt.interval_start + )); + ui.small(format!( + "{} · {}", + attempt.descriptor.family(), + attempt.descriptor.operator() + )); + ui.label(format!( + "Density {} kg/m³ · viscosity {}", + attempt.descriptor.density, + attempt + .descriptor + .viscosity + .map_or_else(|| "disabled".into(), |v| format!("{v:.9e} Pa·s (applied)")) + )); + ui.label(format!( + "Grid {:?} · spacing {:?} m · origin {:?} m", + attempt.descriptor.grid.counts(), + attempt.descriptor.grid.spacing(), + attempt.descriptor.grid.origin() + )); + for edge in attempt + .descriptor + .edges() + .iter() + .filter(|e| e.from == node || e.to == node) + { + ui.small(format!( + "{} → {}: {:?} · {} · {} · {:?}", + edge.from.label(), + edge.to.label(), + edge.port, + edge.port.units(), + edge.port.association(), + edge.kind + )); + } + if let Some(pressure) = &attempt.pressure { + ui.label(format!( + "Actual pressure provider: {} · support {:?} · provider method entered {}", + if pressure.selected.is_empty() { + "unavailable" + } else { + &pressure.selected + }, + pressure.support, + pressure.prediction_called + )); + ui.label(format!( + "Candidate rejection / fallback reason: {}", + pressure.rejection.as_deref().unwrap_or("none recorded") + )); + ui.label(format!( + "Actual host L2 residual acceptance limit: {}", + number(pressure.residual_l2_limit, "m³/s²") + )); + if let Some(report) = pressure.candidate { + ui.label(format!("Candidate pressure (before host selection): residual L2 {:.6e} m³/s² · max {:.6e} m³/s² · predicted divergence {:.6e} 1/s · iterations {}", report.true_residual_l2, report.true_residual_max, report.predicted_divergence_max, report.iterations)); + } else { + ui.label("Candidate pressure diagnostics unavailable"); + } + if let Some(report) = pressure.accepted { + ui.label(format!("Accepted pressure (selected provider): residual L2 {:.6e} m³/s² · max {:.6e} m³/s² · predicted divergence {:.6e} 1/s · iterations {}", report.true_residual_l2, report.true_residual_max, report.predicted_divergence_max, report.iterations)); + } else { + ui.label("Accepted pressure diagnostics unavailable"); + } + ui.label(format!( + "Pressure-call time {}", + pressure.pressure_call_ns.map_or_else( + || "unavailable".into(), + |n| format!("{n} ns (pressure call only)") + ) + )); + } else { + ui.label("Pressure execution evidence unavailable for this attempt"); + } + ui.label(format!("Pressure limits: relative residual {:.6e} (dimensionless) · absolute residual {:.6e} m³/s² · predicted divergence {:.6e} 1/s · iteration cap {}", attempt.descriptor.pressure.relative_residual, attempt.descriptor.pressure.absolute_residual, attempt.descriptor.pressure.divergence_limit, attempt.descriptor.pressure.max_iterations)); + ui.label(format!( + "Actual divergence {} · limit {:.6e} 1/s", + number(attempt.actual_divergence_max, "1/s"), + attempt.descriptor.actual_divergence_limit + )); + ui.label(&attempt.diagnostic); + } +} +fn status(attempt: &WorkflowAttempt, node: NodeKind) -> &'static str { + match attempt + .nodes + .iter() + .rev() + .find(|receipt| receipt.node == node) + .map(|r| r.status) + { + Some(NodeStatus::Started) => "incomplete: started", + Some(NodeStatus::Completed) => "✓ completed", + Some(NodeStatus::CandidateReturned) => "candidate returned", + Some(NodeStatus::Rejected) => "! rejected", + Some(NodeStatus::Selected) => "→ selected", + Some(NodeStatus::Accepted) => "✓ accepted", + None => "execution unavailable", + } +} +fn number(value: Option, units: &str) -> String { + value.map_or_else( + || "unavailable".into(), + |value| format!("{value:.9e} {units}"), + ) +} +fn hex(bytes: &[u8; 32]) -> String { + bytes.iter().map(|byte| format!("{byte:02x}")).collect() +} + +#[cfg(test)] +#[path = "workflow_inspector_tests.rs"] +mod tests; diff --git a/src/bin/desktop/workflow_inspector_tests.rs b/src/bin/desktop/workflow_inspector_tests.rs new file mode 100644 index 00000000..15228086 --- /dev/null +++ b/src/bin/desktop/workflow_inspector_tests.rs @@ -0,0 +1,1429 @@ +use super::*; + +#[test] +fn c1b2_projection_profile_refusal_clears_cached_g1_evidence_and_gesture() { + use rheon::projection_step::{ProjectionIntent, ProjectionStepWorkspace}; + use rheon::recording::provider::runtime::RuntimeTerminationCause; + use rheon::recording::{RecordingLimits, StepRecorder, projection}; + use rheon::*; + let output = crate::configured_worker_tests::Output::new(); + let (old_attempt, old_session) = observed_fixture(false); + let old_path = output.0.join("old-g1.sqlite"); + let limits = RecordingLimits::default(); + let run = + rheon::recording::provider::configured_run(&old_session.snapshot(), "retained G1 source") + .unwrap(); + let mut writer = StepRecorder::create(&old_path, run, limits).unwrap(); + writer + .append( + &rheon::recording::workflow::configured_publication_with_workflow( + &old_session.snapshot(), + 0, + limits.max_record_bytes, + None, + ) + .unwrap(), + ) + .unwrap(); + writer + .finish("completed", "prior G1 source", Some(1)) + .unwrap(); + drop(writer); + + for (label, intent) in [ + ("builtin", ProjectionIntent::BuiltinNativeV1), + ( + "selection", + ProjectionIntent::ClassicalSelectionV1 { + producer: PressureImplementation::SymmetricGaussSeidelPcgV1, + producer_max_iterations: 100, + }, + ), + ] { + for terminal_only in [false, true] { + let cfg = *old_session.snapshot().configuration(); + let grid = old_session.snapshot().grid().clone(); + let mut owner = SimulationSession::new_with_projection( + old_session.snapshot().identity().clone(), + grid.clone(), + cfg.transport, + cfg.implementation, + vec![1.0; grid.cell_len()], + cfg.boundary_workspace_limit, + cfg.max_steps, + intent, + ) + .unwrap(); + let mut workspace = ProjectionStepWorkspace::new_with_intent( + &grid, + cfg.transport.carrier.density, + 4 * 1024 * 1024, + cfg.implementation, + intent, + ) + .unwrap(); + let path = output + .0 + .join(format!("projection-{label}-{terminal_only}.sqlite")); + let run = projection::projection_run(&owner.snapshot(), "new typed projection source") + .unwrap(); + let mut writer = StepRecorder::create(&path, run, limits).unwrap(); + if !terminal_only { + writer + .append( + &projection::projection_publication( + &owner.snapshot(), + 0, + limits.max_record_bytes, + ) + .unwrap(), + ) + .unwrap(); + let accepted = owner + .step_with_native_projection( + LiquidStepInputs { + requested_dt: 0.001, + smoke_source: None, + forces: &[], + source: None, + inlet: LiquidInlet::new( + VolumeStamp { id: 3, version: 0 }, + [[0.0; 2]; 3], + ) + .unwrap(), + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + }, + &mut workspace, + None, + |_| false, + ) + .unwrap(); + writer + .append( + &projection::projection_publication( + &owner.snapshot(), + 1, + limits.max_record_bytes, + ) + .unwrap(), + ) + .unwrap(); + projection::ProjectionTermination::capture( + &owner.snapshot(), + RuntimeTerminationCause::Completed, + "accepted projection", + Some(&accepted.attempt), + ) + .unwrap() + .finish(&mut writer) + .unwrap(); + } else { + projection::ProjectionTermination::capture( + &owner.snapshot(), + RuntimeTerminationCause::Cancelled, + "cancelled before any numerical attempt", + None, + ) + .unwrap() + .finish(&mut writer) + .unwrap(); + } + drop(writer); + drop(workspace); + drop(owner); + let inspector = Inspector::default(); + inspector.reload(&old_path, limits).unwrap(); + inspector.select_timestep(0).unwrap(); + let mut h = Harness::new(); + h.view.select(Some(&inspector)); + assert!(h.view.attempt.is_some()); + h.view.evidence = true; + h.view.pan_drag = Some((egui::Pos2::ZERO, egui::Vec2::ZERO)); + let refusal = inspector.reload(&path, limits).unwrap_err(); + assert!(refusal.contains("typed projection reader")); + assert!(inspector.workflow_selection().unwrap().is_none()); + assert!(inspector.workflow_identity().is_none()); + h.view.select(Some(&inspector)); + assert!(h.view.attempt.is_none() && h.view.source.is_none()); + assert!(!h.view.evidence && h.view.pan_drag.is_none()); + assert!(!h.view.message.contains("legacy")); + assert!(old_attempt.publication.is_some()); + // The namespace refusal also covers unsupported future versions, without + // changing historical raw-profile inspection for unrelated namespaces. + let future = output + .0 + .join(format!("future-projection-{label}-{terminal_only}.sqlite")); + let source = rheon::recording::RecordingReader::open(&path, limits).unwrap(); + let (profile, version) = if label == "builtin" { + ("rheon-native-projection-session-v1", 1) + } else { + ("rheon-native-projection-selection-v1", 2) + }; + assert_eq!(source.run().solver, profile); + assert!( + source + .run() + .configuration + .starts_with(&format!("RPS{version}:")) + ); + assert!( + source + .status() + .unwrap() + .detail + .starts_with(&format!("RPT{version}:")) + ); + for ordinal in 0..source.count().unwrap() { + assert!( + source + .select(ordinal) + .unwrap() + .controls + .starts_with(&format!("RPP{version}:")) + ); + } + let mut future_run = source.run().clone(); + future_run.solver = format!( + "rheon-native-projection-{}-v999", + if label == "builtin" { + "session" + } else { + "selection" + } + ); + drop(source); + let mut future_writer = StepRecorder::create(&future, future_run, limits).unwrap(); + future_writer + .finish("cancelled", "unsupported future profile fixture", Some(0)) + .unwrap(); + drop(future_writer); + assert!( + inspector + .reload(&future, limits) + .unwrap_err() + .contains("typed projection reader") + ); + } + } +} + +fn fixture() -> Arc { + observed_fixture(false).0 +} +fn observed_fixture(cancel_before: bool) -> (Arc, rheon::SimulationSession) { + let (attempt, session, error) = observed_fixture_with(100, |_| cancel_before); + assert_eq!(error.is_some(), cancel_before); + (attempt, session) +} + +fn observed_fixture_with( + max_iterations: usize, + cancel: impl FnMut(rheon::LiquidStepStage) -> bool, +) -> ( + Arc, + rheon::SimulationSession, + Option, +) { + use rheon::*; + const CAP: usize = 4 * 1024 * 1024; + let grid = GridGeometry::new([2; 3], [0.25; 3], [0.0; 3]).unwrap(); + let mut session = SimulationSession::new( + SessionIdentity { + run_id: 42, + source_revision: "native-workflow-interaction-fixture".into(), + }, + grid.clone(), + LiquidTransportConfig { + carrier: SimulationConfig { + density: 2.0, + memory_limit: CAP, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations, + }, + actual_divergence_limit: 1e-5, + max_courant: 0.5, + }, + represented_density: 2.0, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + }, + PressureImplementation::JacobiPcgV1, + vec![1.0; 8], + CAP, + 3, + ) + .unwrap(); + let mut workspace = + ProviderStepWorkspace::new(&grid, 2.0, CAP, PressureImplementation::JacobiPcgV1).unwrap(); + let mut viscosity = ViscosityWorkspace::new(grid, CAP).unwrap(); + let forces = [BodyForce { + value: [0.125, 0.0, 0.0], + units: ForceUnits::Acceleration, + region: None, + }]; + let mut evidence = None; + let result = session.step_with_configured_pressure_observed( + LiquidStepInputs { + requested_dt: 0.0625, + smoke_source: None, + forces: &forces, + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]).unwrap(), + source: None, + volume: LiquidVolumeSettings { + max_outward_courant: 0.5, + actual_divergence_limit: 1e-5, + }, + }, + &mut workspace, + Some((&mut viscosity, 0.0)), + None, + None, + cancel, + 7, + &mut evidence, + ); + (evidence.unwrap(), session, result.err()) +} + +struct Harness { + context: egui::Context, + view: WorkflowInspector, + time: f64, +} +impl Harness { + fn new() -> Self { + let mut view = WorkflowInspector::default(); + view.set_attempt(fixture()); + view.open(); + Self { + context: egui::Context::default(), + view, + time: 0.0, + } + } + fn frame(&mut self, events: Vec) -> egui::FullOutput { + self.frame_on(events, egui::vec2(1500.0, 1200.0)) + } + fn frame_on(&mut self, events: Vec, size: egui::Vec2) -> egui::FullOutput { + self.time += 0.016; + self.context.run( + egui::RawInput { + time: Some(self.time), + screen_rect: Some(egui::Rect::from_min_size(egui::Pos2::ZERO, size)), + events, + ..Default::default() + }, + |ctx| self.view.show(ctx), + ) + } + fn click(&mut self, id: &str) -> egui::FullOutput { + self.frame(vec![]); + self.frame(vec![]); + let pos = self + .view + .controls + .get(id) + .unwrap_or_else(|| panic!("missing {id}")) + .center(); + self.at(pos) + } + fn at(&mut self, pos: egui::Pos2) -> egui::FullOutput { + self.frame(vec![ + egui::Event::PointerMoved(pos), + egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed: true, + modifiers: Default::default(), + }, + ]); + self.frame(vec![egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed: false, + modifiers: Default::default(), + }]) + } + fn key(&mut self, key: egui::Key) -> egui::FullOutput { + self.frame(vec![egui::Event::Key { + key, + physical_key: None, + pressed: true, + repeat: false, + modifiers: Default::default(), + }]); + self.frame(vec![egui::Event::Key { + key, + physical_key: None, + pressed: false, + repeat: false, + modifiers: Default::default(), + }]); + self.frame(vec![]); + self.frame(vec![]) + } +} +fn contains(output: &egui::FullOutput, text: &str) -> bool { + output.shapes.iter().any( + |shape| matches!(&shape.shape,egui::Shape::Text(t) if t.galley.job.text.contains(text)), + ) +} +#[test] +fn evidence_overflow_scrolls_to_lower_hashes_and_keeps_close_on_screen() { + use crate::configured_worker_tests::{Output, app, finish, launch, package, set}; + use rheon::solver_provider::configured::ContextProviderIdentity; + let output = Output::new(); + let provider = package(false, "bad_once"); + let mut application = app(&output); + let root = output.0.join("evidence-overflow"); + launch(&mut application, set(&provider), &root); + let revision = finish(&mut application); + let member = revision + .members + .iter() + .find(|member| member.member_id == "configured") + .unwrap(); + let inspector = Inspector::default(); + inspector + .reload( + &root.join(&member.attempt.as_ref().unwrap().archive_relative_path), + rheon::recording::RecordingLimits::default(), + ) + .unwrap(); + inspector.select_timestep(2).unwrap(); + let retained = inspector + .workflow_selection() + .unwrap() + .unwrap() + .attempt + .unwrap(); + let mut h = Harness::new(); + let mut attempt = (*retained).clone(); + // Presentation boundary test: lengthen bounded identity text on a real + // configured fallback receipt; numerical and execution facts stay intact. + attempt.pressure.as_mut().unwrap().binding = Some(ContextProviderIdentity { + id: "bounded provider identity ".repeat(35), + version: "1".into(), + manifest_sha256: [41; 32], + checkpoint_sha256: Some([42; 32]), + training_run_id: Some("retained training identity ".repeat(30)), + runtime: "retained runtime ".repeat(50), + source_revision: "retained source ".repeat(50), + }); + attempt.validate().unwrap(); + h.view.set_attempt(Arc::new(attempt)); + h.view.evidence = true; + let size = egui::vec2(1000.0, 600.0); + for _ in 0..3 { + h.frame_on(vec![], size); + } + let close = h.view.controls["close-evidence"]; + assert!( + egui::Rect::from_min_size(egui::Pos2::ZERO, size).contains_rect(close), + "footer must remain reachable on a small native viewport: {close:?}" + ); + let scroll = h.view.controls["evidence-scroll"]; + assert!(scroll.height() <= 440.0); + let visible_rhs = |out: &egui::FullOutput| { + out.shapes.iter().any(|shape| { + matches!(&shape.shape, egui::Shape::Text(text) if text.galley.job.text.contains("Input RHS SHA-256") && shape.clip_rect.intersect(scroll).intersect(egui::Rect::from_min_size(text.pos,text.galley.size())).is_positive()) + }) + }; + assert!( + !visible_rhs(&h.frame_on(vec![], size)), + "lower RHS begins outside the bounded evidence viewport" + ); + h.frame_on( + vec![ + egui::Event::PointerMoved(scroll.center()), + egui::Event::MouseWheel { + unit: egui::MouseWheelUnit::Point, + delta: egui::vec2(0.0, -10000.0), + modifiers: Default::default(), + }, + ], + size, + ); + let mut lower = false; + for _ in 0..5 { + lower |= visible_rhs(&h.frame_on(vec![], size)); + } + assert!( + lower, + "real wheel scrolling must reach lower retained RHS evidence" + ); + let pos = h.view.controls["close-evidence"].center(); + h.frame_on( + vec![ + egui::Event::PointerMoved(pos), + egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed: true, + modifiers: Default::default(), + }, + ], + size, + ); + h.frame_on( + vec![egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed: false, + modifiers: Default::default(), + }], + size, + ); + assert!(!h.view.evidence); + assert!(h.view.open); +} + +#[test] +fn pointer_keyboard_focus_evidence_close_and_reopen_use_real_egui_events() { + let mut h = Harness::new(); + h.frame(vec![]); + h.frame(vec![]); + h.click("node-1"); + assert_eq!(h.view.selected, 1); + let out = h.key(egui::Key::ArrowRight); + assert_eq!(h.view.selected, 2); + assert!(contains(&out, "Requested dt")); + assert!(contains(&out, "6.250000000e-2 s")); + h.key(egui::Key::End); + assert_eq!( + h.view.attempt.as_ref().unwrap().descriptor.nodes()[h.view.selected], + NodeKind::Publication + ); + for _ in 0..4 { + h.key(egui::Key::ArrowLeft); + } + assert_eq!( + h.view.attempt.as_ref().unwrap().descriptor.nodes()[h.view.selected], + NodeKind::NativeFallback + ); + h.key(egui::Key::Home); + assert_eq!(h.view.selected, 0); + h.click("evidence"); + assert!(h.view.evidence); + assert!(contains(&h.frame(vec![]), "Input RHS SHA-256")); + h.click("close"); + assert!(!h.view.open); + h.view.open(); + h.frame(vec![]); + assert!(h.view.open); + assert_eq!(h.view.attempt.as_ref().unwrap().attempt_id, 7); + h.click("node-0"); + h.key(egui::Key::Escape); + assert!(!h.view.open); + assert!(!h.view.evidence); +} +#[test] +fn missing_and_invalid_sources_clear_the_previous_graph_and_no_node_status_is_inferred() { + let mut h = Harness::new(); + assert_eq!( + status( + h.view.attempt.as_ref().unwrap(), + NodeKind::PressureCandidate + ), + "execution unavailable" + ); + for _ in 0..3 { + h.frame(vec![]); + } + let canvas = h.view.controls["canvas"]; + let background = egui::pos2(canvas.right() - 25.0, canvas.top() + 25.0); + h.frame(vec![ + egui::Event::PointerMoved(background), + egui::Event::PointerButton { + pos: background, + button: egui::PointerButton::Primary, + pressed: true, + modifiers: Default::default(), + }, + ]); + assert!(h.view.pan_drag.is_some()); + h.view.select(None); + assert!( + h.view.pan_drag.is_none(), + "source invalidation drops an in-progress background gesture" + ); + assert!(h.view.attempt.is_none()); + assert!(h.view.source.is_none()); + h.frame(vec![]); + assert!(contains(&h.frame(vec![]), "no exact recorded publication")); + let mut bad = (*fixture()).clone(); + bad.descriptor_sha256[0] ^= 1; + h.view.set_attempt(Arc::new(bad)); + assert!(h.view.attempt.is_none()); + assert!( + h.view + .message + .contains("Invalid workflow execution evidence: workflow descriptor digest") + ); +} +#[test] +fn actual_worker_archive_projection_survives_provider_removal_and_cached_paint_needs_no_source() { + use crate::configured_worker_tests::{Output, app, finish, launch, package, set}; + let output = Output::new(); + let provider = package(false, "bad_once"); + let mut application = app(&output); + let root = output.0.join("workflow"); + launch(&mut application, set(&provider), &root); + let revision = finish(&mut application); + let member = revision + .members + .iter() + .find(|m| m.member_id == "configured") + .unwrap(); + let attempt = member.attempt.as_ref().unwrap(); + let archive = root.join(&attempt.archive_relative_path); + drop(application); + drop(provider); + let inspector = Inspector::default(); + inspector + .reload(&archive, rheon::recording::RecordingLimits::default()) + .unwrap(); + inspector.select_timestep(2).unwrap(); + let mut h = Harness::new(); + h.view.select(Some(&inspector)); + let retained = h + .view + .attempt + .clone() + .expect("actual accepted workflow receipt"); + assert_eq!(retained.publication, Some(2)); + assert!(retained.pressure.as_ref().unwrap().rejection.is_some()); + assert!( + retained + .nodes + .iter() + .any(|n| n.node == NodeKind::NativeFallback && n.status == NodeStatus::Selected) + ); + drop(inspector); + std::fs::rename(&archive, archive.with_extension("retained-outside-source")).unwrap(); + h.frame(vec![]); + let out = h.frame(vec![]); + assert!(contains(&out, "Actual pressure provider:")); + assert_eq!( + h.view.attempt.as_ref().unwrap().descriptor_sha256, + retained.descriptor_sha256 + ); +} + +/// This prepares retained inputs only. Native qualification still operates the +/// ordinary application through its real display, pointer and keyboard paths. +#[test] +#[ignore = "explicit native smoke fixture preparation; requires exclusive temporary root"] +fn prepare_native_workflow_fixture() { + use crate::configured_worker_tests::{Output, app, finish, launch, package, set}; + use sha2::{Digest, Sha256}; + let root = std::path::PathBuf::from( + std::env::var_os("RHEON_WORKFLOW_NATIVE_ROOT").expect("explicit temporary output root"), + ); + assert!(root.starts_with(std::env::temp_dir())); + std::fs::create_dir(&root).unwrap(); + let mut provider = package(false, "bad_once"); + let retained_provider = root.join("provider"); + std::fs::rename(&provider.root, &retained_provider).unwrap(); + provider.root = retained_provider; + provider.manifest = provider.root.join("adapter.json"); + let code_path = provider.root.join("adapter.py"); + let code = std::fs::read_to_string(&code_path).unwrap().replace( + " result = solve(a, rhs)", + " if (root / 'slow').exists(): time.sleep(0.4)\n result = solve(a, rhs)", + ); + std::fs::write(code_path, &code).unwrap(); + let mut manifest: serde_json::Value = + serde_json::from_slice(&std::fs::read(&provider.manifest).unwrap()).unwrap(); + manifest["files"]["adapter.py"]["bytes"] = serde_json::json!(code.len()); + manifest["files"]["adapter.py"]["sha256"] = + serde_json::json!(format!("{:x}", Sha256::digest(code.as_bytes()))); + std::fs::write(&provider.manifest, serde_json::to_vec(&manifest).unwrap()).unwrap(); + let mut revision = set(&provider); + for member in &mut revision.members { + member.spec.constructor.max_steps = 64; + member.spec.future.requested_steps = 64; + member.spec.future.recording.max_records = 65; + member.spec = crate::run_sets::configured::FrozenConfiguredSpec::new( + member.spec.constructor.clone(), + member.spec.future.clone(), + ) + .unwrap(); + } + revision.validate().unwrap(); + let output = Output::new(); + let mut application = app(&output); + launch(&mut application, revision, &root.join("set")); + let completed = finish(&mut application); + std::fs::write(root.join("manifest-path.txt"), &application.run_sets.path).unwrap(); + assert_eq!(completed.members.len(), 2); + drop(application); + std::fs::remove_file(provider.root.join("first-request-observed")).unwrap(); + std::fs::write( + provider.root.join("slow"), + b"bounded native interaction delay", + ) + .unwrap(); + // The external native procedure owns this retained disposable root and its + // eventual cleanup; the provider must remain available for the live rerun. + std::mem::forget(provider); + println!("NATIVE_WORKFLOW_FIXTURE_READY {}", root.display()); +} + +#[test] +fn interval_replacement_preserves_node_focus_pan_zoom_and_text_loop_equivalence() { + let mut h = Harness::new(); + h.frame(vec![]); + h.frame(vec![]); + h.click("node-2"); + h.view.zoom = 1.1; + h.view.pan = egui::vec2(-30.0, -30.0); + let focused = h.context.memory(|memory| memory.focused()); + let mut next = (*fixture()).clone(); + next.attempt_id = 8; + next.accepted_generation = 1; + next.attempted_generation = 2; + next.publication = Some(2); + next.interval_start = 0.0625; + h.view.set_attempt(Arc::new(next)); + h.frame(vec![]); + assert_eq!(h.view.selected, 2); + assert_eq!(h.view.zoom, 1.1); + assert_eq!(h.view.pan, egui::vec2(-30.0, -30.0)); + assert_eq!(h.context.memory(|memory| memory.focused()), focused); + h.key(egui::Key::ArrowRight); + assert_eq!(h.view.selected, 3); + h.view.pan = egui::vec2(-30.0, -280.0); + let output = h.frame(vec![]); + assert!(contains(&output, "pressure iteration loop")); + h.click("reset"); + assert_eq!(h.view.zoom, 0.85); + assert_eq!(h.view.pan, egui::Vec2::ZERO); + h.click("node-2"); + h.key(egui::Key::ArrowRight); + assert_eq!(h.view.selected, 3); +} + +#[test] +fn existing_carrier_and_material_archives_remain_selectable_with_workflow_unavailable() { + use rheon::*; + let root = crate::configured_worker_tests::Output::new(); + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let carrier = Simulation::new( + grid.clone(), + SimulationConfig { + density: 2.0, + memory_limit: 4 * 1024 * 1024, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 100, + }, + actual_divergence_limit: 1e-5, + max_courant: 0.5, + }, + ) + .unwrap(); + let material = ParticleFluidSimulation::new( + grid, + ParticleFluidConfig { + fill: DomainFill::EmittedFluid, + samples_per_axis: 4, + max_particles: 64, + ..Default::default() + }, + ) + .unwrap(); + for (name, is_material) in [("carrier", false), ("material", true)] { + let inspector = Inspector::default(); + let path = root.0.join(format!("{name}.sqlite")); + let writer = if is_material { + inspector + .begin( + &material, + &path, + rheon::recording::RecordingLimits::default(), + ) + .unwrap() + } else { + inspector + .begin_carrier( + &carrier, + &path, + rheon::recording::RecordingLimits::default(), + ) + .unwrap() + }; + drop(writer); + inspector.select_timestep(0).unwrap(); + let mut view = WorkflowInspector::default(); + view.select(Some(&inspector)); + assert!(view.attempt.is_none()); + assert!(view.source.is_some()); + assert!(view.message.contains("legacy archive")); + } +} + +#[test] +#[ignore = "release-only frozen G1 capture plus cached native projection protocol"] +fn paired_capture_and_cached_projection_overhead_protocol() { + use rheon::*; + use std::time::Instant; + assert!( + !std::hint::black_box(cfg!(debug_assertions)), + "run optimized release protocol" + ); + const CAP: usize = 16 * 1024 * 1024; + let make = |run_id| { + let grid = GridGeometry::new([16; 3], [1.0 / 16.0; 3], [0.0; 3]).unwrap(); + let session = SimulationSession::new( + SessionIdentity { + run_id, + source_revision: "g1-fixed-overhead-fixture".into(), + }, + grid.clone(), + LiquidTransportConfig { + carrier: SimulationConfig { + density: 998.2, + memory_limit: CAP, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 2000, + }, + actual_divergence_limit: 1e-5, + max_courant: 1.0, + }, + represented_density: 998.2, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + }, + PressureImplementation::JacobiPcgV1, + vec![0.5; 16usize.pow(3)], + CAP, + 1000, + ) + .unwrap(); + let workspace = + ProviderStepWorkspace::new(&grid, 998.2, CAP, PressureImplementation::JacobiPcgV1) + .unwrap(); + (session, workspace) + }; + let (mut baseline, mut bw) = make(100); + let (mut observed, mut ow) = make(101); + let force = [BodyForce { + value: [0.001, 0.0, 0.0], + units: ForceUnits::Acceleration, + region: None, + }]; + let inputs = || LiquidStepInputs { + requested_dt: 0.001, + smoke_source: None, + forces: &force, + source: None, + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]).unwrap(), + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + }; + let state_bits = |session: &SimulationSession| { + let snapshot = session.snapshot(); + let state = snapshot.state(); + let mut bits = vec![ + state.carrier.generation, + state.carrier.time.to_bits(), + state.liquid.time.to_bits(), + state.liquid.density.to_bits(), + state.carrier_stamp.id, + state.carrier_stamp.version, + state.liquid.stamp.id, + state.liquid.stamp.version, + ]; + for field in [ + state.carrier.x, + state.carrier.y, + state.carrier.z, + state.carrier.tracer, + ] { + bits.extend(field.iter().map(|v| v.to_bits() as u64)); + } + for field in [state.pressure, state.liquid.fraction] { + bits.extend(field.iter().map(|v| v.to_bits())); + } + bits + }; + let mut view = WorkflowInspector::default(); + let mut pairs = Vec::new(); + for interval in 0..35u64 { + let mut ns = [0u128; 2]; + for mode in if interval % 2 == 0 { [0, 1] } else { [1, 0] } { + let start = Instant::now(); + if mode == 0 { + baseline + .step_with_pressure_provider(inputs(), &mut bw, None, None, |_| false) + .unwrap(); + } else { + let mut evidence = None; + observed + .step_with_configured_pressure_observed( + inputs(), + &mut ow, + None, + None, + None, + |_| false, + interval + 1, + &mut evidence, + ) + .unwrap(); + view.set_attempt(evidence.unwrap()); + assert!(view.attempt.is_some()); + } + ns[mode] = start.elapsed().as_nanos(); + } + assert_eq!(state_bits(&baseline), state_bits(&observed)); + if interval >= 5 { + pairs.push(ns); + } + } + let mut ratios: Vec<_> = pairs + .iter() + .map(|pair| pair[1] as f64 / pair[0] as f64 - 1.0) + .collect(); + ratios.sort_by(f64::total_cmp); + let median = (ratios[14] + ratios[15]) * 0.5; + println!("G1_CAPTURE_AND_CACHED_PROJECTION_PAIRED_NS={pairs:?}"); + println!("G1_MEDIAN_CAPTURE_AND_CACHED_PROJECTION_OVERHEAD={median:.8}"); + println!( + "SCOPE=actual capture plus cached native WorkflowInspector::set_attempt; excludes disk I/O and rasterization" + ); + assert!( + median <= 0.05, + "fixed <=5% capture+projection gate failed; retain paired evidence and investigate" + ); +} + +#[test] +fn ordered_text_focus_uses_stable_node_ids_and_canvas_controls_accept_pointer_events() { + let mut h = Harness::new(); + h.frame(vec![]); + h.frame(vec![]); + let zoom = h.view.controls["zoom"]; + h.at(egui::pos2(zoom.left() + 25.0, zoom.center().y)); + assert_ne!(h.view.zoom, 0.85); + let rect = h.view.controls["canvas"]; + let start = rect.left_bottom() + egui::vec2(18.0, -18.0); + let end = start + egui::vec2(25.0, -70.0); + h.frame(vec![ + egui::Event::PointerMoved(start), + egui::Event::PointerButton { + pos: start, + button: egui::PointerButton::Primary, + pressed: true, + modifiers: Default::default(), + }, + ]); + h.frame(vec![egui::Event::PointerMoved(end)]); + h.frame(vec![egui::Event::PointerButton { + pos: end, + button: egui::PointerButton::Primary, + pressed: false, + modifiers: Default::default(), + }]); + assert_ne!(h.view.pan, egui::Vec2::ZERO); + h.click("reset"); + assert_eq!(h.view.pan, egui::Vec2::ZERO); + assert_eq!(h.view.zoom, 0.85); + // The same restoration transition used by keyboard navigation scrolls the + // complete text list into view before actual pointer activation. + h.view.focus_text = true; + h.view.restore_focus = true; + h.view.selected = 2; + h.frame(vec![]); + h.frame(vec![]); + h.frame(vec![]); + h.click("text-2"); + assert!(h.view.focus_text); + h.key(egui::Key::ArrowRight); + assert_eq!(h.view.selected, 3); + h.frame(vec![]); + h.key(egui::Key::End); + assert_eq!( + h.view.attempt.as_ref().unwrap().descriptor.nodes()[h.view.selected], + NodeKind::Publication + ); + assert!(h.view.focus_text); +} + +#[test] +fn verified_comparison_sides_load_exact_workflows_and_pair_or_source_changes_clear_them() { + use crate::{ + comparison_archive::{SavedRecipe, Side}, + configured_worker_tests::{Output, app, finish, launch, package, set}, + run_sets::source::SavedRunSet, + saved_comparison::*, + }; + use rheon::recording::comparison::{FieldRole, PressurePolicy, Recipe}; + let output = Output::new(); + let provider = package(false, "bad_once"); + let mut application = app(&output); + let root = output.0.join("comparison-workflow"); + launch(&mut application, set(&provider), &root); + let revision = finish(&mut application); + drop(application); + drop(provider); + let recipe = SavedRecipe::capture_source( + &root, + SavedRunSet::Configured(revision.clone()), + "native", + "configured", + &[2, 3], + &[2, 3], + Recipe { + field: FieldRole::IntervalPressure, + time_tolerance: 0.0, + pressure: PressurePolicy::Canonical, + }, + ) + .unwrap(); + recipe.save_new(&root.join("comparison.json")).unwrap(); + let mut page = SavedComparisonPage::default(); + page.set_location(root.to_string_lossy(), "ignored-manifest.json"); + page.open_saved_recipe(); + page.compute(); + assert_eq!( + page.presentation(), + Presentation::Verified, + "{}", + page.message() + ); + let mut view = WorkflowInspector::default(); + let mut run_ids = Vec::new(); + for side in [Side::Reference, Side::Candidate] { + view.terminal_request = true; + view.load_comparison(page.load_selected_workflow(side)); + assert!(!view.terminal_request); + assert!(view.comparison_context); + let key = page.workflow_key(side).unwrap(); + view.validate_comparison(Some(&key)); + let attempt = view.attempt.as_ref().unwrap(); + assert_eq!(attempt.publication, Some(2)); + run_ids.push(attempt.run_id); + } + assert_ne!(run_ids[0], run_ids[1]); + let ctx = egui::Context::default(); + let mut frame = |events| { + ctx.run( + egui::RawInput { + screen_rect: Some(egui::Rect::from_min_size( + egui::Pos2::ZERO, + egui::vec2(1800.0, 2600.0), + )), + events, + ..Default::default() + }, + |ctx| { + egui::CentralPanel::default().show(ctx, |ui| page.show(ui)); + }, + ) + }; + frame(vec![]); + frame(vec![]); + let rect = page.control_rect("matched-pair").unwrap(); + let pos = egui::pos2(rect.left() + 95.0, rect.center().y); + let mut frame = |events| { + ctx.run( + egui::RawInput { + screen_rect: Some(egui::Rect::from_min_size( + egui::Pos2::ZERO, + egui::vec2(1800.0, 2600.0), + )), + events, + ..Default::default() + }, + |ctx| { + egui::CentralPanel::default().show(ctx, |ui| page.show(ui)); + }, + ) + }; + frame(vec![ + egui::Event::PointerMoved(pos), + egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed: true, + modifiers: Default::default(), + }, + ]); + frame(vec![egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed: false, + modifiers: Default::default(), + }]); + frame(vec![egui::Event::Key { + key: egui::Key::ArrowRight, + physical_key: None, + pressed: true, + repeat: false, + modifiers: Default::default(), + }]); + assert_eq!(page.selected_pair().unwrap().pair.candidate.ordinal, 3); + let key = page.workflow_key(Side::Candidate); + view.validate_comparison(key.as_ref()); + assert!(view.attempt.is_none()); + assert!(!view.evidence); + view.load_comparison(page.load_selected_workflow(Side::Candidate)); + assert_eq!(view.attempt.as_ref().unwrap().publication, Some(3)); + page.set_location(root.join("new-namespace").to_string_lossy(), "missing.json"); + view.validate_comparison(page.workflow_key(Side::Candidate).as_ref()); + assert!(view.attempt.is_none()); + page.set_location(root.to_string_lossy(), "ignored.json"); + page.open_saved_recipe(); + page.compute(); + let archive = root.join( + &revision.members[1] + .attempt + .as_ref() + .unwrap() + .archive_relative_path, + ); + std::fs::rename(&archive, archive.with_extension("unavailable")).unwrap(); + view.load_comparison(page.load_selected_workflow(Side::Candidate)); + assert!(view.attempt.is_none()); + assert!(view.message.contains("Invalid or unavailable")); +} + +#[test] +fn generation_zero_cancelled_terminal_loads_via_native_action_without_an_accepted_row() { + use rheon::recording::{ + RecordingLimits, StepRecorder, + provider::{configured_run, runtime::RuntimeTerminationCause}, + workflow::WorkflowTermination, + }; + let output = crate::configured_worker_tests::Output::new(); + let path = output.0.join("zero.sqlite"); + let (attempt, session) = observed_fixture(true); + let run = configured_run( + &session.snapshot(), + "actual generation-zero cancelled workflow fixture", + ) + .unwrap(); + let mut writer = StepRecorder::create(&path, run, RecordingLimits::default()).unwrap(); + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Cancelled, + "actual cancellation before numerical publication", + None, + Some(&attempt), + ) + .unwrap() + .finish(&mut writer) + .unwrap(); + assert_eq!(writer.recorded_count(), 0); + drop(writer); + drop(session); + let inspector = Inspector::default(); + inspector.reload(&path, RecordingLimits::default()).unwrap(); + let mut h = Harness::new(); + h.view.select(Some(&inspector)); + h.frame(vec![]); + h.frame(vec![]); + h.click("terminal"); + assert!(h.view.terminal_request); + h.view.select(Some(&inspector)); + let selected = h.view.attempt.as_ref().unwrap(); + assert_eq!(selected.accepted_generation, 0); + assert_eq!(selected.attempted_generation, 1); + assert!(selected.publication.is_none()); + assert_eq!(selected.outcome, rheon::workflow::AttemptOutcome::Cancelled); + h.frame(vec![]); + assert!(contains(&h.frame(vec![]), "Cancelled")); + h.view.select(Some(&inspector)); + assert!(h.view.terminal_mode); + assert!(h.view.attempt.is_some()); +} + +#[test] +fn cold_sized_end_and_coalesced_pointer_key_keep_selection_after_idle_frames() { + let size = egui::vec2(1600.0, 1000.0); + let render = |h: &mut Harness, events| { + h.time += 0.016; + h.context.run( + egui::RawInput { + time: Some(h.time), + screen_rect: Some(egui::Rect::from_min_size(egui::Pos2::ZERO, size)), + events, + ..Default::default() + }, + |ctx| { + egui::TopBottomPanel::top("archive-navigation-fixture") + .exact_height(134.0) + .show(ctx, |ui| { + ui.label("Exact recorded ordinal 2"); + }); + h.view.show(ctx); + }, + ) + }; + for coalesced in [false, true] { + let mut h = Harness::new(); + for _ in 0..5 { + render(&mut h, vec![]); + } + render( + &mut h, + vec![egui::Event::PointerMoved(egui::pos2(87.0, 990.0))], + ); + let pan_before = h.view.pan; + let pos = h.view.controls["node-1"].center(); + render( + &mut h, + vec![ + egui::Event::PointerMoved(pos), + egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed: true, + modifiers: Default::default(), + }, + ], + ); + assert_eq!( + h.view.pan, pan_before, + "node pointer press must not start background pan" + ); + let release = egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed: false, + modifiers: Default::default(), + }; + let end = egui::Event::Key { + key: egui::Key::End, + physical_key: None, + pressed: true, + repeat: false, + modifiers: Default::default(), + }; + if coalesced { + render(&mut h, vec![release, end]); + } else { + render(&mut h, vec![release]); + for _ in 0..2 { + render(&mut h, vec![]); + } + assert_eq!(h.view.selected, 1); + render(&mut h, vec![end]); + } + render( + &mut h, + vec![egui::Event::Key { + key: egui::Key::End, + physical_key: None, + pressed: false, + repeat: false, + modifiers: Default::default(), + }], + ); + for _ in 0..6 { + render(&mut h, vec![]); + } + assert_eq!( + h.view.attempt.as_ref().unwrap().descriptor.nodes()[h.view.selected], + NodeKind::Publication, + "coalesced={coalesced}" + ); + for _ in 0..4 { + for pressed in [true, false] { + render( + &mut h, + vec![egui::Event::Key { + key: egui::Key::ArrowLeft, + physical_key: None, + pressed, + repeat: false, + modifiers: Default::default(), + }], + ); + } + for _ in 0..3 { + render(&mut h, vec![]); + } + } + assert_eq!( + h.view.attempt.as_ref().unwrap().descriptor.nodes()[h.view.selected], + NodeKind::NativeFallback, + "coalesced={coalesced}" + ); + } +} + +#[test] +fn only_background_press_owns_pan_and_prepress_motion_is_excluded() { + let mut h = Harness::new(); + for _ in 0..4 { + h.frame(vec![]); + } + let button = |pos, pressed| egui::Event::PointerButton { + pos, + button: egui::PointerButton::Primary, + pressed, + modifiers: Default::default(), + }; + let outside = egui::pos2(5.0, 1190.0); + h.frame(vec![egui::Event::PointerMoved(outside)]); + let node = h.view.controls["node-1"].center(); + let before = h.view.pan; + h.frame(vec![egui::Event::PointerMoved(node), button(node, true)]); + assert_eq!( + h.view.pan, before, + "moving onto a node before its press is not a background gesture" + ); + let moved = node + egui::vec2(40.0, 30.0); + h.frame(vec![egui::Event::PointerMoved(moved)]); + assert_eq!( + h.view.pan, before, + "a node-origin held motion cannot steal background panning" + ); + h.frame(vec![button(moved, false)]); + let canvas = h.view.controls["canvas"]; + let background = egui::pos2(canvas.right() - 25.0, canvas.top() + 25.0); + h.frame(vec![egui::Event::PointerMoved(outside)]); + h.frame(vec![ + egui::Event::PointerMoved(background), + button(background, true), + ]); + assert_eq!( + h.view.pan, before, + "background press ignores preceding outside-pointer relocation" + ); + let delta = egui::vec2(-40.0, 30.0); + h.frame(vec![egui::Event::PointerMoved(background + delta)]); + assert_eq!( + h.view.pan, + before + delta, + "held background movement still pans by its actual displacement" + ); + h.frame(vec![button(background + delta, false)]); + h.frame(vec![egui::Event::PointerMoved(outside)]); + assert_eq!( + h.view.pan, + before + delta, + "released drag has no continuing ownership" + ); + h.view.open(); + assert!(h.view.pan_drag.is_none()); + assert_eq!( + h.view.pan, + before + delta, + "reopening preserves the view without a stale drag" + ); +} + +#[test] +fn advection_cancel_native_live_and_cold_consumer_distinguishes_numerical_failure() { + use rheon::recording::{ + RecordingLimits, StepRecorder, + provider::{configured_run, runtime::RuntimeTerminationCause}, + workflow::WorkflowTermination, + }; + use rheon::{LiquidStepStage, StepStage, workflow::AttemptOutcome}; + let output = crate::configured_worker_tests::Output::new(); + for (name, checkpoint, cap, outcome, cause) in [ + ( + "velocity", + Some(StepStage::VelocitySlice), + 100, + AttemptOutcome::Cancelled, + RuntimeTerminationCause::Cancelled, + ), + ( + "tracer", + Some(StepStage::TracerSlice), + 100, + AttemptOutcome::Cancelled, + RuntimeTerminationCause::Cancelled, + ), + ( + "pressure-failure", + None, + 0, + AttemptOutcome::Failed, + RuntimeTerminationCause::NumericalFailure, + ), + ] { + let (attempt, session, error) = observed_fixture_with(cap, |stage| { + checkpoint.is_some_and(|target| stage == LiquidStepStage::Carrier(target)) + }); + let error = error.expect("actual unpublished error"); + if checkpoint.is_some() { + assert!( + matches!( + error, + rheon::SessionError::Step(rheon::LiquidStepError::Carrier( + rheon::SimulationError::Advection(rheon::AdvectionError::Cancelled) + )) + ), + "{error:?}" + ); + } else { + assert!( + matches!( + error, + rheon::SessionError::Step(rheon::LiquidStepError::Carrier( + rheon::SimulationError::Pressure(rheon::PressureError::IterationLimit { + iterations: 0, + .. + }) + )) + ), + "{error:?}" + ); + } + assert_eq!(attempt.outcome, outcome); + assert_eq!(attempt.publication, None); + let label = format!("{outcome:?}"); + let mut h = Harness::new(); + h.view.set_attempt(attempt.clone()); + h.frame(vec![]); + assert!(contains(&h.frame(vec![]), &label)); + let path = output.0.join(format!("advection-{name}.sqlite")); + let run = + configured_run(&session.snapshot(), "actual cancellation/failure consumer").unwrap(); + let mut writer = StepRecorder::create(&path, run, RecordingLimits::default()).unwrap(); + WorkflowTermination::capture( + &session.snapshot(), + cause, + "actual terminal", + None, + Some(&attempt), + ) + .unwrap() + .finish(&mut writer) + .unwrap(); + assert_eq!(writer.recorded_count(), 0); + drop(writer); + drop(session); + drop(attempt); + let inspector = Inspector::default(); + inspector.reload(&path, RecordingLimits::default()).unwrap(); + h.view.select(Some(&inspector)); + h.click("terminal"); + h.view.select(Some(&inspector)); + let selected = h.view.attempt.as_ref().unwrap(); + assert_eq!(selected.outcome, outcome); + assert_eq!(selected.publication, None); + h.frame(vec![]); + assert!(contains(&h.frame(vec![]), &label)); + } +} diff --git a/src/bin/rheon-desktop.rs b/src/bin/rheon-desktop.rs index 2d8bc9e0..7f912d72 100644 --- a/src/bin/rheon-desktop.rs +++ b/src/bin/rheon-desktop.rs @@ -84,6 +84,8 @@ mod timeline_ui_tests; mod transport_view; #[path = "desktop/viewport.rs"] mod viewport; +#[path = "desktop/workflow_inspector.rs"] +mod workflow_inspector; use eframe::egui; use history::{LiveHistory, PreviewFrame}; use rheon::{ @@ -616,7 +618,7 @@ fn run_simulations( } .map_err(|e| format!("Carrier recording start at {} failed: {e}", path.display()))? }; - use rheon::recording::provider::runtime::{RuntimeTermination, RuntimeTerminationCause}; + use rheon::recording::provider::runtime::RuntimeTerminationCause; let mut termination_cause = RuntimeTerminationCause::StorageFailure; let result: Result<(), String> = (|| { if let Some(configured) = sim.configured() { @@ -775,11 +777,12 @@ fn run_simulations( ), }; let terminal = if let Some(configured) = sim.configured() { - RuntimeTermination::capture( + rheon::recording::workflow::WorkflowTermination::capture( &configured.snapshot(), termination_cause, &accepted_session::recording_detail(&detail), configured.runtime_observation(), + configured.workflow_attempt(), ) .and_then(|termination| termination.finish(&mut recorder)) } else { @@ -1415,6 +1418,7 @@ struct App { configured_controls: configured_controls::ConfiguredControls, saved_comparison: saved_comparison::SavedComparisonPage, saved_comparison_active: bool, + workflow: workflow_inspector::WorkflowInspector, comparison_fields: comparison_field_view::ComparisonFieldView, collision: collision_ui::CollisionControls, selected: PressureImplementation, @@ -1470,6 +1474,7 @@ impl Default for App { configured_controls: Default::default(), saved_comparison: saved_comparison::SavedComparisonPage::default(), saved_comparison_active: false, + workflow: Default::default(), comparison_fields: Default::default(), collision: collision_ui::CollisionControls::default(), selected: PressureImplementation::default(), @@ -1538,6 +1543,10 @@ impl App { }, ); self.run_sets.controls(ui, self.worker.is_none()); + let workflow = ui.button("Inspect executed workflow"); + if workflow.clicked() { + self.workflow.open_from(workflow.id); + } if ui .add_enabled( self.worker.is_none(), @@ -1707,6 +1716,25 @@ impl App { self.track = 0; self.follow_live = true; } + fn workflow_window(&mut self, ctx: &egui::Context) { + let inspector = if self.archive.active { + Some(&self.archive.inspector) + } else { + self.history.as_ref().and_then(|history| { + if self + .running_request + .as_ref() + .is_some_and(|r| r.material.is_none()) + { + history.carrier_inspectors.get(self.track) + } else { + Some(&history.inspector) + } + }) + }; + self.workflow.select(inspector); + self.workflow.show(ctx); + } fn refresh_threads(&mut self, available: usize) { self.thread_limit = available.max(1); self.threads = if self.automatic_threads { @@ -2588,10 +2616,31 @@ impl eframe::App for App { ctx.send_viewport_cmd(egui::ViewportCommand::Close); } if self.saved_comparison_active { + let mut workflow_action = None; egui::TopBottomPanel::top("comparison-navigation").show(ctx, |ui| { if ui.button("Back to simulation").clicked() { self.saved_comparison_active = false; } + ui.horizontal(|ui| { + for (side, label) in [ + ( + comparison_archive::Side::Reference, + "Inspect reference workflow", + ), + ( + comparison_archive::Side::Candidate, + "Inspect candidate workflow", + ), + ] { + let response = ui.add_enabled( + self.saved_comparison.selected_pair().is_some(), + egui::Button::new(label), + ); + if response.clicked() { + workflow_action = Some((side, response.id)); + } + } + }); }); egui::CentralPanel::default().show(ctx, |ui| { egui::ScrollArea::vertical() @@ -2602,6 +2651,17 @@ impl eframe::App for App { .show(ui, self.saved_comparison.selected_pair()); }); }); + if let Some((side, trigger)) = workflow_action { + let loaded = self.saved_comparison.load_selected_workflow(side); + self.workflow.load_comparison(loaded); + self.workflow.open_from(trigger); + } + let key = self + .workflow + .comparison_side() + .and_then(|side| self.saved_comparison.workflow_key(side)); + self.workflow.validate_comparison(key.as_ref()); + self.workflow.show(ctx); return; } if self.run_sets.active { @@ -2633,7 +2693,14 @@ impl eframe::App for App { return; } if self.archive.active { + egui::TopBottomPanel::bottom("archive-workflow-action").show(ctx, |ui| { + let workflow = ui.button("Inspect executed workflow"); + if workflow.clicked() { + self.workflow.open_from(workflow.id); + } + }); self.archive.show(ctx); + self.workflow_window(ctx); return; } if self.scene.context == scene_ui::SceneContext::Draft { @@ -2743,6 +2810,7 @@ impl eframe::App for App { }, ) }); + self.workflow_window(ctx); if self.worker.is_some() || self.playing { ctx.request_repaint_after(Duration::from_millis(16)); } diff --git a/src/lib.rs b/src/lib.rs index 7aac4f09..23e984b8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,7 +54,9 @@ pub use tracer_barrier::{ BarrierStepReport, TracerBarrierError, TracerBarrierReport, TracerBarrierSampler, VisibleTracerSample, advect_tracer_with_barrier, }; +pub mod native_family; mod simulation; +pub mod workflow; pub use simulation::{ AcceptedForceIntervalPressure, AcceptedIntervalPressure, CarrierStepControls, Simulation, SimulationConfig, SimulationError, SmokeSource, StateView, StepReport, StepStage, @@ -212,6 +214,9 @@ pub use vtk_export::{ mod provider_step; pub use provider_step::{ProviderStepReport, ProviderStepWorkspace}; +/// Closed native projection invocation and accepted Session evidence. +pub mod projection_step; + mod emitter_controls; pub use emitter_controls::{EMITTER_CONTROLS_VERSION, EmitterTurbulence}; diff --git a/src/liquid_step.rs b/src/liquid_step.rs index 3c029972..354debeb 100644 --- a/src/liquid_step.rs +++ b/src/liquid_step.rs @@ -485,7 +485,7 @@ impl LiquidTransportSimulation { inputs: LiquidStepInputs<'_>, cancel: impl FnMut(LiquidStepStage) -> bool, ) -> Result { - self.step_impl(inputs, None, None, None, cancel) + self.step_impl(inputs, None, None, None, None, cancel) .map(|(report, _, _)| report) } /// End-of-step prescribed carrier box flux and explicit liquid inflow donors. @@ -496,8 +496,15 @@ impl LiquidTransportSimulation { boundary: BoxFluxStepBoundary, cancel: impl FnMut(LiquidStepStage) -> bool, ) -> Result { - self.step_impl(inputs, Some((workspace, boundary)), None, None, cancel) - .map(|(report, _, _)| report) + self.step_impl( + inputs, + Some((workspace, boundary)), + None, + None, + None, + cancel, + ) + .map(|(report, _, _)| report) } fn validate_viscous_domain( &self, @@ -531,6 +538,7 @@ impl LiquidTransportSimulation { None, Some((workspace, dynamic_viscosity)), None, + None, cancel, ) .map(|(report, _, _)| report) @@ -552,6 +560,7 @@ impl LiquidTransportSimulation { preferred, configured: None, }), + None, cancel, )?; Ok(( @@ -559,6 +568,12 @@ impl LiquidTransportSimulation { provider.expect("provider path qualified before commit"), )) } + pub(crate) fn workflow_descriptor( + &self, + viscosity: Option, + ) -> crate::workflow::WorkflowDescriptor { + self.carrier.workflow_descriptor(viscosity) + } pub(crate) fn step_with_configured_pressure( &mut self, inputs: LiquidStepInputs<'_>, @@ -579,6 +594,7 @@ impl LiquidTransportSimulation { preferred: None, configured: Some(configured), }), + None, cancel, )?; Ok(( @@ -586,12 +602,26 @@ impl LiquidTransportSimulation { configured.expect("configured receipt prepared before commit"), )) } + pub(crate) fn step_with_native_projection( + &mut self, + inputs: LiquidStepInputs<'_>, + projection: crate::projection_step::ProjectionStepInput<'_>, + cancel: impl FnMut(LiquidStepStage) -> bool, + ) -> Result<(LiquidStepReport, crate::solver_provider::ProviderReport), LiquidStepError> { + let (report, provider, _) = + self.step_impl(inputs, None, None, None, Some(projection), cancel)?; + Ok(( + report, + provider.expect("native projection selected before commit"), + )) + } fn step_impl( &mut self, inputs: LiquidStepInputs<'_>, mut boundary: Option<(&mut BoxFluxStepWorkspace, BoxFluxStepBoundary)>, viscosity: Option<(&mut crate::ViscosityWorkspace, f64)>, provider: Option>, + mut projection: Option>, mut cancel: impl FnMut(LiquidStepStage) -> bool, ) -> Result< ( @@ -601,6 +631,10 @@ impl LiquidTransportSimulation { ), LiquidStepError, > { + if let Some(input) = projection.as_mut() { + input.capture.stage = + crate::projection_step::ProjectionAttemptStage::CarrierPreparation; + } let (mut provider_workspace, mut preferred, configured) = match provider { Some(provider) => ( Some(provider.workspace), @@ -609,7 +643,7 @@ impl LiquidTransportSimulation { ), None => (None, None, None), }; - if provider_workspace.is_some() + if (provider_workspace.is_some() || projection.is_some()) && (self.surface.is_some() || self.columns.is_some() || self.flat_column_mac) { return Err(SimulationError::UnsupportedProviderDomain.into()); @@ -657,13 +691,22 @@ impl LiquidTransportSimulation { let viscosity_bytes = viscosity.as_ref().map_or(0, |(w, _)| w.allocated_bytes()); let provider_bytes = provider_workspace .as_ref() - .map_or(0, |w| w.allocated_bytes()); + .map_or(0, |w| w.allocated_bytes()) + .checked_add( + projection + .as_ref() + .map_or(0, |p| p.workspace.allocated_bytes()), + ) + .ok_or(LiquidStepError::AllocationFailed)?; let total_bytes = self .allocated_bytes .checked_add(boundary_bytes) .and_then(|n| n.checked_add(viscosity_bytes)) .and_then(|n| n.checked_add(provider_bytes)) .ok_or(LiquidStepError::AllocationFailed)?; + let workflow = configured + .as_ref() + .map(|configured| configured.workflow.clone()); let mut context_adapter = configured.map(|configured| { ContextAdapter::new(configured, &self.pressure, self.carrier.grid().counts()) }); @@ -678,6 +721,10 @@ impl LiquidTransportSimulation { &mut **provider as &mut dyn crate::solver_provider::PressureProvider }) }; + if let Some(input) = projection.as_mut() { + input.capture.stage = + crate::projection_step::ProjectionAttemptStage::CarrierPreparation; + } let candidate = self.carrier.prepare_liquid_carrier( inputs.requested_dt, inputs.smoke_source, @@ -698,11 +745,22 @@ impl LiquidTransportSimulation { preferred, } }), + workflow.as_deref(), + projection + .as_mut() + .map(|p| crate::projection_step::ProjectionStepInput { + workspace: &mut *p.workspace, + capture: &mut *p.capture, + source: p.source, + configuration: p.configuration, + control: p.control, + }), |stage| cancel(LiquidStepStage::Carrier(stage)), )?; // Capture only bounded metadata before final publication. No prior // pressure copy is added: the adapter borrows this owner's accepted array. - let configured_report = context_adapter.map(|adapter| ConfiguredProviderReport { + let mut configured_report = context_adapter.map(|adapter| ConfiguredProviderReport { + workflow: None, dynamic_viscosity: candidate.viscosity.map_or(0.0, |v| v.dynamic_viscosity), binding: adapter.binding, context: adapter.stamp.get(), @@ -730,6 +788,9 @@ impl LiquidTransportSimulation { if let Some(surface) = &self.columns { flow = flow.on_columns(surface.state()); } + if let Some(input) = projection.as_mut() { + input.capture.stage = crate::projection_step::ProjectionAttemptStage::VolumeTransport; + } let mut liquid = self.liquid.prepare_advance( flow, inputs.inlet, @@ -757,16 +818,60 @@ impl LiquidTransportSimulation { } else { None }; + crate::workflow::complete( + workflow.as_deref(), + crate::workflow::NodeKind::VolumeTransport, + crate::workflow::NodeStatus::Completed, + ); + if let Some(input) = projection.as_mut() { + input.capture.stage = crate::projection_step::ProjectionAttemptStage::BeforeCommit; + } if cancel(LiquidStepStage::BeforeCommit) { return Err(LiquidStepError::Cancelled); } + if let (Some(trace), Some(report)) = (workflow.as_deref(), configured_report.as_mut()) { + report.workflow = Some(crate::workflow::accepted(trace)); + } + if let Some(input) = projection.as_mut() { + let density = self.liquid.state().density; + let prospective = LiquidTransportView { + carrier: self.carrier.candidate_state(step), + liquid: LiquidVolumeView { + fraction: self.liquid.candidate_fraction_mut(), + stamp: liquid.stamp, + time: liquid.time, + density, + }, + pressure: input.workspace.pressure(), + carrier_stamp: VolumeStamp { + id: self.carrier_id, + version: step.generation, + }, + pressure_surface: None, + reconstructed_surface: None, + pressure_columns: None, + flat_column_mac: false, + }; + #[cfg(test)] + let _alias = input + .workspace + .alias_before_seal() + .then(|| input.capture.attempt.clone()); + input + .capture + .seal(prospective, input.configuration, self.carrier.grid())?; + } // All sizes, times, versions and numeric gates have already passed. // Pressure copy and owner swaps are infallible and invoke no callbacks. - let pressure = match &boundary { - Some((w, _)) => w.projection.pressure(), - None => provider_workspace - .as_ref() - .map_or_else(|| self.carrier.candidate_pressure(), |w| w.pressure()), + let pressure = if let Some(input) = projection.as_ref() { + input.workspace.pressure() + } else { + match &boundary { + Some((w, _)) => w.projection.pressure(), + None => provider_workspace + .as_ref() + .map_or_else(|| self.carrier.candidate_pressure(), |w| w.pressure()), + } }; self.pressure.copy_from_slice(pressure); self.carrier.commit_prepared(&candidate); diff --git a/src/liquid_volume.rs b/src/liquid_volume.rs index 1d8cfe9a..45f56476 100644 --- a/src/liquid_volume.rs +++ b/src/liquid_volume.rs @@ -30,6 +30,11 @@ pub enum LiquidVolumeError { InvalidInlet, InvalidSource, InvalidSettings, + UnsupportedPeriodicDomain, + PeriodicVelocityMismatch { + axis: Axis, + face: usize, + }, InvalidTimeStep, TimeResolution, TimeMismatch, @@ -185,6 +190,9 @@ pub struct LiquidVolumeSource<'a> { rate: &'a [f64], } impl<'a> LiquidVolumeSource<'a> { + pub(crate) fn workflow_parts(self) -> (VolumeStamp, &'a [f64]) { + (self.stamp, self.rate) + } pub fn new(stamp: VolumeStamp, rate: &'a [f64]) -> Result { if rate.iter().any(|v| !v.is_finite()) { return Err(LiquidVolumeError::InvalidSource); @@ -204,7 +212,10 @@ pub struct LiquidVolumeSettings { pub struct LiquidVolumeReport { pub stamp: VolumeStamp, pub flow: VolumeStamp, + /// Inlet identity for box transport; periodic boundary-policy identity when periodic=true. pub inlet: VolumeStamp, + /// Explicit represented-volume boundary version; false preserves the original box policy. + pub periodic: bool, pub source: Option, pub dt: f64, pub time: f64, @@ -236,6 +247,24 @@ pub struct LiquidVolumeView<'a> { pub density: f64, } +// Private topology selector keeps existing prepared-volume callers unchanged. +#[derive(Clone, Copy)] +enum VolumeBoundary { + Inlet(LiquidInlet), + Periodic(VolumeStamp), +} +impl VolumeBoundary { + fn stamp(self) -> VolumeStamp { + match self { + Self::Inlet(i) => i.stamp, + Self::Periodic(s) => s, + } + } + fn is_periodic(self) -> bool { + matches!(self, Self::Periodic(_)) + } +} + /// Accepted and candidate f64 fraction arrays plus three shared f64 face-transfer /// arrays. Actual owned Vec capacities are capped. Flow/source inputs, allocator /// overhead and RSS are excluded. Advance allocates no heap buffers. @@ -357,6 +386,29 @@ impl LiquidVolumeState { self.commit_prepared(&report); Ok(report) } + /// Periodic donor-cell represented-volume transport, boundary version 1. + /// Each opposite normal face must have equal f32 velocity. The lower seam + /// transfer is computed once and mirrored; external boundary ledgers are zero. + /// This volume-only policy does not qualify a periodic pressure/solid solver. + /// Slab/reconstructed domains refuse; accepted state is unchanged on failure. + pub fn advance_periodic( + &mut self, + flow: LiquidFlowInterval<'_>, + boundary_stamp: VolumeStamp, + source: Option>, + settings: LiquidVolumeSettings, + cancel: impl FnMut(VolumeStage) -> bool, + ) -> Result { + let report = self.prepare_with_boundary( + flow, + VolumeBoundary::Periodic(boundary_stamp), + source, + settings, + cancel, + )?; + self.commit_prepared(&report); + Ok(report) + } /// Atomically advance represented volume and its derived bounded column /// geometry under caller-supplied velocities. This does not qualify those /// velocities as a coupled pressure solve; use the facade for that contract. @@ -493,6 +545,16 @@ impl LiquidVolumeState { inlet: LiquidInlet, source: Option>, settings: LiquidVolumeSettings, + cancel: impl FnMut(VolumeStage) -> bool, + ) -> Result { + self.prepare_with_boundary(flow, VolumeBoundary::Inlet(inlet), source, settings, cancel) + } + fn prepare_with_boundary( + &mut self, + flow: LiquidFlowInterval<'_>, + boundary: VolumeBoundary, + source: Option>, + settings: LiquidVolumeSettings, mut cancel: impl FnMut(VolumeStage) -> bool, ) -> Result { if flow.grid != &self.grid { @@ -504,6 +566,37 @@ impl LiquidVolumeState { self.validate_advance(source, settings)?; let next = self.stamp.version + 1; checkpoint(&mut cancel, VolumeStage::BeforeFlux)?; + let periodic = boundary.is_periodic(); + if periodic { + if flow.domain != VolumeDivergenceDomain::AllCells || flow.columns.is_some() { + return Err(LiquidVolumeError::UnsupportedPeriodicDomain); + } + for axis in Axis::ALL { + let d = axis.index(); + let dims = self.grid.face_counts(axis); + for k in 0..dims[2] { + checkpoint(&mut cancel, VolumeStage::FaceFluxSlice)?; + for j in 0..dims[1] { + for i in 0..dims[0] { + let p = [i, j, k]; + if p[d] != 0 { + continue; + } + let mut hi = p; + hi[d] = self.grid.counts()[d]; + let low = self.grid.face_unchecked(axis, p); + let high = self.grid.face_unchecked(axis, hi); + if flow.velocity[d][low] != flow.velocity[d][high] { + return Err(LiquidVolumeError::PeriodicVelocityMismatch { + axis, + face: low, + }); + } + } + } + } + } + } let h = self.grid.spacing(); let area = [ product(h[1], h[2])?, @@ -519,10 +612,26 @@ impl LiquidVolumeState { for i in 0..dims[0] { let p = [i, j, k]; let face = self.grid.face_unchecked(axis, p); + if periodic && p[d] == self.grid.counts()[d] { + // Lexicographic axis coordinates visit the corresponding lower + // seam first, for X, Y and Z alike. Copy the exact same transfer. + let mut lo = p; + lo[d] = 0; + self.transfer[d][face] = + self.transfer[d][self.grid.face_unchecked(axis, lo)]; + continue; + } let velocity = f64::from(flow.velocity[d][face]); let donor = if velocity > 0.0 { if p[d] == 0 { - inlet.fraction[d][0] + match boundary { + VolumeBoundary::Inlet(inlet) => inlet.fraction[d][0], + VolumeBoundary::Periodic(_) => { + let mut low = p; + low[d] = self.grid.counts()[d] - 1; + self.accepted[self.grid.cell_unchecked(low)] + } + } } else { let mut low = p; low[d] -= 1; @@ -530,7 +639,12 @@ impl LiquidVolumeState { } } else if velocity < 0.0 { if p[d] == self.grid.counts()[d] { - inlet.fraction[d][1] + match boundary { + VolumeBoundary::Inlet(inlet) => inlet.fraction[d][1], + VolumeBoundary::Periodic(_) => { + return Err(LiquidVolumeError::ArithmeticFailure); + } + } } else { self.accepted[self.grid.cell_unchecked(p)] } @@ -646,7 +760,7 @@ impl LiquidVolumeState { for j in 0..dims[1] { for i in 0..dims[0] { let p = [i, j, k]; - if p[d] != 0 && p[d] != self.grid.counts()[d] { + if periodic || (p[d] != 0 && p[d] != self.grid.counts()[d]) { continue; } let value = self.transfer[d][self.grid.face_unchecked(axis, p)] @@ -720,7 +834,8 @@ impl LiquidVolumeState { version: next, }, flow: flow.stamp, - inlet: inlet.stamp, + inlet: boundary.stamp(), + periodic, source: source.map(|s| s.stamp), dt: flow.dt, time: flow.end, diff --git a/src/native_family.rs b/src/native_family.rs new file mode 100644 index 00000000..1cde736d --- /dev/null +++ b/src/native_family.rs @@ -0,0 +1,289 @@ +//! Borrowed dispatch to the existing MAC and particle-preview state owners. +//! The facade checks the requested family, caller-declared source and accepted +//! generation; the selected owner still owns all numerical validation, clocks, +//! quotas, cancellation and publication. It stores no state or snapshot history. +//! +//! Native snapshot borrows prevent stepping while their fields remain in use: +//! ```compile_fail +//! use rheon::native_family::{NativeSession, NativeStepRequest}; +//! fn advance_with_live_snapshot(mut session: NativeSession<'_>, request: NativeStepRequest<'_>) { +//! let snapshot = session.snapshot(); +//! let _ = session.step(request, |_| false); +//! drop(snapshot); +//! } +//! ``` + +use crate::{ + LiquidStepInputs, LiquidStepReport, LiquidStepStage, MaterialSession, MaterialSessionError, + MaterialSnapshot, MaterialStepControls, ParticleStepReport, ProviderStepWorkspace, + SessionError, SessionIdentity, SessionSnapshot, SimulationSession, + solver_provider::ProviderReport, +}; +use std::{fmt, time::Instant}; + +/// Native representations remain distinct. Particle support is the existing +/// preview, not a qualified interchangeable pressure or whole-state candidate. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum NativeFamilyKind { + Mac, + ParticlePreview, +} + +/// A caller retains its constructor identity separately from the borrowed owner. +/// Equality detects a wrong declared source; it proves neither authenticity nor +/// a cryptographic identity of every native input field. +#[derive(Debug, Clone, Copy)] +pub struct NativeInputExpectation<'a> { + pub identity: &'a SessionIdentity, + pub generation: u64, +} + +pub struct MacRequest<'a> { + pub expected: NativeInputExpectation<'a>, + pub inputs: LiquidStepInputs<'a>, + pub workspace: &'a mut ProviderStepWorkspace, + pub deadline: Option, +} + +pub struct ParticleRequest<'a> { + pub expected: NativeInputExpectation<'a>, + pub controls: MaterialStepControls, + pub deadline: Option, +} + +/// Family-specific requests retain their native controls and storage contracts. +pub enum NativeStepRequest<'a> { + Mac(MacRequest<'a>), + ParticlePreview(ParticleRequest<'a>), +} + +/// Real owner cancellation checkpoints. The particle owner supplies a poll, not +/// a named numerical stage; the facade does not infer one from callback order. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum NativeCancellationPoint { + Mac(LiquidStepStage), + ParticlePoll, +} + +/// Original numerical reports, including actual shortened dt and native +/// pressure selection. Elapsed timings retain their original owner and scope. +#[derive(Debug)] +#[allow( + clippy::large_enum_variant, + reason = "Native reports stay by value; boxing would allocate after the owner's publication" +)] +pub enum NativeStepReport { + Mac { + step: LiquidStepReport, + pressure: ProviderReport, + }, + ParticlePreview(ParticleStepReport), +} + +impl NativeStepReport { + pub fn actual_dt(&self) -> f64 { + match self { + Self::Mac { step, .. } => step.carrier.step.dt, + Self::ParticlePreview(report) => report.dt, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum NativeRefusal { + WrongFamily { + owner: NativeFamilyKind, + requested: NativeFamilyKind, + }, + WrongSource { + family: NativeFamilyKind, + expected_run_id: u64, + actual_run_id: u64, + source_revision_mismatch: bool, + }, + StaleGeneration { + family: NativeFamilyKind, + expected: u64, + actual: u64, + }, +} + +#[derive(Debug)] +pub enum NativeStepError { + Refused(NativeRefusal), + Mac(SessionError), + ParticlePreview(MaterialSessionError), +} + +impl fmt::Display for NativeStepError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Refused(reason) => write!(f, "native family request refused: {reason:?}"), + Self::Mac(error) => write!(f, "MAC native owner: {error}"), + Self::ParticlePreview(error) => write!(f, "particle preview native owner: {error}"), + } + } +} + +impl std::error::Error for NativeStepError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Self::Refused(_) => None, + Self::Mac(error) => Some(error), + Self::ParticlePreview(error) => Some(error), + } + } +} + +pub enum NativeSnapshot<'a> { + Mac(SessionSnapshot<'a>), + ParticlePreview(MaterialSnapshot<'a>), +} + +impl NativeSnapshot<'_> { + pub fn family(&self) -> NativeFamilyKind { + match self { + Self::Mac(_) => NativeFamilyKind::Mac, + Self::ParticlePreview(_) => NativeFamilyKind::ParticlePreview, + } + } + + pub fn identity(&self) -> &SessionIdentity { + match self { + Self::Mac(snapshot) => snapshot.identity(), + Self::ParticlePreview(snapshot) => snapshot.identity(), + } + } + + pub fn generation(&self) -> u64 { + match self { + Self::Mac(snapshot) => snapshot.state().carrier.generation, + Self::ParticlePreview(snapshot) => snapshot.generation(), + } + } +} + +/// Exclusive borrows of real owners, not replacement candidates or a second +/// scheduler. Requests with a different family are refused without conversion. +pub enum NativeSession<'a> { + Mac(&'a mut SimulationSession), + ParticlePreview(&'a mut MaterialSession), +} + +impl NativeSession<'_> { + pub fn snapshot(&self) -> NativeSnapshot<'_> { + match self { + Self::Mac(owner) => NativeSnapshot::Mac(owner.snapshot()), + Self::ParticlePreview(owner) => NativeSnapshot::ParticlePreview(owner.snapshot()), + } + } + + pub fn step( + &mut self, + request: NativeStepRequest<'_>, + mut cancel: impl FnMut(NativeCancellationPoint) -> bool, + ) -> Result { + match (self, request) { + (Self::Mac(owner), NativeStepRequest::Mac(request)) => { + let snapshot = owner.snapshot(); + check_expectation( + NativeFamilyKind::Mac, + request.expected, + snapshot.identity(), + snapshot.state().carrier.generation, + ) + .map_err(NativeStepError::Refused)?; + owner + .step_with_pressure_provider( + request.inputs, + request.workspace, + None, + request.deadline, + |stage| cancel(NativeCancellationPoint::Mac(stage)), + ) + .map(|(step, pressure)| NativeStepReport::Mac { step, pressure }) + .map_err(NativeStepError::Mac) + } + (Self::ParticlePreview(owner), NativeStepRequest::ParticlePreview(request)) => { + let snapshot = owner.snapshot(); + check_expectation( + NativeFamilyKind::ParticlePreview, + request.expected, + snapshot.identity(), + snapshot.generation(), + ) + .map_err(NativeStepError::Refused)?; + owner + .step(request.controls, request.deadline, || { + cancel(NativeCancellationPoint::ParticlePoll) + }) + .map(NativeStepReport::ParticlePreview) + .map_err(NativeStepError::ParticlePreview) + } + (Self::Mac(_), NativeStepRequest::ParticlePreview(_)) => { + Err(NativeStepError::Refused(NativeRefusal::WrongFamily { + owner: NativeFamilyKind::Mac, + requested: NativeFamilyKind::ParticlePreview, + })) + } + (Self::ParticlePreview(_), NativeStepRequest::Mac(_)) => { + Err(NativeStepError::Refused(NativeRefusal::WrongFamily { + owner: NativeFamilyKind::ParticlePreview, + requested: NativeFamilyKind::Mac, + })) + } + } + } +} + +fn check_expectation( + family: NativeFamilyKind, + expected: NativeInputExpectation<'_>, + actual_identity: &SessionIdentity, + actual_generation: u64, +) -> Result<(), NativeRefusal> { + if expected.identity != actual_identity { + return Err(NativeRefusal::WrongSource { + family, + expected_run_id: expected.identity.run_id, + actual_run_id: actual_identity.run_id, + source_revision_mismatch: expected.identity.source_revision + != actual_identity.source_revision, + }); + } + if expected.generation != actual_generation { + return Err(NativeRefusal::StaleGeneration { + family, + expected: expected.generation, + actual: actual_generation, + }); + } + Ok(()) +} + +/// Named future transfer contracts. Neither direction is admitted by C1-A. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum TransferOperator { + MacToParticleV1, + ParticleToMacV1, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct TransferUnavailable { + pub operator: TransferOperator, +} + +impl fmt::Display for TransferUnavailable { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "native transfer {:?} is not admitted", self.operator) + } +} + +impl std::error::Error for TransferUnavailable {} + +pub fn require_transfer(operator: TransferOperator) -> Result<(), TransferUnavailable> { + Err(TransferUnavailable { operator }) +} + +#[cfg(test)] +mod tests; diff --git a/src/native_family/tests.rs b/src/native_family/tests.rs new file mode 100644 index 00000000..87559a24 --- /dev/null +++ b/src/native_family/tests.rs @@ -0,0 +1,739 @@ +use super::*; +use crate::*; +use std::time::Instant; + +const MAC_CAP: usize = 16 * 1024 * 1024; +const FORCE: [BodyForce; 1] = [BodyForce { + value: [0.001, 0.0, 0.0], + units: ForceUnits::Acceleration, + region: None, +}]; + +fn identity() -> SessionIdentity { + SessionIdentity { + run_id: 101, + source_revision: "c1a-frozen-native-reference".into(), + } +} +fn expected(identity: &SessionIdentity, generation: u64) -> NativeInputExpectation<'_> { + NativeInputExpectation { + identity, + generation, + } +} +fn mac(max_steps: usize) -> (SimulationSession, ProviderStepWorkspace) { + let grid = GridGeometry::new([16; 3], [1.0 / 16.0; 3], [0.0; 3]).unwrap(); + let owner = SimulationSession::new( + identity(), + grid.clone(), + LiquidTransportConfig { + carrier: SimulationConfig { + density: 998.2, + memory_limit: MAC_CAP, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 2000, + }, + actual_divergence_limit: 1e-5, + max_courant: 1.0, + }, + represented_density: 998.2, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + }, + PressureImplementation::JacobiPcgV1, + vec![0.5; 16usize.pow(3)], + MAC_CAP, + max_steps, + ) + .unwrap(); + let workspace = + ProviderStepWorkspace::new(&grid, 998.2, MAC_CAP, PressureImplementation::JacobiPcgV1) + .unwrap(); + (owner, workspace) +} +fn mac_inputs() -> LiquidStepInputs<'static> { + LiquidStepInputs { + requested_dt: 0.001, + smoke_source: None, + forces: &FORCE, + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]).unwrap(), + source: None, + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + } +} +fn mac_request<'a>( + identity: &'a SessionIdentity, + generation: u64, + workspace: &'a mut ProviderStepWorkspace, +) -> NativeStepRequest<'a> { + NativeStepRequest::Mac(MacRequest { + expected: expected(identity, generation), + inputs: mac_inputs(), + workspace, + deadline: None, + }) +} +fn particle(max_steps: usize) -> MaterialSession { + MaterialSession::new( + identity(), + GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(), + ParticleFluidConfig { + samples_per_axis: 4, + max_particles: 512, + memory_limit: 1024 * 1024, + fill: DomainFill::EmittedFluid, + gravity: [0.0; 3], + ..Default::default() + }, + max_steps, + ) + .unwrap() +} +fn particle_controls() -> MaterialStepControls { + MaterialStepControls { + requested_dt: 0.001, + emitter: None, + } +} +fn shortened_controls(generation: u64) -> MaterialStepControls { + MaterialStepControls { + requested_dt: 0.2, + emitter: Some(MaterialEmitterControl { + source_id: 9, + source_version: generation, + emitter: RotatingCylinderEmitter { + pressure_heads: [0.0; 2], + ..Default::default() + }, + }), + } +} +fn particle_request( + identity: &SessionIdentity, + generation: u64, + controls: MaterialStepControls, +) -> NativeStepRequest<'_> { + NativeStepRequest::ParticlePreview(ParticleRequest { + expected: expected(identity, generation), + controls, + deadline: None, + }) +} + +// Test-only fingerprints retain every accepted native field and publication fact. +// Native reports contain no elapsed times except ProviderReport; those times are +// excluded for cross-run equivalence, retained for before/after refusal checks. +fn mac_fields(snapshot: &SessionSnapshot<'_>) -> Vec { + let state = snapshot.state(); + assert!(state.pressure_surface.is_none()); + assert!(state.reconstructed_surface.is_none()); + assert!(state.pressure_columns.is_none()); + assert!(!state.flat_column_mac); + let mut bits = vec![ + state.carrier.generation, + state.carrier.time.to_bits(), + state.liquid.time.to_bits(), + state.liquid.density.to_bits(), + state.carrier_stamp.id, + state.carrier_stamp.version, + state.liquid.stamp.id, + state.liquid.stamp.version, + snapshot.frame() as u64, + ]; + bits.push( + snapshot + .accepted_interval_start() + .map_or(u64::MAX, f64::to_bits), + ); + for values in [ + state.carrier.x, + state.carrier.y, + state.carrier.z, + state.carrier.tracer, + ] { + bits.extend(values.iter().map(|v| u64::from(v.to_bits()))); + } + bits.extend(state.pressure.iter().map(|v| v.to_bits())); + bits.extend(state.liquid.fraction.iter().map(|v| v.to_bits())); + bits +} +fn provider_numerics(report: &ProviderReport) -> String { + format!( + "{:?}", + ( + report.selected, + &report.attempted, + &report.rejection, + report.candidate, + report.accepted + ) + ) +} +fn mac_publication(snapshot: &SessionSnapshot<'_>) -> (Vec, String) { + ( + mac_fields(snapshot), + format!( + "{:?}", + ( + snapshot.identity(), + snapshot.configuration(), + snapshot.grid(), + snapshot.stage(), + snapshot.report(), + snapshot.provider_report() + ) + ), + ) +} +fn particle_fields(snapshot: &MaterialSnapshot<'_>) -> Vec { + let mut bits = vec![snapshot.generation(), snapshot.time().to_bits()]; + for p in snapshot.particles() { + bits.extend( + p.position + .into_iter() + .chain(p.velocity) + .chain([p.mass, p.temperature_kelvin]) + .map(f64::to_bits), + ); + bits.push(u64::from(p.material)); + } + if let Some((time, diagnostics)) = snapshot.particle_diagnostics() { + bits.push(time.to_bits()); + for d in diagnostics { + bits.extend( + [d.density, d.pressure] + .into_iter() + .chain(d.acceleration) + .map(f64::to_bits), + ); + } + } + bits +} +fn particle_publication(snapshot: &MaterialSnapshot<'_>) -> (Vec, String) { + ( + particle_fields(snapshot), + format!( + "{:?}", + ( + snapshot.identity(), + snapshot.grid(), + snapshot.config(), + snapshot.stage(), + snapshot.report(), + snapshot.accepted_controls(), + snapshot.diagnostic_stage() + ) + ), + ) +} +fn assert_particle_equivalent(actual: &MaterialSnapshot<'_>, direct: &MaterialSnapshot<'_>) { + assert_eq!(particle_publication(actual), particle_publication(direct)); +} +fn assert_refusal(result: Result, reason: NativeRefusal) { + assert!(matches!(result,Err(NativeStepError::Refused(actual)) if actual==reason)); +} + +#[test] +fn c1a_mac_native_baseline_100_intervals_are_bitwise_owner_equivalent() { + let identity = identity(); + let (mut owner, mut workspace) = mac(100); + let (mut direct, mut reference_workspace) = mac(100); + let mut native = NativeSession::Mac(&mut owner); + for generation in 0..100 { + let (reference_step, reference_pressure) = direct + .step_with_pressure_provider(mac_inputs(), &mut reference_workspace, None, None, |_| { + false + }) + .unwrap(); + let report = native + .step( + mac_request(&identity, generation, &mut workspace), + |point| { + assert!(matches!(point, NativeCancellationPoint::Mac(_))); + false + }, + ) + .unwrap(); + assert_eq!( + report.actual_dt().to_bits(), + reference_step.carrier.step.dt.to_bits() + ); + let NativeStepReport::Mac { step, pressure } = report else { + panic!("wrong native report family") + }; + assert_eq!(format!("{step:?}"), format!("{reference_step:?}")); + assert_eq!( + provider_numerics(&pressure), + provider_numerics(&reference_pressure) + ); + let NativeSnapshot::Mac(snapshot) = native.snapshot() else { + panic!("wrong snapshot family") + }; + let reference = direct.snapshot(); + assert_eq!( + mac_fields(&snapshot), + mac_fields(&reference), + "accepted interval {}", + generation + 1 + ); + assert_eq!(snapshot.identity(), reference.identity()); + assert_eq!( + snapshot.accepted_interval_start(), + reference.accepted_interval_start() + ); + assert_eq!(snapshot.stage(), SnapshotStage::Accepted); + assert_eq!( + format!("{:?}", snapshot.configuration()), + format!("{:?}", reference.configuration()) + ); + assert_eq!( + provider_numerics(snapshot.provider_report().unwrap()), + provider_numerics(reference.provider_report().unwrap()) + ); + } +} + +#[test] +fn c1a_particle_preview_retains_native_controls_diagnostics_and_shortened_dt() { + let identity = identity(); + let mut owner = particle(8); + let mut direct = particle(8); + let mut native = NativeSession::ParticlePreview(&mut owner); + for generation in 0..8 { + let controls = if generation < 4 { + particle_controls() + } else { + shortened_controls(generation + 1) + }; + let reference = direct.step(controls, None, || false).unwrap(); + let report = native + .step(particle_request(&identity, generation, controls), |point| { + assert_eq!(point, NativeCancellationPoint::ParticlePoll); + false + }) + .unwrap(); + assert_eq!(report.actual_dt().to_bits(), reference.dt.to_bits()); + if generation >= 4 { + assert!(report.actual_dt() < controls.requested_dt); + } + let NativeStepReport::ParticlePreview(report) = report else { + panic!("wrong report family") + }; + assert_eq!(format!("{report:?}"), format!("{reference:?}")); + let NativeSnapshot::ParticlePreview(snapshot) = native.snapshot() else { + panic!("wrong snapshot family") + }; + assert_particle_equivalent(&snapshot, &direct.snapshot()); + assert_eq!(snapshot.accepted_controls(), Some(controls)); + assert_eq!( + snapshot.diagnostic_stage(), + Some(ParticleEvaluationStage::PostEmissionPreIntegration) + ); + } +} + +#[test] +fn c1a_snapshots_borrow_original_native_fields_without_conversion() { + let (mut mac_owner, _) = mac(1); + let velocity = mac_owner.snapshot().state().carrier.x.as_ptr(); + let pressure = mac_owner.snapshot().state().pressure.as_ptr(); + let native = NativeSession::Mac(&mut mac_owner); + let snapshot = native.snapshot(); + assert_eq!(snapshot.family(), NativeFamilyKind::Mac); + assert_eq!(snapshot.generation(), 0); + assert_eq!(snapshot.identity(), &identity()); + let NativeSnapshot::Mac(snapshot) = snapshot else { + panic!("wrong snapshot") + }; + assert_eq!(snapshot.state().carrier.x.as_ptr(), velocity); + assert_eq!(snapshot.state().pressure.as_ptr(), pressure); + let mut particle_owner = particle(1); + let particles = particle_owner.snapshot().particles().as_ptr(); + let native = NativeSession::ParticlePreview(&mut particle_owner); + let NativeSnapshot::ParticlePreview(snapshot) = native.snapshot() else { + panic!("wrong snapshot") + }; + assert_eq!(snapshot.particles().as_ptr(), particles); +} + +#[test] +fn c1a_wrong_family_and_declared_source_are_refused_before_callbacks() { + let identity = identity(); + let (mut mac_owner, mut workspace) = mac(2); + let mut particle_owner = particle(2); + let before_mac = mac_publication(&mac_owner.snapshot()); + let before_particle = particle_publication(&particle_owner.snapshot()); + let mut mac_native = NativeSession::Mac(&mut mac_owner); + let mut particle_native = NativeSession::ParticlePreview(&mut particle_owner); + assert_refusal( + mac_native.step(particle_request(&identity, 0, particle_controls()), |_| { + panic!("wrong family reached callback") + }), + NativeRefusal::WrongFamily { + owner: NativeFamilyKind::Mac, + requested: NativeFamilyKind::ParticlePreview, + }, + ); + assert_refusal( + particle_native.step(mac_request(&identity, 0, &mut workspace), |_| { + panic!("wrong family reached callback") + }), + NativeRefusal::WrongFamily { + owner: NativeFamilyKind::ParticlePreview, + requested: NativeFamilyKind::Mac, + }, + ); + for (run_id, source_revision) in [ + (102, identity.source_revision.clone()), + (101, "other-declared-source".into()), + ] { + let wrong = SessionIdentity { + run_id, + source_revision, + }; + for (family, native) in [ + (NativeFamilyKind::Mac, &mut mac_native), + (NativeFamilyKind::ParticlePreview, &mut particle_native), + ] { + let request = match family { + NativeFamilyKind::Mac => mac_request(&wrong, 0, &mut workspace), + NativeFamilyKind::ParticlePreview => { + particle_request(&wrong, 0, particle_controls()) + } + }; + assert_refusal( + native.step(request, |_| panic!("wrong source reached callback")), + NativeRefusal::WrongSource { + family, + expected_run_id: run_id, + actual_run_id: 101, + source_revision_mismatch: wrong.source_revision != identity.source_revision, + }, + ); + } + } + let NativeSnapshot::Mac(snapshot) = mac_native.snapshot() else { + unreachable!() + }; + assert_eq!(mac_publication(&snapshot), before_mac); + let NativeSnapshot::ParticlePreview(snapshot) = particle_native.snapshot() else { + unreachable!() + }; + assert_eq!(particle_publication(&snapshot), before_particle); +} + +#[test] +fn c1a_stale_or_future_generation_cannot_relabel_accepted_history() { + let identity = identity(); + let (mut owner, mut workspace) = mac(2); + let mut native = NativeSession::Mac(&mut owner); + native + .step(mac_request(&identity, 0, &mut workspace), |_| false) + .unwrap(); + let NativeSnapshot::Mac(snapshot) = native.snapshot() else { + unreachable!() + }; + let before = mac_publication(&snapshot); + for generation in [0, 2] { + assert_refusal( + native.step(mac_request(&identity, generation, &mut workspace), |_| { + panic!("stale request invoked callback") + }), + NativeRefusal::StaleGeneration { + family: NativeFamilyKind::Mac, + expected: generation, + actual: 1, + }, + ); + let NativeSnapshot::Mac(snapshot) = native.snapshot() else { + unreachable!() + }; + assert_eq!(mac_publication(&snapshot), before); + } + let mut owner = particle(2); + let mut native = NativeSession::ParticlePreview(&mut owner); + native + .step(particle_request(&identity, 0, particle_controls()), |_| { + false + }) + .unwrap(); + let NativeSnapshot::ParticlePreview(snapshot) = native.snapshot() else { + unreachable!() + }; + let before = particle_publication(&snapshot); + for generation in [0, 2] { + assert_refusal( + native.step( + particle_request(&identity, generation, shortened_controls(99)), + |_| panic!("stale request invoked callback"), + ), + NativeRefusal::StaleGeneration { + family: NativeFamilyKind::ParticlePreview, + expected: generation, + actual: 1, + }, + ); + let NativeSnapshot::ParticlePreview(snapshot) = native.snapshot() else { + unreachable!() + }; + assert_eq!(particle_publication(&snapshot), before); + } +} + +#[test] +fn c1a_mac_errors_deadline_and_cancellation_preserve_the_native_publication() { + let identity = identity(); + let (mut owner, mut workspace) = mac(2); + let (mut direct, mut reference_workspace) = mac(2); + owner + .step_with_pressure_provider(mac_inputs(), &mut workspace, None, None, |_| false) + .unwrap(); + direct + .step_with_pressure_provider(mac_inputs(), &mut reference_workspace, None, None, |_| { + false + }) + .unwrap(); + let before = mac_publication(&owner.snapshot()); + let mut native = NativeSession::Mac(&mut owner); + let mut invalid = mac_inputs(); + invalid.requested_dt = f64::NAN; + let expected_error = direct + .step_with_pressure_provider(invalid, &mut reference_workspace, None, None, |_| false) + .unwrap_err(); + let error = native + .step( + NativeStepRequest::Mac(MacRequest { + expected: expected(&identity, 1), + inputs: invalid, + workspace: &mut workspace, + deadline: None, + }), + |_| false, + ) + .unwrap_err(); + assert!( + matches!(error,NativeStepError::Mac(ref e) if format!("{e:?}")==format!("{expected_error:?}")) + ); + let error = native + .step( + NativeStepRequest::Mac(MacRequest { + expected: expected(&identity, 1), + inputs: mac_inputs(), + workspace: &mut workspace, + deadline: Some(Instant::now()), + }), + |_| panic!("expired request invoked callback"), + ) + .unwrap_err(); + assert!(matches!( + error, + NativeStepError::Mac(SessionError::Deadline) + )); + for final_commit in [false, true] { + let mut callbacks = 0; + let mut first = None; + let result = native.step(mac_request(&identity, 1, &mut workspace), |point| { + callbacks += 1; + first.get_or_insert(point); + !final_commit || point == NativeCancellationPoint::Mac(LiquidStepStage::BeforeCommit) + }); + assert!(callbacks > 0); + assert_eq!( + first, + Some(NativeCancellationPoint::Mac(LiquidStepStage::Carrier( + StepStage::BeforeAdvection + ))) + ); + if final_commit { + assert!(matches!( + result, + Err(NativeStepError::Mac(SessionError::Step( + LiquidStepError::Cancelled + ))) + )); + } else { + assert!(matches!( + result, + Err(NativeStepError::Mac(SessionError::Step( + LiquidStepError::Carrier(SimulationError::Cancelled { + stage: StepStage::BeforeAdvection + }) + ))) + )); + } + let NativeSnapshot::Mac(snapshot) = native.snapshot() else { + unreachable!() + }; + assert_eq!(mac_publication(&snapshot), before); + } + native + .step(mac_request(&identity, 1, &mut workspace), |_| false) + .unwrap(); + direct + .step_with_pressure_provider(mac_inputs(), &mut reference_workspace, None, None, |_| { + false + }) + .unwrap(); + let NativeSnapshot::Mac(snapshot) = native.snapshot() else { + unreachable!() + }; + assert_eq!(mac_fields(&snapshot), mac_fields(&direct.snapshot())); +} + +#[test] +fn c1a_particle_failures_retain_controls_diagnostics_and_retry_identity() { + let identity = identity(); + let mut owner = particle(2); + let mut direct = particle(2); + owner.step(particle_controls(), None, || false).unwrap(); + direct.step(particle_controls(), None, || false).unwrap(); + let before = particle_publication(&owner.snapshot()); + let mut native = NativeSession::ParticlePreview(&mut owner); + let mut invalid = particle_controls(); + invalid.requested_dt = f64::NAN; + assert!(matches!( + native.step(particle_request(&identity, 1, invalid), |_| false), + Err(NativeStepError::ParticlePreview( + MaterialSessionError::Physics(ParticleFluidError::InvalidTimeStep) + )) + )); + assert!(matches!( + native.step( + NativeStepRequest::ParticlePreview(ParticleRequest { + expected: expected(&identity, 1), + controls: particle_controls(), + deadline: Some(Instant::now()) + }), + |_| panic!("expired request invoked callback") + ), + Err(NativeStepError::ParticlePreview( + MaterialSessionError::Deadline + )) + )); + let controls = shortened_controls(2); + let mut checkpoints = 0; + let report = direct + .step(controls, None, || { + checkpoints += 1; + false + }) + .unwrap(); + assert!(checkpoints > 1); + for selected in [1, checkpoints] { + let mut visits = 0; + assert!(matches!( + native.step(particle_request(&identity, 1, controls), |point| { + assert_eq!(point, NativeCancellationPoint::ParticlePoll); + visits += 1; + visits == selected + }), + Err(NativeStepError::ParticlePreview( + MaterialSessionError::Physics(ParticleFluidError::Cancelled) + )) + )); + assert_eq!(visits, selected); + let NativeSnapshot::ParticlePreview(snapshot) = native.snapshot() else { + unreachable!() + }; + assert_eq!(particle_publication(&snapshot), before); + } + let actual = native + .step(particle_request(&identity, 1, controls), |_| false) + .unwrap(); + assert_eq!(actual.actual_dt().to_bits(), report.dt.to_bits()); + let NativeSnapshot::ParticlePreview(snapshot) = native.snapshot() else { + unreachable!() + }; + assert_particle_equivalent(&snapshot, &direct.snapshot()); +} + +#[test] +fn c1a_quota_and_stop_stay_native_owner_failures() { + let identity = identity(); + let (mut owner, mut workspace) = mac(1); + let mut native = NativeSession::Mac(&mut owner); + native + .step(mac_request(&identity, 0, &mut workspace), |_| false) + .unwrap(); + let NativeSnapshot::Mac(snapshot) = native.snapshot() else { + unreachable!() + }; + let before = mac_publication(&snapshot); + assert!(matches!( + native.step(mac_request(&identity, 1, &mut workspace), |_| panic!( + "quota invoked callback" + )), + Err(NativeStepError::Mac(SessionError::StepLimit)) + )); + let NativeSession::Mac(owner) = &mut native else { + unreachable!() + }; + owner.stop(); + assert!(matches!( + native.step(mac_request(&identity, 1, &mut workspace), |_| panic!( + "stopped owner invoked callback" + )), + Err(NativeStepError::Mac(SessionError::Stopped)) + )); + let NativeSnapshot::Mac(snapshot) = native.snapshot() else { + unreachable!() + }; + assert_eq!(mac_publication(&snapshot), before); + let mut owner = particle(1); + let mut native = NativeSession::ParticlePreview(&mut owner); + native + .step(particle_request(&identity, 0, particle_controls()), |_| { + false + }) + .unwrap(); + let NativeSnapshot::ParticlePreview(snapshot) = native.snapshot() else { + unreachable!() + }; + let before = particle_publication(&snapshot); + assert!(matches!( + native.step( + particle_request(&identity, 1, particle_controls()), + |_| panic!("quota invoked callback") + ), + Err(NativeStepError::ParticlePreview( + MaterialSessionError::StepLimit + )) + )); + let NativeSession::ParticlePreview(owner) = &mut native else { + unreachable!() + }; + owner.stop(); + assert!(matches!( + native.step( + particle_request(&identity, 1, particle_controls()), + |_| panic!("stopped owner invoked callback") + ), + Err(NativeStepError::ParticlePreview( + MaterialSessionError::Stopped + )) + )); + let NativeSnapshot::ParticlePreview(snapshot) = native.snapshot() else { + unreachable!() + }; + assert_eq!(particle_publication(&snapshot), before); +} + +#[test] +fn c1a_named_cross_family_transfers_are_explicitly_unavailable() { + for operator in [ + TransferOperator::MacToParticleV1, + TransferOperator::ParticleToMacV1, + ] { + assert_eq!( + require_transfer(operator), + Err(TransferUnavailable { operator }) + ); + } +} diff --git a/src/projection_step.rs b/src/projection_step.rs new file mode 100644 index 00000000..c2d1ee5e --- /dev/null +++ b/src/projection_step.rs @@ -0,0 +1,1199 @@ +//! Closed native projection production and attempt evidence. This opt-in path +//! invokes no caller provider, process, model or stateful replacement. +use crate::solver_provider::composition::projection::{ + ProjectionCandidateIdentity, ProjectionCheckpoint, ProjectionDomain, ProjectionInput, + ProjectionRejection, ProjectionRequest, ProjectionSelection, ProjectionWorkspace, + SuppliedProjection, +}; +use crate::solver_provider::{PressureRequest, ProviderReport, ProviderWorkspace}; +use crate::{ + Axis, GridGeometry, LiquidStepReport, LiquidStepStage, PressureError, PressureImplementation, + PressureOperator, PressureReport, PressureSettings, SessionConfiguration, SessionError, + SessionIdentity, SimulationConfig, SimulationError, +}; +use std::{ + cell::RefCell, + fmt, + sync::Arc, + time::{Duration, Instant}, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionIntent { + BuiltinNativeV1, + ClassicalSelectionV1 { + producer: PressureImplementation, + producer_max_iterations: usize, + }, +} +impl ProjectionIntent { + pub fn version(self) -> u32 { + match self { + Self::BuiltinNativeV1 => 1, + Self::ClassicalSelectionV1 { .. } => 2, + } + } + pub fn producer(self, fallback: PressureImplementation) -> PressureImplementation { + match self { + Self::BuiltinNativeV1 => fallback, + Self::ClassicalSelectionV1 { producer, .. } => producer, + } + } + pub fn producer_cap(self, host_max_iterations: usize) -> usize { + match self { + Self::BuiltinNativeV1 => host_max_iterations, + Self::ClassicalSelectionV1 { + producer_max_iterations, + .. + } => producer_max_iterations, + } + } + fn validate_workspace(self, fallback: PressureImplementation) -> Result<(), &'static str> { + if let Self::ClassicalSelectionV1 { + producer, + producer_max_iterations, + } = self + && (producer == fallback || producer_max_iterations == 0) + { + return Err( + "classical projection requires a distinct producer and positive iteration cap", + ); + } + Ok(()) + } + pub fn validate_configuration(self, c: &SessionConfiguration) -> Result<(), &'static str> { + self.validate_workspace(c.implementation)?; + let config = c.transport.carrier; + if self.producer_cap(config.pressure.max_iterations) > config.pressure.max_iterations { + return Err("classical projection producer cap exceeds host cap"); + } + if config.memory_limit == 0 + || c.boundary_workspace_limit == 0 + || !config.density.is_finite() + || config.density <= 0.0 + || !c.transport.represented_density.is_finite() + || c.transport.represented_density <= 0.0 + || !config.max_courant.is_finite() + || config.max_courant <= 0.0 + || config.pressure.max_iterations == 0 + || [ + config.pressure.relative_residual, + config.pressure.absolute_residual, + config.pressure.divergence_limit, + config.actual_divergence_limit, + ] + .into_iter() + .any(|v| !v.is_finite() || v < 0.0) + { + return Err("invalid native projection configuration"); + } + Ok(()) + } +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionStepStage { + Liquid(LiquidStepStage), + ProducerPressurePoll, + Qualification(ProjectionCheckpoint), +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionAttemptStage { + SessionGuard, + CarrierPreparation, + NativeProducer, + HostQualification, + CarrierTransport, + VolumeTransport, + BeforeCommit, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionFailureCode { + Stopped, + StepLimit, + Deadline, + IntentMismatch, + WorkspaceMismatch, + InvalidInput, + NativePressure, + HostQualification, + Carrier, + Volume, + ReceiptAliased, + GenerationExhausted, + UnrepresentableMixedQualificationFallback, +} +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ProjectionAttemptOutcome { + Published { + generation: u64, + }, + Refused { + stage: ProjectionAttemptStage, + code: ProjectionFailureCode, + }, + Cancelled { + stage: ProjectionAttemptStage, + }, + Failed { + stage: ProjectionAttemptStage, + code: ProjectionFailureCode, + }, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionFieldRejection { + LengthMismatch, + NonFiniteInput, + NonZeroWallVelocity { axis: Axis, index: usize }, + ArithmeticFailure, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionPressureRejection { + NonFiniteOutput, + NonZeroGauge, + QualityGate, +} +#[derive(Debug, Clone, PartialEq)] +pub enum ProjectionRejectionFacts { + Field(ProjectionFieldRejection), + MomentumWitness { axis: Axis, index: usize }, + Pressure(ProjectionPressureRejection), + ActualDivergence { maximum: f64, limit: f64 }, +} +#[derive(Debug, Clone)] +pub struct NativeProjectionProducerFacts { + pub implementation: PressureImplementation, + pub pressure: PressureReport, + /// Actual max(abs, rel*||host RHS||), computed with the original compensated + /// accumulation for receipt validation only; it changes no solve criterion. + pub residual_l2_limit: f64, + /// Complete builtin call: RHS, native solve and copied-input correction. + pub elapsed: Duration, +} +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum ProjectionProducerFailure { + IterationLimit { + iterations: usize, + residual_max: f64, + }, +} +#[derive(Debug, Clone)] +pub struct NativeProjectionProducerFailureFacts { + pub implementation: PressureImplementation, + pub failure: ProjectionProducerFailure, + pub residual_l2_limit: f64, + /// Complete producer call through its observed iteration exhaustion. + pub elapsed: Duration, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionWitnessOutcome { + Accepted, + Rejected(ProjectionPressureRejection), +} +#[derive(Debug, Clone)] +pub struct ProjectionPressureWitnessFacts { + pub outcome: ProjectionWitnessOutcome, + pub diagnostics: Option, +} +#[derive(Debug, Clone)] +pub struct NativePressureSolveFacts { + pub implementation: PressureImplementation, + pub pressure: PressureReport, + /// Existing dispatcher's measured native solve only. + pub elapsed: Duration, +} +#[derive(Debug, Clone)] +pub struct ProjectionQualificationFacts { + pub selection: ProjectionSelection, + pub rejection: Option, + pub witness: Option, + pub native_fallback: Option, + pub actual_divergence_max: f64, + pub elapsed: Duration, +} +/// Exact clean native-only dispatcher facts. Construction checks that no +/// attempted-provider metadata is removed; decoding uses the closed method enum. +#[derive(Debug, Clone)] +pub struct NativePressureDispatchFacts { + pub implementation: PressureImplementation, + pub pressure: PressureReport, + pub total: Duration, + pub inference: Duration, + pub qualification: Duration, + pub fallback: Duration, +} +impl NativePressureDispatchFacts { + fn capture( + report: &ProviderReport, + implementation: PressureImplementation, + ) -> Result { + if !clean_native(report, implementation) { + return Err(SimulationError::ProjectionMixedQualificationFallback); + } + Ok(Self { + implementation, + pressure: report.accepted, + total: report.total, + inference: report.inference, + qualification: report.qualification, + fallback: report.fallback, + }) + } + pub fn report(&self) -> ProviderReport { + ProviderReport { + selected: self.implementation.id(), + attempted: None, + rejection: None, + candidate: None, + accepted: self.pressure, + total: self.total, + inference: self.inference, + qualification: self.qualification, + fallback: self.fallback, + } + } +} +#[derive(Debug, Clone)] +pub struct ProjectionAttempt { + pub version: u32, + pub intent: ProjectionIntent, + pub source: SessionIdentity, + pub attempt_id: u64, + pub accepted_generation: u64, + pub attempted_generation: Option, + pub interval_start: f64, + pub requested_dt: f64, + pub actual_dt: Option, + pub input_sha256: [u8; 32], + pub controls_sha256: [u8; 32], + pub provisional_input_id: Option<[u8; 32]>, + pub producer: Option, + pub producer_failure: Option, + pub qualification: Option, + pub selected_native: Option, + pub outcome: ProjectionAttemptOutcome, + pub output_sha256: Option<[u8; 32]>, + pub diagnostic: String, +} +impl ProjectionAttempt { + /// Intrinsic and constructor-linked checks. Archive history links and exact + /// native input/output hashes are checked by the recording owner separately. + pub fn validate( + &self, + configuration: &SessionConfiguration, + grid: &GridGeometry, + ) -> Result<(), &'static str> { + self.intent.validate_configuration(configuration)?; + if self.version != self.intent.version() + || self.version == 1 && self.producer_failure.is_some() + || !self.source.is_valid() + || self.attempt_id == 0 + || self.diagnostic.len() > 960 + || self.diagnostic.chars().count() > 240 + { + return Err("projection attempt header"); + } + if !self.interval_start.is_finite() + || self.interval_start < 0.0 + || self.attempted_generation != self.accepted_generation.checked_add(1) + { + return Err("projection attempt input position"); + } + if let Some(dt) = self.actual_dt + && (!dt.is_finite() + || dt <= 0.0 + || !self.requested_dt.is_finite() + || dt > self.requested_dt + || self.interval_start + dt <= self.interval_start + || !(self.interval_start + dt).is_finite()) + { + return Err("projection actual interval"); + } + let producer_observed = self.producer.is_some() || self.producer_failure.is_some(); + if self.provisional_input_id.is_some() != self.actual_dt.is_some() + || producer_observed && self.provisional_input_id.is_none() + || self.producer.is_some() && self.producer_failure.is_some() + || self.qualification.is_some() && !producer_observed + || self.selected_native.is_some() && self.qualification.is_none() + { + return Err("projection observation order"); + } + let settings = configuration.transport.carrier.pressure; + let producer_settings = PressureSettings { + max_iterations: self.intent.producer_cap(settings.max_iterations), + ..settings + }; + let producer_method = self.intent.producer(configuration.implementation); + if let Some(p) = &self.producer + && (p.implementation != producer_method + || !p.residual_l2_limit.is_finite() + || p.residual_l2_limit < 0.0 + || !native_metrics(p.pressure, producer_settings, p.residual_l2_limit)) + { + return Err("projection producer metrics"); + } + if let Some(failure) = &self.producer_failure { + let ProjectionProducerFailure::IterationLimit { + iterations, + residual_max, + } = failure.failure; + if !matches!(self.intent, ProjectionIntent::ClassicalSelectionV1 { .. }) + || failure.implementation != producer_method + || iterations != producer_settings.max_iterations + || !residual_max.is_finite() + || residual_max < 0.0 + || !failure.residual_l2_limit.is_finite() + || failure.residual_l2_limit < 0.0 + { + return Err("projection producer failure facts"); + } + } + let residual_l2_limit = self + .producer + .as_ref() + .map(|p| p.residual_l2_limit) + .or_else(|| self.producer_failure.as_ref().map(|f| f.residual_l2_limit)); + if let Some(q) = &self.qualification { + let residual_l2_limit = + residual_l2_limit.ok_or("projection producer observation absent")?; + if !q.actual_divergence_max.is_finite() + || q.actual_divergence_max < 0.0 + || q.actual_divergence_max > configuration.transport.carrier.actual_divergence_limit + { + return Err("projection qualified divergence"); + } + if let Some(w) = &q.witness { + if w.diagnostics.is_some_and(|p| p.iterations != 0) { + return Err("projection witness iterations"); + } + match w.outcome { + ProjectionWitnessOutcome::Accepted => { + if w.diagnostics + .is_none_or(|p| !native_metrics(p, settings, residual_l2_limit)) + { + return Err("projection accepted witness metrics"); + } + } + ProjectionWitnessOutcome::Rejected( + ProjectionPressureRejection::QualityGate, + ) => { + if w.diagnostics.is_none() { + return Err("projection rejected quality diagnostics absent"); + } + } + ProjectionWitnessOutcome::Rejected(_) => { + if w.diagnostics.is_some() { + return Err("projection rejected pressure diagnostics association"); + } + } + } + } + if let Some(f) = &q.native_fallback + && (f.implementation != configuration.implementation + || !native_metrics(f.pressure, settings, residual_l2_limit)) + { + return Err("projection fallback metrics"); + } + match q.selection { + ProjectionSelection::SuppliedCandidate => { + let witness = q + .witness + .as_ref() + .ok_or("projection candidate witness absent")?; + if q.rejection.is_some() + || q.native_fallback.is_some() + || witness.outcome != ProjectionWitnessOutcome::Accepted + || witness.diagnostics.is_none_or(|p| { + self.producer.as_ref().is_none_or(|producer| { + metric_bits(p) != metric_bits(producer.pressure) + }) + }) + { + return Err("projection candidate association"); + } + } + ProjectionSelection::NativeFallback => { + if self.producer.is_none() + || self.producer_failure.is_some() + || q.native_fallback.is_none() + { + return Err("projection fallback absent"); + } + match q.rejection.as_ref().ok_or("projection fallback rejection absent")? { + ProjectionRejectionFacts::Field(field) => { + if q.witness.is_some() {return Err("projection field rejection witness");} + if let ProjectionFieldRejection::NonZeroWallVelocity{axis,index}=field + && (*index>=grid.face_len(*axis) || !wall_index(grid,*axis,*index)) { + return Err("projection wall index"); + } + } + ProjectionRejectionFacts::MomentumWitness{axis,index} => { + if q.witness.is_some() || *index>=grid.face_len(*axis) {return Err("projection momentum witness association");} + } + ProjectionRejectionFacts::Pressure(reason) => { + if q.witness.as_ref().is_none_or(|w|w.outcome!=ProjectionWitnessOutcome::Rejected(*reason)) + || self.selected_native.is_some() || !matches!(self.outcome,ProjectionAttemptOutcome::Failed{ + stage:ProjectionAttemptStage::HostQualification,code:ProjectionFailureCode::UnrepresentableMixedQualificationFallback}) { + return Err("projection mixed fallback association"); + } + } + ProjectionRejectionFacts::ActualDivergence{maximum,limit} => { + if !maximum.is_finite() || !limit.is_finite() || *maximum<=*limit + || limit.to_bits()!=configuration.transport.carrier.actual_divergence_limit.to_bits() + || q.witness.as_ref().is_none_or(|w|w.outcome!=ProjectionWitnessOutcome::Accepted) { + return Err("projection discarded witness association"); + } + } + } + } + ProjectionSelection::NativeBaseline => { + if self.producer_failure.is_none() + || self.producer.is_some() + || q.native_fallback.is_none() + || q.rejection.is_some() + || q.witness.is_some() + { + return Err("projection failed producer baseline association"); + } + } + } + } + if let Some(native) = &self.selected_native { + let q = self + .qualification + .as_ref() + .ok_or("projection native qualification absent")?; + let (expected_method, expected, scope_elapsed) = + if q.selection == ProjectionSelection::SuppliedCandidate { + let p = self + .producer + .as_ref() + .ok_or("projection successful producer absent")?; + (producer_method, p.pressure, p.elapsed) + } else { + let f = q + .native_fallback + .as_ref() + .ok_or("projection native fallback absent")?; + (configuration.implementation, f.pressure, q.elapsed) + }; + if native.implementation != expected_method + || !native_metrics( + native.pressure, + settings, + residual_l2_limit.ok_or("projection residual limit absent")?, + ) + || report_bits(native.pressure) != report_bits(expected) + || native.inference != Duration::ZERO + || native.qualification != Duration::ZERO + || native.fallback > native.total + || native.total > scope_elapsed + || q.native_fallback + .as_ref() + .is_some_and(|f| native.fallback != f.elapsed) + { + return Err("projection selected native report"); + } + } + let prefix = |stage: ProjectionAttemptStage| match stage { + ProjectionAttemptStage::SessionGuard | ProjectionAttemptStage::CarrierPreparation => { + self.actual_dt.is_none() + && self.producer.is_none() + && self.producer_failure.is_none() + && self.qualification.is_none() + && self.selected_native.is_none() + } + ProjectionAttemptStage::NativeProducer => { + self.actual_dt.is_some() + && self.producer.is_none() + && self.producer_failure.is_none() + && self.qualification.is_none() + && self.selected_native.is_none() + } + ProjectionAttemptStage::HostQualification => { + producer_observed && self.selected_native.is_none() + } + ProjectionAttemptStage::CarrierTransport + | ProjectionAttemptStage::VolumeTransport + | ProjectionAttemptStage::BeforeCommit => { + self.qualification.is_some() && self.selected_native.is_some() + } + }; + match self.outcome { + ProjectionAttemptOutcome::Published { generation } => { + if Some(generation) != self.attempted_generation + || self.qualification.is_none() + || self.selected_native.is_none() + || self.output_sha256.is_none() + || !self.diagnostic.is_empty() + { + return Err("projection publication association"); + } + } + ProjectionAttemptOutcome::Refused { stage, code } => { + if self.output_sha256.is_some() + || stage != ProjectionAttemptStage::SessionGuard + || !prefix(stage) + || !matches!( + code, + ProjectionFailureCode::Stopped + | ProjectionFailureCode::StepLimit + | ProjectionFailureCode::IntentMismatch + | ProjectionFailureCode::WorkspaceMismatch + | ProjectionFailureCode::GenerationExhausted + | ProjectionFailureCode::ReceiptAliased + ) + { + return Err("projection refusal prefix"); + } + } + ProjectionAttemptOutcome::Cancelled { stage } => { + if self.output_sha256.is_some() + || !prefix(stage) + || stage == ProjectionAttemptStage::HostQualification + && self.qualification.is_some() + { + return Err("projection cancellation prefix"); + } + } + ProjectionAttemptOutcome::Failed { stage, code } => { + if stage == ProjectionAttemptStage::HostQualification { + match code { + ProjectionFailureCode::UnrepresentableMixedQualificationFallback => { + if self.qualification.as_ref().is_none_or(|q| { + q.selection != ProjectionSelection::NativeFallback + || !matches!( + q.rejection, + Some(ProjectionRejectionFacts::Pressure(_)) + ) + }) { + return Err("projection mixed failure observations absent"); + } + } + ProjectionFailureCode::HostQualification => { + if self.qualification.is_some() { + return Err("projection failed qualification has completed result"); + } + } + _ => {} + } + } + let allowed = match stage { + ProjectionAttemptStage::SessionGuard => false, + ProjectionAttemptStage::CarrierPreparation + | ProjectionAttemptStage::CarrierTransport => matches!( + code, + ProjectionFailureCode::Carrier + | ProjectionFailureCode::InvalidInput + | ProjectionFailureCode::ReceiptAliased + ), + ProjectionAttemptStage::NativeProducer => matches!( + code, + ProjectionFailureCode::NativePressure + | ProjectionFailureCode::ReceiptAliased + ), + ProjectionAttemptStage::HostQualification => matches!( + code, + ProjectionFailureCode::HostQualification + | ProjectionFailureCode::UnrepresentableMixedQualificationFallback + | ProjectionFailureCode::ReceiptAliased + ), + ProjectionAttemptStage::VolumeTransport => matches!( + code, + ProjectionFailureCode::Volume | ProjectionFailureCode::ReceiptAliased + ), + ProjectionAttemptStage::BeforeCommit => matches!( + code, + ProjectionFailureCode::Carrier + | ProjectionFailureCode::InvalidInput + | ProjectionFailureCode::ReceiptAliased + ), + }; + if !allowed || !prefix(stage) || self.output_sha256.is_some() { + return Err("projection failure prefix"); + } + } + } + Ok(()) + } +} +fn metric_bits(p: PressureReport) -> [u64; 3] { + [ + p.true_residual_l2.to_bits(), + p.true_residual_max.to_bits(), + p.predicted_divergence_max.to_bits(), + ] +} +fn report_bits(p: PressureReport) -> [u64; 4] { + [ + p.iterations as u64, + p.true_residual_l2.to_bits(), + p.true_residual_max.to_bits(), + p.predicted_divergence_max.to_bits(), + ] +} +fn wall_index(grid: &GridGeometry, axis: Axis, index: usize) -> bool { + let shape = grid.face_counts(axis); + let coordinate = [ + index % shape[0], + (index / shape[0]) % shape[1], + index / (shape[0] * shape[1]), + ]; + coordinate[axis.index()] == 0 || coordinate[axis.index()] == grid.counts()[axis.index()] +} + +fn finite_metrics(p: PressureReport) -> bool { + [ + p.true_residual_l2, + p.true_residual_max, + p.predicted_divergence_max, + ] + .into_iter() + .all(|v| v.is_finite() && v >= 0.0) +} +fn native_metrics(p: PressureReport, settings: PressureSettings, limit: f64) -> bool { + finite_metrics(p) + && p.iterations <= settings.max_iterations + && p.true_residual_l2 <= limit + && p.predicted_divergence_max <= settings.divergence_limit +} + +#[derive(Debug)] +pub enum ProjectionStepError { + Session(SessionError), + IntentMismatch, + WorkspaceMismatch, + AttemptExhausted, + ReceiptAliased, + InvalidReceipt(&'static str), + UnrepresentableMixedQualificationFallback, +} +impl fmt::Display for ProjectionStepError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "native projection step: {self:?}") + } +} +impl std::error::Error for ProjectionStepError {} +pub struct ProjectionStepAccepted { + pub report: LiquidStepReport, + pub attempt: Arc, +} +#[derive(Debug)] +pub struct ProjectionStepFailure { + pub error: ProjectionStepError, + pub attempt: Option>, +} +impl fmt::Display for ProjectionStepFailure { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.error.fmt(f) + } +} +impl std::error::Error for ProjectionStepFailure {} + +pub(crate) struct ProjectionCapture { + pub(crate) attempt: Arc, + pub(crate) stage: ProjectionAttemptStage, +} +impl ProjectionCapture { + pub(crate) fn update( + &mut self, + f: impl FnOnce(&mut ProjectionAttempt), + ) -> Result<(), SimulationError> { + let attempt = + Arc::get_mut(&mut self.attempt).ok_or(SimulationError::ProjectionReceiptAliased)?; + f(attempt); + Ok(()) + } + pub(crate) fn seal( + &mut self, + state: crate::LiquidTransportView<'_>, + configuration: &SessionConfiguration, + grid: &GridGeometry, + ) -> Result<(), SimulationError> { + self.update(|a| { + a.outcome = ProjectionAttemptOutcome::Published { + generation: state.carrier.generation, + }; + a.output_sha256 = Some(crate::workflow::input_digest(state)); + a.diagnostic.clear(); + })?; + self.attempt + .validate(configuration, grid) + .map_err(SimulationError::ProjectionReceiptInvalid) + } +} +pub(crate) trait ProjectionCancellation { + fn poll(&self, stage: ProjectionStepStage) -> bool; +} +pub(crate) struct ProjectionControl<'a> { + pub(crate) callback: RefCell<&'a mut dyn FnMut(ProjectionStepStage) -> bool>, +} +impl ProjectionCancellation for ProjectionControl<'_> { + fn poll(&self, stage: ProjectionStepStage) -> bool { + (self.callback.borrow_mut())(stage) + } +} +pub(crate) struct ProjectionStepInput<'a> { + pub(crate) workspace: &'a mut ProjectionStepWorkspace, + pub(crate) capture: &'a mut ProjectionCapture, + pub(crate) source: &'a SessionIdentity, + pub(crate) configuration: &'a SessionConfiguration, + pub(crate) control: &'a dyn ProjectionCancellation, +} + +/// All managed arrays are aggregate-capped: native dispatcher/RHS, B1 workspace +/// and three producer velocity arrays. No accepted history is retained here. +pub struct ProjectionStepWorkspace { + grid: GridGeometry, + density: f64, + implementation: PressureImplementation, + intent: ProjectionIntent, + producer: ProviderWorkspace, + rhs: Vec, + velocity: [Vec; 3], + qualifier: ProjectionWorkspace, + allocated: usize, + #[cfg(test)] + fault: ProjectionFault, +} +impl ProjectionStepWorkspace { + pub fn new( + grid: &GridGeometry, + density: f64, + limit: usize, + implementation: PressureImplementation, + ) -> Result { + Self::new_with_intent( + grid, + density, + limit, + implementation, + ProjectionIntent::BuiltinNativeV1, + ) + } + /// Construct disposable scratch for an immutable closed producer selection. + /// The Session additionally validates this cap against its host settings. + pub fn new_with_intent( + grid: &GridGeometry, + density: f64, + limit: usize, + fallback: PressureImplementation, + intent: ProjectionIntent, + ) -> Result { + intent + .validate_workspace(fallback) + .map_err(|_| SimulationError::InvalidConfig)?; + PressureOperator::new(grid, density)?; + let implementation = fallback; + let mut remaining = limit; + let rhs = allocate(grid.cell_len(), 0.0_f64, &mut remaining)?; + let velocity = [ + allocate(grid.face_len(Axis::X), 0.0_f32, &mut remaining)?, + allocate(grid.face_len(Axis::Y), 0.0_f32, &mut remaining)?, + allocate(grid.face_len(Axis::Z), 0.0_f32, &mut remaining)?, + ]; + let producer = ProviderWorkspace::new(grid, remaining, intent.producer(implementation))?; + remaining = remaining + .checked_sub(producer.allocated_bytes()) + .ok_or(SimulationError::AllocationFailed)?; + let qualifier = ProjectionWorkspace::new(grid, remaining, implementation) + .map_err(SimulationError::Projection)?; + remaining = remaining + .checked_sub(qualifier.allocated_bytes()) + .ok_or(SimulationError::AllocationFailed)?; + Ok(Self { + grid: grid.clone(), + density, + implementation, + intent, + producer, + rhs, + velocity, + qualifier, + allocated: limit - remaining, + #[cfg(test)] + fault: ProjectionFault::None, + }) + } + #[cfg(test)] + pub(crate) fn set_fault(&mut self, fault: ProjectionFault) { + self.fault = fault; + } + #[cfg(test)] + pub(crate) fn alias_before_work(&self) -> bool { + matches!(self.fault, ProjectionFault::AliasBeforeWork) + } + #[cfg(test)] + pub(crate) fn alias_before_seal(&self) -> bool { + matches!(self.fault, ProjectionFault::AliasBeforeSeal) + } + pub fn allocated_bytes(&self) -> usize { + self.allocated + } + pub(crate) fn matches( + &self, + grid: &GridGeometry, + density: f64, + implementation: PressureImplementation, + ) -> bool { + self.grid == *grid + && self.density.to_bits() == density.to_bits() + && self.implementation == implementation + } + pub(crate) fn matches_intent( + &self, + grid: &GridGeometry, + density: f64, + fallback: PressureImplementation, + intent: ProjectionIntent, + ) -> bool { + self.matches(grid, density, fallback) && self.intent == intent + } + pub(crate) fn pressure(&self) -> &[f64] { + self.qualifier_pressure() + } + pub(crate) fn velocity(&self) -> [&[f32]; 3] { + self.qualifier.velocity_for_integrated_step() + } + fn qualifier_pressure(&self) -> &[f64] { + // The borrow returned by qualify is released only after copying every + // qualified field; retain the exact final pressure in B1 scratch. + self.qualifier.pressure_for_integrated_step() + } + #[allow(clippy::too_many_arguments)] + pub(crate) fn project( + &mut self, + config: SimulationConfig, + source: &SessionIdentity, + generation: u64, + start: f64, + dt: f64, + provisional: [&[f32]; 3], + capture: &mut ProjectionCapture, + mut cancel: impl FnMut(ProjectionStepStage) -> bool, + ) -> Result { + if self.intent != capture.attempt.intent { + return Err(SimulationError::ProviderWorkspaceMismatch); + } + let request = ProjectionRequest::new(ProjectionInput { + grid: &self.grid, + density: self.density, + interval_start: start, + dt, + source, + generation, + velocity: provisional, + settings: config.pressure, + actual_divergence_limit: config.actual_divergence_limit, + domain: ProjectionDomain::SealedStationaryBox, + }) + .map_err(SimulationError::Projection)?; + capture.update(|a| { + a.actual_dt = Some(dt); + a.provisional_input_id = Some(*request.input_id().as_bytes()); + })?; + capture.stage = ProjectionAttemptStage::NativeProducer; + let begin = Instant::now(); + let operator = PressureOperator::new(&self.grid, self.density)?; + operator.build_rhs(provisional, dt, &mut self.rhs)?; + let residual_l2_limit = config + .pressure + .absolute_residual + .max(config.pressure.relative_residual * compensated_norm(&self.rhs)); + let producer_method = self.intent.producer(self.implementation); + let producer_settings = PressureSettings { + max_iterations: self.intent.producer_cap(config.pressure.max_iterations), + ..config.pressure + }; + let producer_result = self.producer.solve( + PressureRequest { + grid: &self.grid, + density: self.density, + dt, + rhs: &self.rhs, + }, + producer_settings, + None, + || cancel(ProjectionStepStage::ProducerPressurePoll), + ); + let producer = match producer_result { + Ok(report) => Some(report), + Err(PressureError::IterationLimit { + iterations, + residual_max, + }) if matches!(self.intent, ProjectionIntent::ClassicalSelectionV1 { .. }) => { + capture.update(|a| { + a.producer_failure = Some(NativeProjectionProducerFailureFacts { + implementation: producer_method, + failure: ProjectionProducerFailure::IterationLimit { + iterations, + residual_max, + }, + residual_l2_limit, + elapsed: begin.elapsed(), + }) + })?; + None + } + Err(error) => return Err(error.into()), + }; + if let Some(producer) = &producer { + for (output, input) in self.velocity.iter_mut().zip(provisional) { + output.copy_from_slice(input); + } + let [x, y, z] = &mut self.velocity; + operator.correct_candidate_in_place(self.producer.pressure(), dt, [x, y, z])?; + capture.update(|a| { + a.producer = Some(NativeProjectionProducerFacts { + implementation: producer_method, + pressure: producer.accepted, + residual_l2_limit, + elapsed: begin.elapsed(), + }) + })?; + } + #[cfg(test)] + if producer.is_some() { + self.fault.apply(&mut self.velocity); + } + #[cfg(test)] + let mut fault_pressure = [0.0_f64; 64]; + let candidate_pressure = self.producer.pressure(); + #[cfg(test)] + let candidate_pressure = if producer.is_some() + && matches!( + self.fault, + ProjectionFault::BadGauge | ProjectionFault::BadPressure + ) { + assert_eq!(self.grid.cell_len(), 64, "private fixed fault grid"); + if matches!(self.fault, ProjectionFault::BadGauge) { + fault_pressure.fill(1.0); + } else { + fault_pressure[1] = 1e-4; + } + for (output, input) in self.velocity.iter_mut().zip(provisional) { + output.copy_from_slice(input); + } + let [x, y, z] = &mut self.velocity; + operator.correct_candidate_in_place(&fault_pressure, dt, [x, y, z])?; + &fault_pressure[..] + } else { + candidate_pressure + }; + let supplied = producer.as_ref().map(|_| SuppliedProjection { + input_id: request.input_id(), + representation: request.representation(), + identity: ProjectionCandidateIdentity { + algorithm: producer_method.id(), + version: "1", + source_revision: "rheon-builtin-native-projection-v1", + }, + pressure: candidate_pressure, + velocity: [&self.velocity[0], &self.velocity[1], &self.velocity[2]], + }); + capture.stage = ProjectionAttemptStage::HostQualification; + let begin = Instant::now(); + let qualified = self + .qualifier + .qualify(&request, supplied.as_ref(), |stage| { + cancel(ProjectionStepStage::Qualification(stage)) + }) + .map_err(SimulationError::Projection)?; + let report = qualified.report(); + let facts = qualification_facts( + report, + self.implementation, + begin.elapsed(), + producer.is_none(), + )?; + capture.update(|a| a.qualification = Some(facts))?; + let selected = match report.selection { + ProjectionSelection::SuppliedCandidate => { + producer.expect("supplied candidate requires successful producer") + } + ProjectionSelection::NativeBaseline + if producer.is_none() && clean_native(&report.pressure, self.implementation) => + { + report.pressure.clone() + } + ProjectionSelection::NativeFallback + if clean_native(&report.pressure, self.implementation) => + { + report.pressure.clone() + } + _ => return Err(SimulationError::ProjectionMixedQualificationFallback), + }; + let selected_method = if report.selection == ProjectionSelection::SuppliedCandidate { + producer_method + } else { + self.implementation + }; + let native = NativePressureDispatchFacts::capture(&selected, selected_method)?; + capture.update(|a| a.selected_native = Some(native))?; + Ok(selected) + } +} +fn clean_native(report: &ProviderReport, implementation: PressureImplementation) -> bool { + report.selected == implementation.id() + && report.attempted.is_none() + && report.rejection.is_none() + && report.candidate.is_none() +} +fn qualification_facts( + report: &crate::solver_provider::composition::projection::ProjectionReport, + implementation: PressureImplementation, + elapsed: Duration, + producer_failed: bool, +) -> Result { + let rejection = report.rejection.as_ref().map(rejection_facts).transpose()?; + let witness_report = report + .discarded_candidate_pressure + .as_ref() + .unwrap_or(&report.pressure); + let witness = if witness_report.attempted.is_some() { + let outcome = match witness_report.rejection.as_ref() { + Some(reason) => ProjectionWitnessOutcome::Rejected(pressure_rejection(reason)?), + None => ProjectionWitnessOutcome::Accepted, + }; + Some(ProjectionPressureWitnessFacts { + outcome, + diagnostics: witness_report.candidate, + }) + } else { + None + }; + let native_fallback = (report.selection == ProjectionSelection::NativeFallback + || report.selection == ProjectionSelection::NativeBaseline && producer_failed) + .then_some(NativePressureSolveFacts { + implementation, + pressure: report.pressure.accepted, + elapsed: report.pressure.fallback, + }); + Ok(ProjectionQualificationFacts { + selection: report.selection, + rejection, + witness, + native_fallback, + actual_divergence_max: report.actual_divergence_max, + elapsed, + }) +} +fn pressure_rejection( + reason: &crate::solver_provider::ProviderRejection, +) -> Result { + use crate::solver_provider::ProviderRejection as R; + match reason { + R::NonFiniteOutput => Ok(ProjectionPressureRejection::NonFiniteOutput), + R::NonZeroGauge => Ok(ProjectionPressureRejection::NonZeroGauge), + R::QualityGate => Ok(ProjectionPressureRejection::QualityGate), + _ => Err(SimulationError::ProjectionReceiptInvalid( + "unrepresentable pressure rejection", + )), + } +} +fn rejection_facts( + reason: &ProjectionRejection, +) -> Result { + use crate::OperatorError as O; + Ok(match reason { + ProjectionRejection::Field(error) => ProjectionRejectionFacts::Field(match error { + O::LengthMismatch => ProjectionFieldRejection::LengthMismatch, + O::NonFiniteInput => ProjectionFieldRejection::NonFiniteInput, + O::NonZeroWallVelocity { axis, index } => { + ProjectionFieldRejection::NonZeroWallVelocity { + axis: *axis, + index: *index, + } + } + O::ArithmeticFailure => ProjectionFieldRejection::ArithmeticFailure, + _ => { + return Err(SimulationError::ProjectionReceiptInvalid( + "unrepresentable field rejection", + )); + } + }), + ProjectionRejection::MomentumWitness { axis, index } => { + ProjectionRejectionFacts::MomentumWitness { + axis: *axis, + index: *index, + } + } + ProjectionRejection::Pressure(reason) => { + ProjectionRejectionFacts::Pressure(pressure_rejection(reason)?) + } + ProjectionRejection::ActualDivergence { maximum, limit } => { + ProjectionRejectionFacts::ActualDivergence { + maximum: *maximum, + limit: *limit, + } + } + }) +} +fn compensated_norm(rhs: &[f64]) -> f64 { + let mut sum = 0.0_f64; + let mut correction = 0.0; + for value in rhs.iter().map(|v| v * v) { + let next = sum + value; + correction += if sum.abs() >= value.abs() { + (sum - next) + value + } else { + (value - next) + sum + }; + sum = next; + } + (sum + correction).sqrt() +} +fn allocate( + len: usize, + value: T, + remaining: &mut usize, +) -> Result, SimulationError> { + let required = len + .checked_mul(size_of::()) + .ok_or(SimulationError::AllocationFailed)?; + if required > *remaining { + return Err(SimulationError::BufferLimit { + required, + limit: *remaining, + }); + } + let mut values = Vec::new(); + values + .try_reserve_exact(len) + .map_err(|_| SimulationError::AllocationFailed)?; + let required = values + .capacity() + .checked_mul(size_of::()) + .ok_or(SimulationError::AllocationFailed)?; + if required > *remaining { + return Err(SimulationError::BufferLimit { + required, + limit: *remaining, + }); + } + values.resize(len, value); + *remaining -= required; + Ok(values) +} + +#[cfg(test)] +#[derive(Clone, Copy)] +pub(crate) enum ProjectionFault { + None, + WrongVelocity, + NonFiniteVelocity, + BadGauge, + BadPressure, + AliasBeforeWork, + AliasBeforeSeal, +} +#[cfg(test)] +impl ProjectionFault { + fn apply(self, velocity: &mut [Vec; 3]) { + match self { + Self::None => {} + Self::WrongVelocity => velocity[0][1] = f32::from_bits(velocity[0][1].to_bits() ^ 1), + Self::NonFiniteVelocity => velocity[0][1] = f32::NAN, + Self::BadGauge | Self::BadPressure | Self::AliasBeforeWork | Self::AliasBeforeSeal => {} + } + } +} diff --git a/src/provider_step.rs b/src/provider_step.rs index cb67d477..1fed58a8 100644 --- a/src/provider_step.rs +++ b/src/provider_step.rs @@ -83,6 +83,7 @@ impl ProviderStepWorkspace { pub(crate) fn pressure(&self) -> &[f64] { self.provider.pressure() } + #[allow(clippy::too_many_arguments)] // Existing explicit numerical inputs plus optional internal observation. pub(crate) fn solve( &mut self, operator: &PressureOperator<'_>, @@ -90,10 +91,12 @@ impl ProviderStepWorkspace { dt: f64, settings: PressureSettings, preferred: Option<&mut dyn PressureProvider>, + workflow: Option<&crate::workflow::Capture>, cancel: impl FnMut() -> bool, ) -> Result { operator.build_rhs(velocity, dt, &mut self.rhs)?; - Ok(self.provider.solve( + crate::workflow::pressure_requested(workflow, &self.rhs); + Ok(self.provider.solve_observed( PressureRequest { grid: &self.grid, density: self.density, @@ -103,6 +106,7 @@ impl ProviderStepWorkspace { settings, preferred, cancel, + workflow, )?) } } diff --git a/src/recording.rs b/src/recording.rs index 70f44a78..9f38ed5f 100644 --- a/src/recording.rs +++ b/src/recording.rs @@ -10,7 +10,9 @@ pub use force_fields::{ pub mod comparison; pub mod diagnostic; mod material; +pub mod projection; pub mod provider; +pub mod workflow; use crate::{GridGeometry, SessionIdentity, SnapshotStage}; pub use carrier::{ RecordedCarrier, carrier_publication, carrier_publication_with_force_fields, carrier_run, diff --git a/src/recording/projection.rs b/src/recording/projection.rs new file mode 100644 index 00000000..2dc0a8b3 --- /dev/null +++ b/src/recording/projection.rs @@ -0,0 +1,1258 @@ +//! Native projection Session inspection in the existing SQLite v1 owner. +//! +//! RPS1/RPP1/RPT1 and selection RPS2/RPP2/RPT2 retain native RSC1/RCP2 bytes. These are +//! observations, not restart state, execution authentication, or a GUI graph. +//! The older G1 `workflow::terminal` returns None for this profile: G1 evidence +//! is unavailable, which says neither that this is legacy nor that it has no +//! terminal status. Use this module's typed terminal reader for RPT1 custody. +use super::provider::runtime::{RuntimeTerminalCoverage, RuntimeTerminationCause}; +use super::provider::{ + self, Decoder, Encoder, RecordedConfiguredReceipt, RecordedConfiguredSession, + RecordedPressureSelection, +}; +use super::{RecordedStep, RecordingError, RecordingReader, RecordingRun, StepRecorder}; +use crate::projection_step::{ProjectionAttempt, ProjectionIntent}; +use crate::{SessionConfiguration, SessionSnapshot, SnapshotStage}; +use std::sync::Arc; + +pub const PROFILE: &str = "rheon-native-projection-session-v1"; +pub const CONFIGURATION_PROFILE: &str = "RPS1:"; +pub const PUBLICATION_PROFILE: &str = "RPP1:"; +pub const TERMINAL_PROFILE: &str = "RPT1:"; +/// Finite distinct producer/fallback selection; the v1 namespace is unchanged. +pub const SELECTION_PROFILE: &str = "rheon-native-projection-selection-v1"; +pub const SELECTION_CONFIGURATION_PROFILE: &str = "RPS2:"; +pub const SELECTION_PUBLICATION_PROFILE: &str = "RPP2:"; +pub const SELECTION_TERMINAL_PROFILE: &str = "RPT2:"; + +fn profiles(intent: ProjectionIntent) -> (&'static str, &'static str, &'static str, &'static str) { + match intent { + ProjectionIntent::BuiltinNativeV1 => ( + PROFILE, + CONFIGURATION_PROFILE, + PUBLICATION_PROFILE, + TERMINAL_PROFILE, + ), + ProjectionIntent::ClassicalSelectionV1 { .. } => ( + SELECTION_PROFILE, + SELECTION_CONFIGURATION_PROFILE, + SELECTION_PUBLICATION_PROFILE, + SELECTION_TERMINAL_PROFILE, + ), + } +} + +fn put_wrapped(encoder: &mut Encoder, text: &str, profile: &str) -> Result<(), RecordingError> { + let inner = Decoder::text(text, profile)?; + encoder.u32(inner.data.len() as u32); + encoder.0.extend_from_slice(&inner.data); + Ok(()) +} +fn get_wrapped(decoder: &mut Decoder, profile: &str) -> Result { + let len = decoder.u32()? as usize; + if len > super::MAX_TEXT / 2 { + return Err(RecordingError::Limit("projection wrapped metadata")); + } + let mut data = Vec::with_capacity(len); + for _ in 0..len { + data.push(decoder.u8()?); + } + Encoder(data).text(profile) +} +fn put_intent(encoder: &mut Encoder, intent: ProjectionIntent) { + match intent { + ProjectionIntent::BuiltinNativeV1 => encoder.u8(1), + ProjectionIntent::ClassicalSelectionV1 { + producer, + producer_max_iterations, + } => { + encoder.u8(2); + put_method(encoder, producer); + encoder.u64(producer_max_iterations as u64); + } + } +} +fn get_intent(decoder: &mut Decoder, version: u32) -> Result { + match (version, decoder.u8()?) { + (1, 1) => Ok(ProjectionIntent::BuiltinNativeV1), + (2, 2) => Ok(ProjectionIntent::ClassicalSelectionV1 { + producer: get_method(decoder)?, + producer_max_iterations: decoder.usize()?, + }), + _ => Err(RecordingError::Unsupported("projection intent version")), + } +} +fn recording_grid(run: &RecordingRun) -> Result { + crate::GridGeometry::new(run.counts, run.spacing, run.origin) + .map_err(|_| RecordingError::Invalid("projection recorded geometry")) +} +fn native_header(run: &RecordingRun) -> Result<(RecordingRun, ProjectionIntent), RecordingError> { + run.validate()?; + let (profile, version) = match run.solver.as_str() { + PROFILE => (CONFIGURATION_PROFILE, 1), + SELECTION_PROFILE => (SELECTION_CONFIGURATION_PROFILE, 2), + _ => return Err(RecordingError::Unsupported("projection Session profile")), + }; + let mut decoder = Decoder::text(&run.configuration, profile)?; + let configuration = get_wrapped(&mut decoder, "RSC1:")?; + let intent = get_intent(&mut decoder, version)?; + if profiles(intent).0 != run.solver { + return Err(RecordingError::Invalid("projection profile intent")); + } + decoder.end()?; + let native = RecordingRun { + solver: provider::PROFILE.into(), + configuration, + ..run.clone() + }; + let config = provider::configured_configuration(&native)?; + intent + .validate_configuration(&config) + .map_err(RecordingError::Invalid)?; + Ok((native, intent)) +} +/// Decode immutable native configuration and closed projection intent without +/// creating a Session, producer workspace, or runtime. +pub fn configuration( + run: &RecordingRun, +) -> Result<(SessionConfiguration, ProjectionIntent), RecordingError> { + let (native, intent) = native_header(run)?; + Ok((provider::configured_configuration(&native)?, intent)) +} +/// Capture actual immutable constructor controls and projection intent. +pub fn projection_run( + snapshot: &SessionSnapshot<'_>, + provenance: &str, +) -> Result { + let intent = snapshot + .projection_intent() + .ok_or(RecordingError::Unsupported( + "projection capture of legacy Session", + ))?; + let mut native = provider::native_run(snapshot, provenance)?; + let mut encoder = Encoder::default(); + put_wrapped(&mut encoder, &native.configuration, "RSC1:")?; + put_intent(&mut encoder, intent); + native.configuration = encoder.text(profiles(intent).1)?; + native.solver = profiles(intent).0.into(); + native_header(&native)?; + Ok(native) +} +fn native_receipt( + snapshot: &SessionSnapshot<'_>, +) -> Result, RecordingError> { + if snapshot.stage() == SnapshotStage::Constructor { + return Ok(None); + } + let report = snapshot + .provider_report() + .ok_or(RecordingError::Invalid("projection native report absent"))?; + let attempt = snapshot + .projection_attempt() + .ok_or(RecordingError::Invalid( + "projection accepted attempt absent", + ))?; + let run = projection_run(snapshot, "projection selected role")?; + validate_attempt_source( + &run, + snapshot.configuration(), + snapshot.projection_intent().unwrap(), + snapshot.grid(), + attempt, + )?; + let method = attempt + .selected_native + .as_ref() + .ok_or(RecordingError::Invalid("projection selected method absent"))? + .implementation; + // This is an admissibility check, not stripping a supplied-witness report. + if report.selected != method.id() + || report.attempted.is_some() + || report.rejection.is_some() + || report.candidate.is_some() + { + return Err(RecordingError::Invalid( + "projection selected report is not native-only", + )); + } + Ok(Some(RecordedConfiguredReceipt { + binding: None, + context: None, + viscosity_applied: false, + dynamic_viscosity: 0.0, + prediction_called: false, + selected: RecordedPressureSelection::Native(method), + attempted: None, + rejection: None, + candidate: None, + accepted: report.accepted, + total: report.total, + inference: report.inference, + qualification: report.qualification, + fallback: report.fallback, + })) +} +/// Capture accepted arrays once, retaining an unchanged native-only RCP2 payload. +pub fn projection_publication( + snapshot: &SessionSnapshot<'_>, + ordinal: usize, + limit: usize, +) -> Result { + let run = projection_run(snapshot, "projection publication source")?; + let attempt = snapshot.projection_attempt(); + if (snapshot.stage() == SnapshotStage::Accepted) != attempt.is_some() { + return Err(RecordingError::Invalid("projection snapshot receipt stage")); + } + let receipt = native_receipt(snapshot)?; + let method = receipt + .as_ref() + .map_or(snapshot.configuration().implementation, |r| { + match r.selected { + RecordedPressureSelection::Native(method) => method, + _ => unreachable!("native_receipt only emits native selection"), + } + }); + let mut step = provider::capture_native_with_method(snapshot, ordinal, limit, receipt, method)?; + let mut encoder = Encoder::default(); + encoder.0.extend_from_slice(&provider::source_binding(&run)); + put_wrapped(&mut encoder, &step.controls, "RCP2:")?; + encoder.boolean(attempt.is_some()); + if let Some(attempt) = attempt { + put_attempt( + &mut encoder, + attempt, + snapshot.configuration(), + snapshot.grid(), + )?; + } + step.controls = encoder.text(profiles(snapshot.projection_intent().unwrap()).2)?; + if step.payload_bytes()? > limit { + return Err(RecordingError::Limit("projection publication")); + } + if let Some(attempt) = attempt { + validate_attempt_source( + &run, + snapshot.configuration(), + snapshot.projection_intent().unwrap(), + snapshot.grid(), + attempt, + )?; + let report = snapshot + .report() + .ok_or(RecordingError::Invalid("projection snapshot report absent"))?; + let selected = snapshot + .provider_report() + .ok_or(RecordingError::Invalid("projection native report absent"))?; + if publication_generation(attempt) != Some(step.generation) + || attempt.actual_dt.map(f64::to_bits) != Some(report.carrier.step.dt.to_bits()) + || (attempt.interval_start + report.carrier.step.dt).to_bits() != step.time.to_bits() + || attempt.output_sha256 != Some(crate::workflow::input_digest(snapshot.state())) + || attempt.selected_native.as_ref().is_none_or(|native| { + report_bits(native.pressure) != report_bits(selected.accepted) + || native.total != selected.total + || native.inference != selected.inference + || native.qualification != selected.qualification + || native.fallback != selected.fallback + }) + { + return Err(RecordingError::Invalid( + "projection captured publication association", + )); + } + } + Ok(step) +} + +/// Exact accepted native fields plus their distinct projection observation. +/// For the selection profile, `native.configuration` is the authoritative outer +/// fallback constructor while `native.receipt.selected` identifies the validated +/// actual producer or fallback. This invariant does not apply to old configured readers. +pub struct RecordedProjectionSession { + pub native: RecordedConfiguredSession, + pub intent: ProjectionIntent, + pub attempt: Option>, +} +impl RecordedProjectionSession { + pub fn decode(run: &RecordingRun, step: &RecordedStep) -> Result { + let (header, intent) = native_header(run)?; + let config = provider::configured_configuration(&header)?; + let grid = recording_grid(run)?; + let mut decoder = Decoder::text(&step.controls, profiles(intent).2)?; + if decoder.array::<32>()? != provider::source_binding(run) { + return Err(RecordingError::Invalid("projection publication source")); + } + let controls = get_wrapped(&mut decoder, "RCP2:")?; + let attempt = if decoder.boolean()? { + Some(Arc::new(get_attempt( + &mut decoder, + &config, + &grid, + intent.version(), + )?)) + } else { + None + }; + decoder.end()?; + // Validate the outer role before varying the sole inner constructor field. + let method = if let Some(a) = attempt.as_deref() { + validate_attempt_source(run, &config, intent, &grid, a)?; + a.selected_native + .as_ref() + .ok_or(RecordingError::Invalid("projection selected method absent"))? + .implementation + } else { + config.implementation + }; + let adapted = provider::native_header_with_method(&header, method)?; + let mut native = provider::decode_native_with_controls(&adapted, step, &controls)?; + native.configuration = config; + validate_publication(run, &config, intent, &native, attempt.as_deref())?; + Ok(Self { + native, + intent, + attempt, + }) + } +} + +fn validate_attempt_source( + run: &RecordingRun, + config: &SessionConfiguration, + intent: ProjectionIntent, + grid: &crate::GridGeometry, + attempt: &ProjectionAttempt, +) -> Result<(), RecordingError> { + attempt + .validate(config, grid) + .map_err(RecordingError::Invalid)?; + if attempt.source != run.identity || attempt.intent != intent { + return Err(RecordingError::Invalid( + "projection attempt source or intent", + )); + } + Ok(()) +} +fn validate_publication( + run: &RecordingRun, + config: &SessionConfiguration, + intent: ProjectionIntent, + native: &RecordedConfiguredSession, + attempt: Option<&ProjectionAttempt>, +) -> Result<(), RecordingError> { + if native.generation == 0 { + if attempt.is_some() || native.receipt.is_some() { + return Err(RecordingError::Invalid("projection constructor attempt")); + } + return Ok(()); + } + let attempt = attempt.ok_or(RecordingError::Invalid( + "projection accepted attempt absent", + ))?; + validate_attempt_source(run, config, intent, &native.grid, attempt)?; + if publication_generation(attempt) != Some(native.generation) + || attempt.actual_dt.map(f64::to_bits) != native.dt.map(f64::to_bits) + || native + .dt + .is_none_or(|dt| (attempt.interval_start + dt).to_bits() != native.time.to_bits()) + || attempt.output_sha256 != Some(super::workflow::native_state_digest(native)?) + { + return Err(RecordingError::Invalid( + "projection publication association", + )); + } + let receipt = native + .receipt + .as_ref() + .ok_or(RecordingError::Invalid("projection native receipt absent"))?; + if receipt.binding.is_some() + || receipt.context.is_some() + || receipt.prediction_called + || receipt.attempted.is_some() + || receipt.rejection.is_some() + || receipt.candidate.is_some() + || receipt.viscosity_applied + || receipt.dynamic_viscosity.to_bits() != 0.0f64.to_bits() + || attempt.selected_native.as_ref().is_none_or(|selected| { + receipt.selected != RecordedPressureSelection::Native(selected.implementation) + }) + || selected_pressure(attempt).map(report_bits) != Some(report_bits(receipt.accepted)) + || attempt.selected_native.as_ref().is_none_or(|native| { + native.total != receipt.total + || native.inference != receipt.inference + || native.qualification != receipt.qualification + || native.fallback != receipt.fallback + }) + { + return Err(RecordingError::Invalid( + "projection native receipt association", + )); + } + Ok(()) +} +/// Validate a selected publication and its immediate retained input without +/// materializing a second history or executing a producer. +pub fn selection( + reader: &RecordingReader, + step: &RecordedStep, +) -> Result { + let current = RecordedProjectionSession::decode(reader.run(), step)?; + if let Some(attempt) = ¤t.attempt + && step.ordinal > 0 + { + let row = reader.select(step.ordinal - 1)?; + let prior = RecordedProjectionSession::decode(reader.run(), &row)?; + validate_prior(&prior, attempt)?; + } + Ok(current) +} +fn validate_prior( + prior: &RecordedProjectionSession, + attempt: &ProjectionAttempt, +) -> Result<(), RecordingError> { + if prior.native.generation != attempt.accepted_generation + || prior.native.time.to_bits() != attempt.interval_start.to_bits() + || super::workflow::native_state_digest(&prior.native)? != attempt.input_sha256 + || prior + .attempt + .as_ref() + .is_some_and(|previous| previous.attempt_id >= attempt.attempt_id) + { + return Err(RecordingError::Invalid( + "projection prior native input or attempt", + )); + } + Ok(()) +} +#[derive(Debug, Default, PartialEq, Eq)] +pub struct ProjectionHistoryCoverage { + pub verified_prior_links: usize, + pub unavailable_prior_links: usize, +} +/// Stream exact typed rows, retaining only prior scalar identity and digest. +pub fn verify_projection_recording( + reader: &RecordingReader, +) -> Result { + reader.verify()?; + let (config, _) = configuration(reader.run())?; + let status = reader.status()?; + if status + .accepted_generation + .is_some_and(|generation| generation > config.max_steps as u64) + { + return Err(RecordingError::Invalid("projection terminal quota")); + } + let mut previous: Option<(u64, f64, [u8; 32], Option)> = None; + let mut coverage = ProjectionHistoryCoverage::default(); + for ordinal in 0..reader.count()? { + let row = reader.select(ordinal)?; + let current = RecordedProjectionSession::decode(reader.run(), &row)?; + if let Some(attempt) = ¤t.attempt { + if let Some((generation, time, digest, id)) = previous { + if generation != attempt.accepted_generation + || time.to_bits() != attempt.interval_start.to_bits() + || digest != attempt.input_sha256 + || id.is_some_and(|id| id >= attempt.attempt_id) + { + return Err(RecordingError::Invalid( + "projection history native input or attempt", + )); + } + coverage.verified_prior_links += 1; + } else { + coverage.unavailable_prior_links += 1; + } + } + previous = Some(( + current.native.generation, + current.native.time, + super::workflow::native_state_digest(¤t.native)?, + current.attempt.as_ref().map(|attempt| attempt.attempt_id), + )); + } + Ok(coverage) +} + +/// Terminal numerical position and the latest observed attempt are distinct. +/// Accepted fields omitted by storage failure remain an unrecorded tail. +#[derive(Debug, Clone)] +pub struct ProjectionTermination { + pub cause: RuntimeTerminationCause, + pub detail: String, + pub accepted_generation: u64, + pub accepted_time: f64, + pub attempt: Option>, + source: [u8; 32], +} +impl ProjectionTermination { + pub fn capture( + snapshot: &SessionSnapshot<'_>, + cause: RuntimeTerminationCause, + detail: &str, + attempt: Option<&Arc>, + ) -> Result { + let run = projection_run(snapshot, "projection terminal source")?; + let state = snapshot.state(); + let value = Self { + cause, + detail: detail.into(), + accepted_generation: state.carrier.generation, + accepted_time: state.carrier.time, + attempt: attempt.cloned(), + source: provider::source_binding(&run), + }; + value.validate(&run)?; + if let Some(attempt) = &value.attempt { + let actual = crate::workflow::input_digest(state); + if if publication_generation(attempt).is_some() { + attempt.output_sha256 != Some(actual) + } else { + attempt.input_sha256 != actual + } { + return Err(RecordingError::Invalid( + "projection terminal snapshot digest", + )); + } + } + value.encode( + snapshot.configuration(), + snapshot.grid(), + snapshot.projection_intent().unwrap(), + )?; + Ok(value) + } + fn validate(&self, run: &RecordingRun) -> Result<(), RecordingError> { + let (config, intent) = configuration(run)?; + if self.cause == RuntimeTerminationCause::RuntimeFailure { + return Err(RecordingError::Unsupported( + "projection has no runtime execution", + )); + } + if self.cause == RuntimeTerminationCause::StartupFailure + && (self.accepted_generation != 0 || self.attempt.is_some()) + { + return Err(RecordingError::Invalid("projection startup terminal work")); + } + if self.source != provider::source_binding(run) + || self.detail.len() > 1000 + || self.accepted_generation > config.max_steps as u64 + || !self.accepted_time.is_finite() + || (self.accepted_generation == 0 && self.accepted_time.to_bits() != 0.0f64.to_bits()) + || (self.accepted_generation > 0 && self.accepted_time <= 0.0) + { + return Err(RecordingError::Invalid( + "projection terminal source or position", + )); + } + if let Some(attempt) = &self.attempt { + validate_attempt_source(run, &config, intent, &recording_grid(run)?, attempt)?; + if let Some(generation) = publication_generation(attempt) { + if generation != self.accepted_generation + || attempt.actual_dt.is_none_or(|dt| { + (attempt.interval_start + dt).to_bits() != self.accepted_time.to_bits() + }) + { + return Err(RecordingError::Invalid( + "projection terminal accepted association", + )); + } + } else if attempt.accepted_generation != self.accepted_generation + || attempt.interval_start.to_bits() != self.accepted_time.to_bits() + || self.cause == RuntimeTerminationCause::Completed + { + return Err(RecordingError::Invalid( + "projection terminal attempted association", + )); + } + } else if self.cause == RuntimeTerminationCause::Completed && self.accepted_generation > 0 { + return Err(RecordingError::Invalid( + "projection completed attempt absent", + )); + } + Ok(()) + } + fn encode( + &self, + config: &SessionConfiguration, + grid: &crate::GridGeometry, + intent: ProjectionIntent, + ) -> Result { + let mut encoder = Encoder::default(); + encoder.0.extend_from_slice(&self.source); + put_cause(&mut encoder, self.cause); + encoder.string(&self.detail)?; + encoder.u64(self.accepted_generation); + encoder.f64(self.accepted_time); + encoder.boolean(self.attempt.is_some()); + if let Some(attempt) = &self.attempt { + put_attempt(&mut encoder, attempt, config, grid)?; + } + encoder.text(profiles(intent).3) + } + pub fn finish(&self, recorder: &mut StepRecorder) -> Result<(), RecordingError> { + self.validate(recorder.run())?; + let (config, intent) = configuration(recorder.run())?; + recorder.finish( + cause_outcome(self.cause), + &self.encode(&config, &recording_grid(recorder.run())?, intent)?, + Some(self.accepted_generation), + ) + } +} +#[derive(Debug, Clone)] +pub struct ProjectionTerminationAudit { + pub termination: ProjectionTermination, + pub coverage: RuntimeTerminalCoverage, +} +/// Typed RPT1/RPT2 inspection. Unknown source/versions refuse; this never falls back +/// to G1 or interprets a missing publication as an accepted numerical row. +pub fn terminal(reader: &RecordingReader) -> Result { + verify_projection_recording(reader)?; + let (config, intent) = configuration(reader.run())?; + let grid = recording_grid(reader.run())?; + let status = reader.status()?; + if status.outcome == "active" { + return Err(RecordingError::Unsupported("projection active termination")); + } + let mut decoder = Decoder::text(&status.detail, profiles(intent).3)?; + let source = decoder.array()?; + let cause = get_cause(&mut decoder)?; + let detail = decoder.string()?; + let accepted_generation = decoder.u64()?; + let accepted_time = decoder.f64()?; + let attempt = if decoder.boolean()? { + Some(Arc::new(get_attempt( + &mut decoder, + &config, + &grid, + intent.version(), + )?)) + } else { + None + }; + decoder.end()?; + let termination = ProjectionTermination { + source, + cause, + detail, + accepted_generation, + accepted_time, + attempt, + }; + termination.validate(reader.run())?; + if status.accepted_generation != Some(accepted_generation) + || status.outcome != cause_outcome(cause) + { + return Err(RecordingError::Invalid("projection terminal lifecycle")); + } + let count = reader.count()?; + let coverage = if count == 0 { + if accepted_generation == 0 { + RuntimeTerminalCoverage::NoRecordedPublication + } else { + RuntimeTerminalCoverage::UnrecordedAcceptedTail { + last_recorded_generation: None, + } + } + } else { + let row = reader.select(count - 1)?; + let last = RecordedProjectionSession::decode(reader.run(), &row)?; + if accepted_generation < last.native.generation + || (accepted_generation == last.native.generation + && accepted_time.to_bits() != last.native.time.to_bits()) + || (accepted_generation > last.native.generation && accepted_time <= last.native.time) + { + return Err(RecordingError::Invalid("projection terminal recorded tail")); + } + if let Some(attempt) = &termination.attempt { + if publication_generation(attempt) == Some(last.native.generation) { + let recorded = last.attempt.as_ref().ok_or(RecordingError::Invalid( + "projection terminal accepted evidence absent", + ))?; + let mut a = Encoder::default(); + let mut b = Encoder::default(); + put_attempt(&mut a, attempt, &config, &grid)?; + put_attempt(&mut b, recorded, &config, &grid)?; + if a.0 != b.0 { + return Err(RecordingError::Invalid( + "projection terminal publication differs", + )); + } + } else { + if last + .attempt + .as_ref() + .is_some_and(|prior| prior.attempt_id >= attempt.attempt_id) + { + return Err(RecordingError::Invalid( + "projection terminal attempt identity", + )); + } + if last.native.generation == attempt.accepted_generation { + validate_prior(&last, attempt)?; + } + } + } + if accepted_generation == last.native.generation { + RuntimeTerminalCoverage::VerifiedLastPublication + } else { + RuntimeTerminalCoverage::UnrecordedAcceptedTail { + last_recorded_generation: Some(last.native.generation), + } + } + }; + Ok(ProjectionTerminationAudit { + termination, + coverage, + }) +} +fn cause_outcome(cause: RuntimeTerminationCause) -> &'static str { + match cause { + RuntimeTerminationCause::Completed => "completed", + RuntimeTerminationCause::Cancelled => "cancelled", + _ => "failed", + } +} +fn put_cause(e: &mut Encoder, cause: RuntimeTerminationCause) { + e.u8(match cause { + RuntimeTerminationCause::Completed => 0, + RuntimeTerminationCause::Cancelled => 1, + RuntimeTerminationCause::SessionDeadline => 2, + RuntimeTerminationCause::RuntimeFailure => 3, + RuntimeTerminationCause::StartupFailure => 4, + RuntimeTerminationCause::NumericalFailure => 5, + RuntimeTerminationCause::StorageFailure => 6, + }); +} +fn get_cause(d: &mut Decoder) -> Result { + match d.u8()? { + 0 => Ok(RuntimeTerminationCause::Completed), + 1 => Ok(RuntimeTerminationCause::Cancelled), + 2 => Ok(RuntimeTerminationCause::SessionDeadline), + 3 => Ok(RuntimeTerminationCause::RuntimeFailure), + 4 => Ok(RuntimeTerminationCause::StartupFailure), + 5 => Ok(RuntimeTerminationCause::NumericalFailure), + 6 => Ok(RuntimeTerminationCause::StorageFailure), + _ => Err(RecordingError::Unsupported("projection terminal cause")), + } +} +fn report_bits(report: crate::PressureReport) -> [u64; 4] { + [ + report.iterations as u64, + report.true_residual_l2.to_bits(), + report.true_residual_max.to_bits(), + report.predicted_divergence_max.to_bits(), + ] +} + +fn publication_generation(attempt: &ProjectionAttempt) -> Option { + match attempt.outcome { + crate::projection_step::ProjectionAttemptOutcome::Published { generation } => { + Some(generation) + } + _ => None, + } +} +fn selected_pressure(attempt: &ProjectionAttempt) -> Option { + attempt + .selected_native + .as_ref() + .map(|native| native.pressure) +} + +fn put_report(e: &mut Encoder, report: crate::PressureReport) { + for value in report_bits(report) { + e.u64(value); + } +} +fn get_report(d: &mut Decoder) -> Result { + Ok(crate::PressureReport { + iterations: d.usize()?, + true_residual_l2: d.f64()?, + true_residual_max: d.f64()?, + predicted_divergence_max: d.f64()?, + }) +} +fn put_duration(e: &mut Encoder, duration: std::time::Duration) { + e.u64(duration.as_secs()); + e.u32(duration.subsec_nanos()); +} +fn get_duration(d: &mut Decoder) -> Result { + let secs = d.u64()?; + let nanos = d.u32()?; + if nanos >= 1_000_000_000 { + return Err(RecordingError::Invalid("projection duration")); + } + Ok(std::time::Duration::new(secs, nanos)) +} +fn put_method(e: &mut Encoder, method: crate::PressureImplementation) { + e.u8(match method { + crate::PressureImplementation::JacobiPcgV1 => 0, + crate::PressureImplementation::SymmetricGaussSeidelPcgV1 => 1, + }); +} +fn get_method(d: &mut Decoder) -> Result { + match d.u8()? { + 0 => Ok(crate::PressureImplementation::JacobiPcgV1), + 1 => Ok(crate::PressureImplementation::SymmetricGaussSeidelPcgV1), + _ => Err(RecordingError::Unsupported("projection native method")), + } +} +fn put_axis(e: &mut Encoder, axis: crate::Axis) { + e.u8(match axis { + crate::Axis::X => 0, + crate::Axis::Y => 1, + crate::Axis::Z => 2, + }); +} +fn get_axis(d: &mut Decoder) -> Result { + match d.u8()? { + 0 => Ok(crate::Axis::X), + 1 => Ok(crate::Axis::Y), + 2 => Ok(crate::Axis::Z), + _ => Err(RecordingError::Unsupported("projection diagnostic axis")), + } +} +fn put_stage(e: &mut Encoder, stage: crate::projection_step::ProjectionAttemptStage) { + use crate::projection_step::ProjectionAttemptStage::*; + e.u8(match stage { + SessionGuard => 0, + CarrierPreparation => 1, + NativeProducer => 2, + HostQualification => 3, + CarrierTransport => 4, + VolumeTransport => 5, + BeforeCommit => 6, + }); +} +fn get_stage( + d: &mut Decoder, +) -> Result { + use crate::projection_step::ProjectionAttemptStage::*; + match d.u8()? { + 0 => Ok(SessionGuard), + 1 => Ok(CarrierPreparation), + 2 => Ok(NativeProducer), + 3 => Ok(HostQualification), + 4 => Ok(CarrierTransport), + 5 => Ok(VolumeTransport), + 6 => Ok(BeforeCommit), + _ => Err(RecordingError::Unsupported("projection attempt stage")), + } +} +fn put_code(e: &mut Encoder, code: crate::projection_step::ProjectionFailureCode) { + use crate::projection_step::ProjectionFailureCode::*; + e.u8(match code { + Stopped => 0, + StepLimit => 1, + Deadline => 2, + IntentMismatch => 3, + WorkspaceMismatch => 4, + InvalidInput => 5, + NativePressure => 6, + HostQualification => 7, + Carrier => 8, + Volume => 9, + ReceiptAliased => 10, + GenerationExhausted => 11, + UnrepresentableMixedQualificationFallback => 12, + }); +} +fn get_code( + d: &mut Decoder, +) -> Result { + use crate::projection_step::ProjectionFailureCode::*; + match d.u8()? { + 0 => Ok(Stopped), + 1 => Ok(StepLimit), + 2 => Ok(Deadline), + 3 => Ok(IntentMismatch), + 4 => Ok(WorkspaceMismatch), + 5 => Ok(InvalidInput), + 6 => Ok(NativePressure), + 7 => Ok(HostQualification), + 8 => Ok(Carrier), + 9 => Ok(Volume), + 10 => Ok(ReceiptAliased), + 11 => Ok(GenerationExhausted), + 12 => Ok(UnrepresentableMixedQualificationFallback), + _ => Err(RecordingError::Unsupported("projection failure code")), + } +} +fn put_pressure_rejection( + e: &mut Encoder, + reason: crate::projection_step::ProjectionPressureRejection, +) { + use crate::projection_step::ProjectionPressureRejection::*; + e.u8(match reason { + NonFiniteOutput => 0, + NonZeroGauge => 1, + QualityGate => 2, + }); +} +fn get_pressure_rejection( + d: &mut Decoder, +) -> Result { + use crate::projection_step::ProjectionPressureRejection::*; + match d.u8()? { + 0 => Ok(NonFiniteOutput), + 1 => Ok(NonZeroGauge), + 2 => Ok(QualityGate), + _ => Err(RecordingError::Unsupported("projection pressure rejection")), + } +} +fn put_rejection(e: &mut Encoder, reason: &crate::projection_step::ProjectionRejectionFacts) { + use crate::projection_step::{ + ProjectionFieldRejection as FieldReason, ProjectionRejectionFacts::*, + }; + match reason { + Field(reason) => { + e.u8(0); + match reason { + FieldReason::LengthMismatch => e.u8(0), + FieldReason::NonFiniteInput => e.u8(1), + FieldReason::NonZeroWallVelocity { axis, index } => { + e.u8(2); + put_axis(e, *axis); + e.usize(*index); + } + FieldReason::ArithmeticFailure => e.u8(3), + } + } + MomentumWitness { axis, index } => { + e.u8(1); + put_axis(e, *axis); + e.usize(*index); + } + Pressure(reason) => { + e.u8(2); + put_pressure_rejection(e, *reason); + } + ActualDivergence { maximum, limit } => { + e.u8(3); + e.f64(*maximum); + e.f64(*limit); + } + } +} +fn get_rejection( + d: &mut Decoder, +) -> Result { + use crate::projection_step::{ + ProjectionFieldRejection as FieldReason, ProjectionRejectionFacts::*, + }; + match d.u8()? { + 0 => Ok(Field(match d.u8()? { + 0 => FieldReason::LengthMismatch, + 1 => FieldReason::NonFiniteInput, + 2 => FieldReason::NonZeroWallVelocity { + axis: get_axis(d)?, + index: d.usize()?, + }, + 3 => FieldReason::ArithmeticFailure, + _ => return Err(RecordingError::Unsupported("projection field rejection")), + })), + 1 => Ok(MomentumWitness { + axis: get_axis(d)?, + index: d.usize()?, + }), + 2 => Ok(Pressure(get_pressure_rejection(d)?)), + 3 => Ok(ActualDivergence { + maximum: d.f64()?, + limit: d.f64()?, + }), + _ => Err(RecordingError::Unsupported( + "projection qualification rejection", + )), + } +} +fn put_attempt( + e: &mut Encoder, + attempt: &ProjectionAttempt, + config: &SessionConfiguration, + grid: &crate::GridGeometry, +) -> Result<(), RecordingError> { + use crate::projection_step::{ProjectionAttemptOutcome::*, ProjectionWitnessOutcome}; + use crate::solver_provider::composition::projection::ProjectionSelection; + attempt + .validate(config, grid) + .map_err(RecordingError::Invalid)?; + e.u32(attempt.version); + put_intent(e, attempt.intent); + e.u64(attempt.source.run_id); + e.string(&attempt.source.source_revision)?; + e.u64(attempt.attempt_id); + e.u64(attempt.accepted_generation); + e.boolean(attempt.attempted_generation.is_some()); + if let Some(generation) = attempt.attempted_generation { + e.u64(generation); + } + e.f64(attempt.interval_start); + e.f64(attempt.requested_dt); + e.boolean(attempt.actual_dt.is_some()); + if let Some(dt) = attempt.actual_dt { + e.f64(dt); + } + e.0.extend_from_slice(&attempt.input_sha256); + e.0.extend_from_slice(&attempt.controls_sha256); + e.boolean(attempt.provisional_input_id.is_some()); + if let Some(id) = attempt.provisional_input_id { + e.0.extend_from_slice(&id); + } + e.boolean(attempt.producer.is_some()); + if let Some(producer) = &attempt.producer { + put_method(e, producer.implementation); + put_report(e, producer.pressure); + e.f64(producer.residual_l2_limit); + put_duration(e, producer.elapsed); + } + if attempt.version == 2 { + e.boolean(attempt.producer_failure.is_some()); + if let Some(failure) = &attempt.producer_failure { + put_method(e, failure.implementation); + match failure.failure { + crate::projection_step::ProjectionProducerFailure::IterationLimit { + iterations, + residual_max, + } => { + e.u8(0); + e.u64(iterations as u64); + e.f64(residual_max); + } + } + e.f64(failure.residual_l2_limit); + put_duration(e, failure.elapsed); + } + } + e.boolean(attempt.qualification.is_some()); + if let Some(qualification) = &attempt.qualification { + e.u8(match qualification.selection { + ProjectionSelection::SuppliedCandidate => 0, + ProjectionSelection::NativeBaseline => 1, + ProjectionSelection::NativeFallback => 2, + }); + e.boolean(qualification.rejection.is_some()); + if let Some(reason) = &qualification.rejection { + put_rejection(e, reason); + } + e.boolean(qualification.witness.is_some()); + if let Some(witness) = &qualification.witness { + match witness.outcome { + ProjectionWitnessOutcome::Accepted => e.u8(0), + ProjectionWitnessOutcome::Rejected(reason) => { + e.u8(1); + put_pressure_rejection(e, reason); + } + } + e.boolean(witness.diagnostics.is_some()); + if let Some(report) = witness.diagnostics { + put_report(e, report); + } + } + e.boolean(qualification.native_fallback.is_some()); + if let Some(fallback) = &qualification.native_fallback { + put_method(e, fallback.implementation); + put_report(e, fallback.pressure); + put_duration(e, fallback.elapsed); + } + e.f64(qualification.actual_divergence_max); + put_duration(e, qualification.elapsed); + } + e.boolean(attempt.selected_native.is_some()); + if let Some(native) = &attempt.selected_native { + put_method(e, native.implementation); + put_report(e, native.pressure); + for duration in [ + native.total, + native.inference, + native.qualification, + native.fallback, + ] { + put_duration(e, duration); + } + } + match attempt.outcome { + Published { generation } => { + e.u8(0); + e.u64(generation); + } + Refused { stage, code } => { + e.u8(1); + put_stage(e, stage); + put_code(e, code); + } + Cancelled { stage } => { + e.u8(2); + put_stage(e, stage); + } + Failed { stage, code } => { + e.u8(3); + put_stage(e, stage); + put_code(e, code); + } + } + e.boolean(attempt.output_sha256.is_some()); + if let Some(hash) = attempt.output_sha256 { + e.0.extend_from_slice(&hash); + } + e.string(&attempt.diagnostic) +} +fn get_attempt( + d: &mut Decoder, + config: &SessionConfiguration, + grid: &crate::GridGeometry, + expected_version: u32, +) -> Result { + use crate::projection_step::*; + use crate::solver_provider::composition::projection::ProjectionSelection; + let version = d.u32()?; + if version != expected_version || (version != 1 && version != 2) { + return Err(RecordingError::Unsupported("projection attempt version")); + } + let intent = get_intent(d, version)?; + let source = crate::SessionIdentity { + run_id: d.u64()?, + source_revision: d.string()?, + }; + let attempt_id = d.u64()?; + let accepted_generation = d.u64()?; + let attempted_generation = if d.boolean()? { Some(d.u64()?) } else { None }; + let interval_start = d.f64()?; + let requested_dt = d.f64()?; + let actual_dt = if d.boolean()? { Some(d.f64()?) } else { None }; + let input_sha256 = d.array()?; + let controls_sha256 = d.array()?; + let provisional_input_id = if d.boolean()? { Some(d.array()?) } else { None }; + let producer = if d.boolean()? { + Some(NativeProjectionProducerFacts { + implementation: get_method(d)?, + pressure: get_report(d)?, + residual_l2_limit: d.f64()?, + elapsed: get_duration(d)?, + }) + } else { + None + }; + let producer_failure = if version == 2 && d.boolean()? { + Some(NativeProjectionProducerFailureFacts { + implementation: get_method(d)?, + failure: match d.u8()? { + 0 => ProjectionProducerFailure::IterationLimit { + iterations: d.usize()?, + residual_max: d.f64()?, + }, + _ => return Err(RecordingError::Unsupported("projection producer failure")), + }, + residual_l2_limit: d.f64()?, + elapsed: get_duration(d)?, + }) + } else { + None + }; + let qualification = if d.boolean()? { + let selection = match d.u8()? { + 0 => ProjectionSelection::SuppliedCandidate, + 1 => ProjectionSelection::NativeBaseline, + 2 => ProjectionSelection::NativeFallback, + _ => return Err(RecordingError::Unsupported("projection selection")), + }; + let rejection = if d.boolean()? { + Some(get_rejection(d)?) + } else { + None + }; + let witness = if d.boolean()? { + Some(ProjectionPressureWitnessFacts { + outcome: match d.u8()? { + 0 => ProjectionWitnessOutcome::Accepted, + 1 => ProjectionWitnessOutcome::Rejected(get_pressure_rejection(d)?), + _ => return Err(RecordingError::Unsupported("projection witness outcome")), + }, + diagnostics: if d.boolean()? { + Some(get_report(d)?) + } else { + None + }, + }) + } else { + None + }; + let native_fallback = if d.boolean()? { + Some(NativePressureSolveFacts { + implementation: get_method(d)?, + pressure: get_report(d)?, + elapsed: get_duration(d)?, + }) + } else { + None + }; + Some(ProjectionQualificationFacts { + selection, + rejection, + witness, + native_fallback, + actual_divergence_max: d.f64()?, + elapsed: get_duration(d)?, + }) + } else { + None + }; + let selected_native = if d.boolean()? { + Some(NativePressureDispatchFacts { + implementation: get_method(d)?, + pressure: get_report(d)?, + total: get_duration(d)?, + inference: get_duration(d)?, + qualification: get_duration(d)?, + fallback: get_duration(d)?, + }) + } else { + None + }; + let outcome = match d.u8()? { + 0 => ProjectionAttemptOutcome::Published { + generation: d.u64()?, + }, + 1 => ProjectionAttemptOutcome::Refused { + stage: get_stage(d)?, + code: get_code(d)?, + }, + 2 => ProjectionAttemptOutcome::Cancelled { + stage: get_stage(d)?, + }, + 3 => ProjectionAttemptOutcome::Failed { + stage: get_stage(d)?, + code: get_code(d)?, + }, + _ => return Err(RecordingError::Unsupported("projection attempt outcome")), + }; + let output_sha256 = if d.boolean()? { Some(d.array()?) } else { None }; + let attempt = ProjectionAttempt { + version, + intent, + source, + attempt_id, + accepted_generation, + attempted_generation, + interval_start, + requested_dt, + actual_dt, + input_sha256, + controls_sha256, + provisional_input_id, + producer, + producer_failure, + qualification, + selected_native, + outcome, + output_sha256, + diagnostic: d.string()?, + }; + attempt + .validate(config, grid) + .map_err(RecordingError::Invalid)?; + Ok(attempt) +} + +#[cfg(test)] +#[path = "projection_tests.rs"] +mod tests; diff --git a/src/recording/projection_tests.rs b/src/recording/projection_tests.rs new file mode 100644 index 00000000..ef82f735 --- /dev/null +++ b/src/recording/projection_tests.rs @@ -0,0 +1,1173 @@ +use super::*; +use crate::projection_step::{ + ProjectionAttemptOutcome, ProjectionFault, ProjectionStepStage, ProjectionStepWorkspace, +}; +use crate::recording::{RecordingLimits, provider::runtime::RuntimeTerminalCoverage}; +use crate::{ + GridGeometry, LiquidInlet, LiquidStepInputs, LiquidStepStage, LiquidTransportConfig, + LiquidVolumeSettings, PressureImplementation, PressureSettings, SessionIdentity, + SimulationConfig, SimulationSession, VolumeStamp, +}; +use std::sync::atomic::{AtomicU64, Ordering}; +const CAP: usize = 8 * 1024 * 1024; +fn identity() -> SessionIdentity { + SessionIdentity { + run_id: 911, + source_revision: "c1b2-persistence-native-fixture".into(), + } +} +fn config() -> LiquidTransportConfig { + LiquidTransportConfig { + carrier: SimulationConfig { + density: 998.2, + memory_limit: CAP, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 2000, + }, + actual_divergence_limit: 1e-5, + max_courant: 1.0, + }, + represented_density: 998.2, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + } +} +fn fixture(method: PressureImplementation) -> (SimulationSession, ProjectionStepWorkspace) { + let grid = GridGeometry::new([2; 3], [0.5; 3], [0.0; 3]).unwrap(); + let workspace = ProjectionStepWorkspace::new(&grid, 998.2, CAP, method).unwrap(); + ( + SimulationSession::new_with_projection( + identity(), + grid, + config(), + method, + vec![0.5; 8], + CAP, + 4, + ProjectionIntent::BuiltinNativeV1, + ) + .unwrap(), + workspace, + ) +} +fn fault_fixture() -> (SimulationSession, ProjectionStepWorkspace) { + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let method = PressureImplementation::JacobiPcgV1; + let workspace = ProjectionStepWorkspace::new(&grid, 998.2, CAP, method).unwrap(); + let session = SimulationSession::new_with_projection( + identity(), + grid, + config(), + method, + vec![0.5; 64], + CAP, + 4, + ProjectionIntent::BuiltinNativeV1, + ) + .unwrap(); + (session, workspace) +} + +fn inputs() -> LiquidStepInputs<'static> { + LiquidStepInputs { + requested_dt: 0.03125, + smoke_source: None, + forces: &[], + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]).unwrap(), + source: None, + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + } +} +fn path() -> std::path::PathBuf { + static NEXT: AtomicU64 = AtomicU64::new(0); + std::env::temp_dir().join(format!( + "rheon-b2-recording-{}-{}.sqlite", + std::process::id(), + NEXT.fetch_add(1, Ordering::Relaxed) + )) +} +fn unwrap_publication( + run: &RecordingRun, + row: &RecordedStep, +) -> (String, Option>) { + let (config, intent) = configuration(run).unwrap(); + let grid = recording_grid(run).unwrap(); + let mut decoder = + Decoder::text(&row.controls, profiles(configuration(run).unwrap().1).2).unwrap(); + assert_eq!( + decoder.array::<32>().unwrap(), + provider::source_binding(run) + ); + let controls = get_wrapped(&mut decoder, "RCP2:").unwrap(); + let attempt = if decoder.boolean().unwrap() { + Some(Arc::new( + get_attempt(&mut decoder, &config, &grid, intent.version()).unwrap(), + )) + } else { + None + }; + decoder.end().unwrap(); + (controls, attempt) +} +fn wrap_publication(run: &RecordingRun, inner: &str, attempt: &ProjectionAttempt) -> String { + let (config, _) = configuration(run).unwrap(); + let grid = recording_grid(run).unwrap(); + let mut encoder = Encoder::default(); + encoder.0.extend_from_slice(&provider::source_binding(run)); + put_wrapped(&mut encoder, inner, "RCP2:").unwrap(); + encoder.boolean(true); + put_attempt(&mut encoder, attempt, &config, &grid).unwrap(); + encoder + .text(profiles(configuration(run).unwrap().1).2) + .unwrap() +} +fn assert_old_capture_refused(session: &SimulationSession) { + assert!(matches!( + provider::configured_run(&session.snapshot(), "wrong profile"), + Err(RecordingError::Unsupported(_)) + )); + assert!(matches!( + provider::configured_publication(&session.snapshot(), 0, CAP), + Err(RecordingError::Unsupported(_)) + )); + assert!(matches!( + provider::configured_publication_with_runtime(&session.snapshot(), 0, CAP, None), + Err(RecordingError::Unsupported(_)) + )); + assert!(matches!( + super::super::workflow::configured_publication_with_workflow( + &session.snapshot(), + 0, + CAP, + None + ), + Err(RecordingError::Unsupported(_)) + )); +} +#[test] +fn c1b2_projection_sqlite_round_trip_close_producer_reopen_exact_native_fields() { + for method in PressureImplementation::ALL { + let (mut session, mut workspace) = fixture(method); + assert_old_capture_refused(&session); + let run = projection_run(&session.snapshot(), "SQLite native projection").unwrap(); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run.clone(), limits).unwrap(); + let constructor = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + let (inner, none) = unwrap_publication(&run, &constructor); + assert!(none.is_none()); + let legacy = SimulationSession::new( + identity(), + session.snapshot().grid().clone(), + config(), + method, + vec![0.5; 8], + CAP, + 4, + ) + .unwrap(); + let old_run = provider::configured_run(&legacy.snapshot(), &run.provenance).unwrap(); + let old_row = provider::configured_publication(&legacy.snapshot(), 0, CAP).unwrap(); + assert_eq!(inner, old_row.controls); + assert_eq!(native_header(&run).unwrap().0, old_run); + drop(legacy); + recorder.append(&constructor).unwrap(); + let mut accepted = None; + for ordinal in 1..=2 { + let result = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + accepted = Some(result.attempt); + assert_old_capture_refused(&session); + let row = projection_publication(&session.snapshot(), ordinal, CAP).unwrap(); + let decoded = RecordedProjectionSession::decode(&run, &row).unwrap(); + assert_eq!(decoded.native.generation, ordinal as u64); + assert_eq!( + decoded.attempt.as_ref().unwrap().output_sha256, + Some(super::super::workflow::native_state_digest(&decoded.native).unwrap()) + ); + let native = decoded.native.receipt.as_ref().unwrap(); + assert!( + native.binding.is_none() + && native.context.is_none() + && !native.prediction_called + && native.attempted.is_none() + ); + assert_eq!(native.selected, RecordedPressureSelection::Native(method)); + recorder.append(&row).unwrap(); + } + ProjectionTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Completed, + "done", + accepted.as_ref(), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + drop(accepted); + drop(workspace); + drop(session); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert_eq!(reader.count().unwrap(), 3); + assert_eq!( + verify_projection_recording(&reader) + .unwrap() + .verified_prior_links, + 2 + ); + let row = reader.select(2).unwrap(); + let selected = selection(&reader, &row).unwrap(); + assert_eq!(selected.native.generation, 2); + assert!( + selected + .attempt + .as_ref() + .unwrap() + .producer + .as_ref() + .unwrap() + .pressure + .iterations + <= 2000 + ); + let audit = terminal(&reader).unwrap(); + assert_eq!(audit.termination.accepted_generation, 2); + assert_eq!( + audit.coverage, + RuntimeTerminalCoverage::VerifiedLastPublication + ); + // None denotes unavailable G1 graph evidence, never a legacy/status claim. + assert!(super::super::workflow::terminal(&reader).unwrap().is_none()); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } +} +#[test] +fn c1b2_projection_real_clean_fallback_and_mixed_failure_are_distinct_cold_facts() { + for fault in [ + ProjectionFault::WrongVelocity, + ProjectionFault::NonFiniteVelocity, + ProjectionFault::BadGauge, + ProjectionFault::BadPressure, + ] { + let (mut session, mut workspace) = fault_fixture(); + workspace.set_fault(fault); + let run = projection_run(&session.snapshot(), "real bounded fault custody").unwrap(); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + let result = session.step_with_native_projection(inputs(), &mut workspace, None, |_| false); + let mixed = matches!( + fault, + ProjectionFault::BadGauge | ProjectionFault::BadPressure + ); + let (attempt, cause) = match result { + Ok(accepted) => { + assert!(!mixed); + let row = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + recorder.append(&row).unwrap(); + (accepted.attempt, RuntimeTerminationCause::Completed) + } + Err(failure) => { + assert!(mixed); + assert_eq!(session.snapshot().state().carrier.generation, 0); + ( + failure.attempt.unwrap(), + RuntimeTerminationCause::NumericalFailure, + ) + } + }; + assert!(attempt.producer.is_some() && attempt.qualification.is_some()); + assert_eq!(attempt.selected_native.is_some(), !mixed); + assert_eq!(publication_generation(&attempt).is_some(), !mixed); + ProjectionTermination::capture(&session.snapshot(), cause, "fault result", Some(&attempt)) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + drop(attempt); + drop(session); + drop(workspace); + let reader = RecordingReader::open(&archive, limits).unwrap(); + let audit = terminal(&reader).unwrap(); + assert_eq!(reader.count().unwrap(), usize::from(!mixed)); + let attempt = audit.termination.attempt.unwrap(); + assert!(attempt.qualification.is_some()); + assert_eq!(attempt.output_sha256.is_some(), !mixed); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } +} +#[test] +fn c1b2_projection_cancelled_generation_zero_has_terminal_but_no_accepted_row() { + for before_work in [true, false] { + let (mut session, mut workspace) = fixture(PressureImplementation::JacobiPcgV1); + let run = projection_run(&session.snapshot(), "cancellation custody").unwrap(); + let failure = session + .step_with_native_projection(inputs(), &mut workspace, None, |stage| { + before_work || stage == ProjectionStepStage::Liquid(LiquidStepStage::BeforeCommit) + }) + .err() + .expect("the chosen cancellation must fail"); + let attempt = failure.attempt.unwrap(); + assert!(matches!( + attempt.outcome, + ProjectionAttemptOutcome::Cancelled { .. } + )); + assert_eq!(publication_generation(&attempt), None); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + ProjectionTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Cancelled, + "cancelled", + Some(&attempt), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + drop(session); + drop(workspace); + let reader = RecordingReader::open(&archive, limits).unwrap(); + let audit = terminal(&reader).unwrap(); + assert_eq!(reader.count().unwrap(), 0); + assert_eq!(audit.termination.accepted_generation, 0); + assert_eq!( + audit.coverage, + RuntimeTerminalCoverage::NoRecordedPublication + ); + assert_eq!( + audit.termination.attempt.unwrap().producer.is_some(), + !before_work + ); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } +} +#[test] +fn c1b2_projection_actual_append_limit_preserves_unrecorded_accepted_tail() { + let (mut session, mut workspace) = fixture(PressureImplementation::JacobiPcgV1); + let run = projection_run(&session.snapshot(), "storage limit custody").unwrap(); + let archive = path(); + let limits = RecordingLimits { + max_records: 1, + ..RecordingLimits::default() + }; + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + let constructor = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + recorder.append(&constructor).unwrap(); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let row = projection_publication(&session.snapshot(), 1, CAP).unwrap(); + assert!(matches!( + recorder.append(&row), + Err(RecordingError::Limit(_)) + )); + ProjectionTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::StorageFailure, + "accepted row exceeds selected record count", + Some(&accepted.attempt), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + drop(session); + drop(workspace); + drop(accepted); + let reader = RecordingReader::open(&archive, limits).unwrap(); + let audit = terminal(&reader).unwrap(); + assert_eq!(audit.termination.accepted_generation, 1); + assert_eq!( + audit.coverage, + RuntimeTerminalCoverage::UnrecordedAcceptedTail { + last_recorded_generation: Some(0) + } + ); + assert_eq!(reader.count().unwrap(), 1); + drop(reader); + std::fs::remove_file(archive).unwrap(); +} +#[test] +fn c1b2_projection_rejects_profile_intent_size_source_interval_and_output_corruption() { + let (mut session, mut workspace) = fixture(PressureImplementation::JacobiPcgV1); + session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let run = projection_run(&session.snapshot(), "negative codec fixtures").unwrap(); + let mut row = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + let good = row.controls.clone(); + let (inner, attempt) = unwrap_publication(&run, &row); + let attempt = attempt.unwrap(); + let mut bad = run.clone(); + bad.solver = "rheon-native-projection-session-v2".into(); + assert!(matches!( + configuration(&bad), + Err(RecordingError::Unsupported(_)) + )); + let mut bad = run.clone(); + bad.configuration = bad.configuration.replacen("RPS1:", "RPS2:", 1); + assert!(matches!( + configuration(&bad), + Err(RecordingError::Unsupported(_)) + )); + let mut bad = run.clone(); + bad.configuration.truncate(bad.configuration.len() - 2); + bad.configuration.push_str("02"); + assert!(matches!( + configuration(&bad), + Err(RecordingError::Unsupported(_)) + )); + let mut bad = run.clone(); + bad.configuration + .push_str(&"0".repeat(super::super::MAX_TEXT)); + assert!(configuration(&bad).is_err()); + row.controls = good.replacen("RPP1:", "RPP2:", 1); + assert!(matches!( + RecordedProjectionSession::decode(&run, &row), + Err(RecordingError::Unsupported(_)) + )); + row.controls = good.clone(); + row.controls.pop(); + assert!(RecordedProjectionSession::decode(&run, &row).is_err()); + row.controls = good.clone() + &"0".repeat(super::super::MAX_TEXT); + assert!(matches!( + RecordedProjectionSession::decode(&run, &row), + Err(RecordingError::Limit(_)) + )); + let mut other = run.clone(); + other.identity.source_revision.push_str("-foreign"); + row.controls = wrap_publication(&other, &inner, &attempt); + assert!(RecordedProjectionSession::decode(&run, &row).is_err()); + for variant in 0..3 { + let mut bad = (*attempt).clone(); + match variant { + 0 => bad.output_sha256.as_mut().unwrap()[0] ^= 1, + 1 => bad.interval_start += 0.001, + _ => bad.source.run_id += 1, + }; + row.controls = wrap_publication(&run, &inner, &bad); + assert!(RecordedProjectionSession::decode(&run, &row).is_err()); + } + // Constructor-only archives must also reject a new-profile zero fallback + // cap; the unchanged legacy RSC1 configuration remains readable. + let (mut native, intent) = native_header(&run).unwrap(); + let mut d = Decoder::text(&native.configuration, "RSC1:").unwrap(); + let offset = 1 + 8 + 8 + 3 * 8; + d.data[offset..offset + 8].copy_from_slice(&0u64.to_le_bytes()); + native.configuration = Encoder(d.data).text("RSC1:").unwrap(); + assert_eq!( + provider::configured_configuration(&native) + .unwrap() + .transport + .carrier + .pressure + .max_iterations, + 0 + ); + let mut e = Encoder::default(); + put_wrapped(&mut e, &native.configuration, "RSC1:").unwrap(); + put_intent(&mut e, intent); + let mut bad = run.clone(); + bad.configuration = e.text(CONFIGURATION_PROFILE).unwrap(); + assert!(configuration(&bad).is_err()); +} +#[test] +fn c1b2_projection_selected_and_history_reject_forged_input_and_duplicate_attempt() { + for duplicate in [false, true] { + let (mut session, mut workspace) = fixture(PressureImplementation::JacobiPcgV1); + let run = projection_run(&session.snapshot(), "history negatives").unwrap(); + let constructor = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let first = projection_publication(&session.snapshot(), 1, CAP).unwrap(); + session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let mut second = projection_publication(&session.snapshot(), 2, CAP).unwrap(); + let (inner, attempt) = unwrap_publication(&run, &second); + let mut forged = (*attempt.unwrap()).clone(); + if duplicate { + forged.attempt_id = 1; + } else { + forged.input_sha256[0] ^= 1; + } + second.controls = wrap_publication(&run, &inner, &forged); + RecordedProjectionSession::decode(&run, &second).unwrap(); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder.append(&constructor).unwrap(); + recorder.append(&first).unwrap(); + recorder.append(&second).unwrap(); + recorder + .finish("failed", "authored cross-link rejection fixture", Some(2)) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(selection(&reader, &second).is_err()); + assert!(verify_projection_recording(&reader).is_err()); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } +} +#[test] +fn c1b2_projection_terminal_rejects_unknown_source_version_cause_and_forged_snapshot() { + let (mut session, mut workspace) = fixture(PressureImplementation::JacobiPcgV1); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + assert!(matches!( + ProjectionTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::RuntimeFailure, + "no runtime exists", + Some(&accepted.attempt) + ), + Err(RecordingError::Unsupported(_)) + )); + assert!( + ProjectionTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::StartupFailure, + "work already exists", + Some(&accepted.attempt) + ) + .is_err() + ); + let mut forged = (*accepted.attempt).clone(); + forged.output_sha256.as_mut().unwrap()[0] ^= 1; + assert!( + ProjectionTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::StorageFailure, + "bad native snapshot", + Some(&Arc::new(forged)) + ) + .is_err() + ); + let run = projection_run(&session.snapshot(), "terminal negative fixtures").unwrap(); + let actual = ProjectionTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::StorageFailure, + "unrecorded accepted tail", + Some(&accepted.attempt), + ) + .unwrap(); + let (config, _) = configuration(&run).unwrap(); + let grid = recording_grid(&run).unwrap(); + let encoded = actual + .encode(&config, &grid, ProjectionIntent::BuiltinNativeV1) + .unwrap(); + for corrupt in [ + encoded.replacen("RPT1:", "RPT2:", 1), + encoded.clone() + &"0".repeat(super::super::MAX_TEXT), + ] { + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run.clone(), limits).unwrap(); + if corrupt.len() > super::super::MAX_TEXT { + assert!(recorder.finish("failed", &corrupt, Some(1)).is_err()); + drop(recorder); + std::fs::remove_file(archive).unwrap(); + continue; + } + recorder.finish("failed", &corrupt, Some(1)).unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(terminal(&reader).is_err()); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + let mut stale = actual.clone(); + stale.source[0] ^= 1; + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder + .finish( + "failed", + &stale + .encode(&config, &grid, ProjectionIntent::BuiltinNativeV1) + .unwrap(), + Some(1), + ) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(terminal(&reader).is_err()); + drop(reader); + std::fs::remove_file(archive).unwrap(); +} +#[test] +fn c1b2_projection_cold_decoder_rejects_invalid_native_iteration_bytes() { + let (mut session, mut workspace) = fixture(PressureImplementation::JacobiPcgV1); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let run = projection_run(&session.snapshot(), "iteration decoder negative").unwrap(); + let row = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + let producer = accepted.attempt.producer.as_ref().unwrap(); + let mut signature = Encoder::default(); + put_method(&mut signature, producer.implementation); + put_report(&mut signature, producer.pressure); + signature.f64(producer.residual_l2_limit); + put_duration(&mut signature, producer.elapsed); + let mut data = Decoder::text(&row.controls, PUBLICATION_PROFILE) + .unwrap() + .data; + let matches = data + .windows(signature.0.len()) + .enumerate() + .filter_map(|(i, bytes)| (bytes == signature.0.as_slice()).then_some(i)) + .collect::>(); + assert_eq!(matches.len(), 1); + let offset = matches[0] + 1; + data[offset..offset + 8].copy_from_slice(&2001u64.to_le_bytes()); + let malformed = RecordedStep { + controls: Encoder(data).text(PUBLICATION_PROFILE).unwrap(), + ..row + }; + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder.append(&malformed).unwrap(); + recorder + .finish("failed", "authored native iteration corruption", Some(1)) + .unwrap(); + drop(recorder); + drop(session); + drop(workspace); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(RecordedProjectionSession::decode(reader.run(), &reader.select(0).unwrap()).is_err()); + drop(reader); + std::fs::remove_file(archive).unwrap(); +} + +fn selection_fixture( + producer: PressureImplementation, + producer_max_iterations: usize, +) -> (SimulationSession, ProjectionStepWorkspace) { + let fallback = PressureImplementation::ALL + .into_iter() + .find(|m| *m != producer) + .unwrap(); + let intent = ProjectionIntent::ClassicalSelectionV1 { + producer, + producer_max_iterations, + }; + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let workspace = + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, CAP, fallback, intent).unwrap(); + let session = SimulationSession::new_with_projection( + identity(), + grid, + config(), + fallback, + vec![0.5; 64], + CAP, + 4, + intent, + ) + .unwrap(); + (session, workspace) +} +fn selection_inputs() -> LiquidStepInputs<'static> { + const FORCE: [crate::BodyForce; 1] = [crate::BodyForce { + value: [0.001, 0.0, 0.0], + units: crate::ForceUnits::Acceleration, + region: None, + }]; + LiquidStepInputs { + requested_dt: 0.001, + forces: &FORCE, + ..inputs() + } +} + +#[test] +fn c1b3_projection_sqlite_both_producers_and_real_iteration_failure_fallback() { + use crate::projection_step::ProjectionProducerFailure; + use crate::solver_provider::composition::projection::ProjectionSelection; + for producer in PressureImplementation::ALL { + for cap in [2000, 1] { + let (mut session, mut workspace) = selection_fixture(producer, cap); + let fallback = session.snapshot().configuration().implementation; + assert_old_capture_refused(&session); + let run = + projection_run(&session.snapshot(), "B3 actual native method custody").unwrap(); + assert_eq!(run.solver, SELECTION_PROFILE); + assert!( + run.configuration + .starts_with(SELECTION_CONFIGURATION_PROFILE) + ); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run.clone(), limits).unwrap(); + recorder + .append(&projection_publication(&session.snapshot(), 0, CAP).unwrap()) + .unwrap(); + let accepted = session + .step_with_native_projection(selection_inputs(), &mut workspace, None, |_| false) + .unwrap(); + let row = projection_publication(&session.snapshot(), 1, CAP).unwrap(); + assert!(row.controls.starts_with(SELECTION_PUBLICATION_PROFILE)); + let decoded = RecordedProjectionSession::decode(&run, &row).unwrap(); + assert_eq!(decoded.native.configuration.implementation, fallback); + let a = decoded.attempt.as_ref().unwrap(); + assert_eq!(a.version, 2); + let selected = if cap == 1 { + assert!(a.producer.is_none()); + let failure = a + .producer_failure + .as_ref() + .expect("fixed cap-one fixture must really exhaust producer"); + assert_eq!(failure.implementation, producer); + assert!( + matches!(failure.failure,ProjectionProducerFailure::IterationLimit{iterations:1,residual_max} if residual_max.is_finite() && residual_max>=0.0) + ); + let q = a.qualification.as_ref().unwrap(); + assert_eq!(q.selection, ProjectionSelection::NativeBaseline); + assert!(q.witness.is_none() && q.rejection.is_none()); + fallback + } else { + assert!(a.producer_failure.is_none()); + assert_eq!(a.producer.as_ref().unwrap().implementation, producer); + assert_eq!( + a.qualification.as_ref().unwrap().selection, + ProjectionSelection::SuppliedCandidate + ); + producer + }; + assert_eq!( + decoded.native.receipt.as_ref().unwrap().selected, + RecordedPressureSelection::Native(selected) + ); + assert_eq!(a.selected_native.as_ref().unwrap().implementation, selected); + let (outer_header, _) = native_header(&run).unwrap(); + let (inner, _) = unwrap_publication(&run, &row); + // The old decoder retains its constructor-method rule. Only the + // new wrapper's private method adapter can admit selected producer. + assert_eq!( + provider::decode_native_with_controls(&outer_header, &row, &inner).is_ok(), + selected == fallback + ); + recorder.append(&row).unwrap(); + ProjectionTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Completed, + "selected method complete", + Some(&accepted.attempt), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(decoded); + drop(accepted); + drop(recorder); + drop(session); + drop(workspace); + let reader = RecordingReader::open(&archive, limits).unwrap(); + let cold = selection(&reader, &reader.select(1).unwrap()).unwrap(); + assert_eq!(cold.native.configuration.implementation, fallback); + assert_eq!( + cold.native.receipt.as_ref().unwrap().selected, + RecordedPressureSelection::Native(selected) + ); + assert_eq!( + verify_projection_recording(&reader) + .unwrap() + .verified_prior_links, + 1 + ); + let audit = terminal(&reader).unwrap(); + assert!(matches!( + audit.coverage, + RuntimeTerminalCoverage::VerifiedLastPublication + )); + assert_eq!( + audit + .termination + .attempt + .unwrap() + .producer_failure + .is_some(), + cap == 1 + ); + assert!(super::super::workflow::terminal(&reader).unwrap().is_none()); + drop(cold); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + } +} + +#[test] +fn c1b3_projection_cold_cancel_failed_and_accepted_unrecorded_tails() { + use crate::solver_provider::composition::projection::ProjectionCheckpoint; + for mode in 0..4 { + let (mut session, mut workspace) = selection_fixture( + PressureImplementation::JacobiPcgV1, + if mode == 0 { 1 } else { 2000 }, + ); + let run = projection_run(&session.snapshot(), "B3 tail custody").unwrap(); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + if mode == 3 { + recorder + .append(&projection_publication(&session.snapshot(), 0, CAP).unwrap()) + .unwrap(); + } + if mode == 2 { + workspace.set_fault(ProjectionFault::BadGauge); + } + let result = session.step_with_native_projection( + selection_inputs(), + &mut workspace, + None, + |stage| { + mode == 0 + && stage + == ProjectionStepStage::Qualification(ProjectionCheckpoint::BeforePressure) + || mode == 1 + && stage == ProjectionStepStage::Liquid(LiquidStepStage::BeforeCommit) + }, + ); + let (attempt, cause) = match result { + Ok(a) => { + assert_eq!(mode, 3); + (a.attempt, RuntimeTerminationCause::StorageFailure) + } + Err(f) => { + assert_ne!(mode, 3); + ( + f.attempt.unwrap(), + if mode == 2 { + RuntimeTerminationCause::NumericalFailure + } else { + RuntimeTerminationCause::Cancelled + }, + ) + } + }; + if mode == 0 { + assert!(attempt.producer_failure.is_some()); + assert!(attempt.qualification.is_none()); + } + ProjectionTermination::capture( + &session.snapshot(), + cause, + "observed unrecorded attempt", + Some(&attempt), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + assert!( + recorder + .run() + .configuration + .starts_with(SELECTION_CONFIGURATION_PROFILE) + ); + drop(attempt); + drop(recorder); + drop(session); + drop(workspace); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!( + reader + .status() + .unwrap() + .detail + .starts_with(SELECTION_TERMINAL_PROFILE) + ); + let audit = terminal(&reader).unwrap(); + assert_eq!(audit.termination.accepted_generation, u64::from(mode == 3)); + assert_eq!(audit.termination.attempt.as_ref().unwrap().version, 2); + if mode == 3 { + assert!(matches!( + audit.coverage, + RuntimeTerminalCoverage::UnrecordedAcceptedTail { + last_recorded_generation: Some(0) + } + )); + } else { + assert!(matches!( + audit.coverage, + RuntimeTerminalCoverage::NoRecordedPublication + )); + } + drop(reader); + std::fs::remove_file(archive).unwrap(); + } +} + +#[test] +fn c1b3_projection_selected_method_source_budget_and_profile_corruptions_refuse() { + let producer = PressureImplementation::JacobiPcgV1; + let (mut session, mut workspace) = selection_fixture(producer, 2000); + let run = projection_run(&session.snapshot(), "B3 ingress negatives").unwrap(); + session + .step_with_native_projection(selection_inputs(), &mut workspace, None, |_| false) + .unwrap(); + let row = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + let (inner, attempt) = unwrap_publication(&run, &row); + let attempt = attempt.unwrap(); + let (header, _) = native_header(&run).unwrap(); + // Rebind valid RCP2 bytes to the fallback header without changing the outer + // producer facts: matching metrics alone must not authorize the method. + let mut raw = Decoder::text(&inner, "RCP2:").unwrap().data; + raw[..32].copy_from_slice(&provider::source_binding(&header)); + let bad_inner = Encoder(raw).text("RCP2:").unwrap(); + let mut bad = projection_publication(&session.snapshot(), row.ordinal, CAP).unwrap(); + bad.controls = wrap_publication(&run, &bad_inner, &attempt); + assert!(RecordedProjectionSession::decode(&run, &bad).is_err()); + for bad_intent in [ + ProjectionIntent::BuiltinNativeV1, + ProjectionIntent::ClassicalSelectionV1 { + producer, + producer_max_iterations: 0, + }, + ProjectionIntent::ClassicalSelectionV1 { + producer, + producer_max_iterations: 2001, + }, + ProjectionIntent::ClassicalSelectionV1 { + producer: session.snapshot().configuration().implementation, + producer_max_iterations: 2000, + }, + ] { + let mut e = Encoder::default(); + put_wrapped(&mut e, &header.configuration, "RSC1:").unwrap(); + put_intent(&mut e, bad_intent); + let mut bad_run = run.clone(); + bad_run.configuration = e.text(SELECTION_CONFIGURATION_PROFILE).unwrap(); + assert!(configuration(&bad_run).is_err()); + } + for change in 0..5 { + let mut bad = projection_publication(&session.snapshot(), row.ordinal, CAP).unwrap(); + match change { + 0 => bad.controls = bad.controls.replacen("RPP2:", "RPP1:", 1), + 1 => bad.controls = bad.controls.replacen("RPP2:", "RPP3:", 1), + 2 => bad.controls.push_str(&"0".repeat(super::super::MAX_TEXT)), + 3 => bad.time += 0.001, + _ => { + let mut d = Decoder::text(&bad.controls, SELECTION_PUBLICATION_PROFILE).unwrap(); + d.data[0] ^= 1; + bad.controls = Encoder(d.data).text(SELECTION_PUBLICATION_PROFILE).unwrap(); + } + } + assert!(RecordedProjectionSession::decode(&run, &bad).is_err()); + } + // Version is structurally located after source, wrapped RCP2 and presence. + let mut d = Decoder::text(&row.controls, SELECTION_PUBLICATION_PROFILE).unwrap(); + d.array::<32>().unwrap(); + get_wrapped(&mut d, "RCP2:").unwrap(); + assert!(d.boolean().unwrap()); + let offset = 32 + 4 + Decoder::text(&inner, "RCP2:").unwrap().data.len() + 1; + d.data[offset..offset + 4].copy_from_slice(&1u32.to_le_bytes()); + let bad = RecordedStep { + controls: Encoder(d.data).text(SELECTION_PUBLICATION_PROFILE).unwrap(), + ..projection_publication(&session.snapshot(), row.ordinal, CAP).unwrap() + }; + assert!(RecordedProjectionSession::decode(&run, &bad).is_err()); + let mut old_profile = run.clone(); + old_profile.solver = PROFILE.into(); + assert!(configuration(&old_profile).is_err()); + assert!(provider::configured_configuration(&run).is_err()); +} + +#[test] +fn c1b3_projection_cold_iteration_failure_corruption_and_history_links_refuse() { + use crate::projection_step::ProjectionProducerFailure; + let (mut session, mut workspace) = selection_fixture(PressureImplementation::JacobiPcgV1, 1); + let run = projection_run(&session.snapshot(), "B3 cold corruptions").unwrap(); + let constructor = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + let result = session + .step_with_native_projection(selection_inputs(), &mut workspace, None, |_| false) + .unwrap(); + let row = projection_publication(&session.snapshot(), 1, CAP).unwrap(); + let a = &result.attempt; + let failure = a + .producer_failure + .as_ref() + .expect("fixed cap-one fixture must exhaust"); + let mut signature = Encoder::default(); + put_method(&mut signature, failure.implementation); + let ProjectionProducerFailure::IterationLimit { + iterations, + residual_max, + } = failure.failure; + signature.u8(0); + signature.u64(iterations as u64); + signature.f64(residual_max); + signature.f64(failure.residual_l2_limit); + put_duration(&mut signature, failure.elapsed); + for change in 0..5 { + let mut bad = projection_publication(&session.snapshot(), row.ordinal, CAP).unwrap(); + let mut d = Decoder::text(&row.controls, SELECTION_PUBLICATION_PROFILE).unwrap(); + let offsets: Vec<_> = d + .data + .windows(signature.0.len()) + .enumerate() + .filter_map(|(i, b)| (b == signature.0).then_some(i)) + .collect(); + assert_eq!( + offsets.len(), + 1, + "structural typed failure signature must be unique" + ); + let start = offsets[0]; + match change { + 0 => d.data[start + 2..start + 10].copy_from_slice(&0u64.to_le_bytes()), + 1 => d.data[start + 10..start + 18].copy_from_slice(&f64::NAN.to_le_bytes()), + 2 => d.data[start] = if d.data[start] == 0 { 1 } else { 0 }, + _ => {} + } + bad.controls = Encoder(d.data).text(SELECTION_PUBLICATION_PROFILE).unwrap(); + if change >= 3 { + let (inner, attempt) = unwrap_publication(&run, &row); + let mut altered = (*attempt.unwrap()).clone(); + if change == 3 { + altered.input_sha256[0] ^= 1; + } else { + altered.output_sha256.as_mut().unwrap()[0] ^= 1; + } + bad.controls = wrap_publication(&run, &inner, &altered); + } + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run.clone(), limits).unwrap(); + recorder.append(&constructor).unwrap(); + recorder.append(&bad).unwrap(); + recorder + .finish("failed", "authored B3 raw codec corruption", Some(1)) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(selection(&reader, &reader.select(1).unwrap()).is_err()); + assert!(verify_projection_recording(&reader).is_err()); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + // Duplicate attempt identities are separately rejected across valid retained + // rows, even when all new v2 failure facts are individually admissible. + session + .step_with_native_projection(selection_inputs(), &mut workspace, None, |_| false) + .unwrap(); + let second = projection_publication(&session.snapshot(), 2, CAP).unwrap(); + let (inner, attempt) = unwrap_publication(&run, &second); + let mut altered = (*attempt.unwrap()).clone(); + altered.attempt_id = a.attempt_id; + let second = RecordedStep { + controls: wrap_publication(&run, &inner, &altered), + ..second + }; + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder.append(&constructor).unwrap(); + recorder.append(&row).unwrap(); + recorder.append(&second).unwrap(); + recorder + .finish("failed", "duplicate B3 attempt", Some(2)) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(verify_projection_recording(&reader).is_err()); + drop(reader); + std::fs::remove_file(archive).unwrap(); +} + +#[test] +fn c1b3_projection_intent_decoder_refuses_foreign_version_before_payload() { + // The foreign tag is sufficient for Unsupported: v1 must never consume + // the new producer/method payload and turn this into a truncation error. + for (version, tag) in [(1, 2), (2, 1)] { + let mut decoder = + Decoder::text(&Encoder(vec![tag]).text("test:").unwrap(), "test:").unwrap(); + assert!(matches!( + get_intent(&mut decoder, version), + Err(RecordingError::Unsupported(_)) + )); + } + let mut decoder = Decoder::text(&Encoder(vec![2]).text("test:").unwrap(), "test:").unwrap(); + assert!(matches!( + get_intent(&mut decoder, 2), + Err(RecordingError::Invalid(_)) + )); +} + +#[test] +fn c1b3_projection_publication_and_terminal_refuse_foreign_attempt_version_before_payload() { + for expected_version in [1, 2] { + let (session, workspace) = if expected_version == 1 { + fixture(PressureImplementation::JacobiPcgV1) + } else { + selection_fixture(PressureImplementation::JacobiPcgV1, 2000) + }; + let run = projection_run(&session.snapshot(), "foreign embedded attempt version").unwrap(); + let (_, intent) = configuration(&run).unwrap(); + for truncated in [true, false] { + let mut row = projection_publication(&session.snapshot(), 0, CAP).unwrap(); + let (inner, _) = unwrap_publication(&run, &row); + let foreign_version = if expected_version == 1 { 2 } else { 1 }; + let mut attempt = Encoder::default(); + attempt.u32(foreign_version); + if !truncated { + attempt.0.extend_from_slice(&[0; 128]); + } + let mut encoder = Encoder::default(); + encoder.0.extend_from_slice(&provider::source_binding(&run)); + put_wrapped(&mut encoder, &inner, "RCP2:").unwrap(); + encoder.boolean(true); + encoder.0.extend_from_slice(&attempt.0); + row.controls = encoder.text(profiles(intent).2).unwrap(); + assert!(matches!( + RecordedProjectionSession::decode(&run, &row), + Err(RecordingError::Unsupported(_)) + )); + let mut encoder = Encoder::default(); + encoder.0.extend_from_slice(&provider::source_binding(&run)); + put_cause(&mut encoder, RuntimeTerminationCause::Cancelled); + encoder.string("foreign embedded version").unwrap(); + encoder.u64(0); + encoder.f64(0.0); + encoder.boolean(true); + encoder.0.extend_from_slice(&attempt.0); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run.clone(), limits).unwrap(); + recorder + .finish( + "cancelled", + &encoder.text(profiles(intent).3).unwrap(), + Some(0), + ) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(matches!( + terminal(&reader), + Err(RecordingError::Unsupported(_)) + )); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + drop(workspace); + } +} diff --git a/src/recording/provider.rs b/src/recording/provider.rs index 50afc797..e3eb1f1f 100644 --- a/src/recording/provider.rs +++ b/src/recording/provider.rs @@ -111,6 +111,18 @@ pub struct ConfiguredHistoryCoverage { pub fn configured_run( snapshot: &SessionSnapshot<'_>, provenance: &str, +) -> Result { + if snapshot.projection_intent().is_some() { + return Err(RecordingError::Unsupported( + "configured capture of projection Session", + )); + } + native_run(snapshot, provenance) +} + +pub(super) fn native_run( + snapshot: &SessionSnapshot<'_>, + provenance: &str, ) -> Result { let grid = snapshot.grid(); let mut e = Encoder::default(); @@ -128,6 +140,25 @@ pub fn configured_run( configured_configuration(&run)?; Ok(run) } +/// Adapt only the native algorithm identity for the projection wrapper after +/// its outer receipt has established the actual selected role. All other +/// constructor and source fields retain their original values. +pub(super) fn native_header_with_method( + run: &RecordingRun, + implementation: PressureImplementation, +) -> Result { + let mut configuration = configured_configuration(run)?; + configuration.implementation = implementation; + let mut encoder = Encoder::default(); + put_configuration(&mut encoder, &configuration); + let adapted = RecordingRun { + configuration: encoder.text(CONFIG)?, + ..run.clone() + }; + configured_configuration(&adapted)?; + Ok(adapted) +} + /// Capture the Session's accepted arrays and receipt, never provider scratch. /// A failed later attempt leaves the same snapshot; callers append only after /// a successful interval. Recording failure never rolls physics back. @@ -136,17 +167,13 @@ pub fn configured_publication( ordinal: usize, limit: usize, ) -> Result { - let state = snapshot.state(); - let run = configured_run(snapshot, "source binding")?; - if state.pressure_surface.is_some() - || state.pressure_columns.is_some() - || state.reconstructed_surface.is_some() - || state.flat_column_mac - { - return Err(RecordingError::Unsupported("configured recording geometry")); + if snapshot.projection_intent().is_some() { + return Err(RecordingError::Unsupported( + "configured capture of projection Session", + )); } - let report = snapshot.report(); let initial = snapshot.stage() == SnapshotStage::Constructor; + let report = snapshot.report(); let receipt = if initial { if snapshot.configured_provider_report().is_some() { return Err(RecordingError::Invalid("constructor provider receipt")); @@ -162,6 +189,46 @@ pub fn configured_publication( report.is_some_and(|r| r.viscosity.is_some()), )?) }; + capture_native(snapshot, ordinal, limit, receipt) +} + +pub(super) fn capture_native( + snapshot: &SessionSnapshot<'_>, + ordinal: usize, + limit: usize, + receipt: Option, +) -> Result { + capture_native_with_method( + snapshot, + ordinal, + limit, + receipt, + snapshot.configuration().implementation, + ) +} + +pub(super) fn capture_native_with_method( + snapshot: &SessionSnapshot<'_>, + ordinal: usize, + limit: usize, + receipt: Option, + implementation: PressureImplementation, +) -> Result { + let state = snapshot.state(); + let run = native_header_with_method(&native_run(snapshot, "source binding")?, implementation)?; + let configuration = configured_configuration(&run)?; + if state.pressure_surface.is_some() + || state.pressure_columns.is_some() + || state.reconstructed_surface.is_some() + || state.flat_column_mac + { + return Err(RecordingError::Unsupported("configured recording geometry")); + } + let report = snapshot.report(); + let initial = snapshot.stage() == SnapshotStage::Constructor; + if initial != receipt.is_none() { + return Err(RecordingError::Invalid("native snapshot receipt stage")); + } let dt = report.map(|r| r.carrier.step.dt); if report.is_some_and(|r| { r.carrier.step.generation != state.carrier.generation @@ -298,7 +365,7 @@ pub fn configured_publication( if let Some(receipt) = &receipt { validate_receipt( receipt, - snapshot.configuration(), + &configuration, snapshot.grid(), &step, start.ok_or(RecordingError::Invalid("configured interval"))?, @@ -317,6 +384,11 @@ pub fn configured_publication_with_runtime( limit: usize, observation: Option<&runtime::RuntimeObservation>, ) -> Result { + if snapshot.projection_intent().is_some() { + return Err(RecordingError::Unsupported( + "configured capture of projection Session", + )); + } if let Some(observation) = observation { let receipt = owned_receipt( snapshot @@ -355,10 +427,15 @@ struct PublicationControls { fn decode_controls( run: &RecordingRun, step: &RecordedStep, + encoded_controls: &str, ) -> Result { - let has_runtime = step.controls.starts_with(RUNTIME_RECEIPT); + let workflow = super::workflow::split_publication_controls(encoded_controls)?; + let controls = workflow + .as_ref() + .map_or(encoded_controls, |(controls, _, _)| controls.as_str()); + let has_runtime = controls.starts_with(RUNTIME_RECEIPT); let mut d = Decoder::text( - &step.controls, + controls, if has_runtime { RUNTIME_RECEIPT } else { @@ -397,6 +474,12 @@ fn decode_controls( ))?, )?; } + if let Some((_, attempt, source)) = &workflow { + if *source != source_binding(run) { + return Err(RecordingError::Invalid("workflow publication source")); + } + super::workflow::validate_publication(run, step, attempt, receipt.as_ref())?; + } Ok(PublicationControls { carrier_stamp, fraction_stamp, @@ -417,163 +500,171 @@ fn recorded_metadata( ), RecordingError, > { - let controls = decode_controls(run, step)?; + let controls = decode_controls(run, step, &step.controls)?; Ok((controls.receipt, controls.runtime)) } impl RecordedConfiguredSession { pub fn decode(run: &RecordingRun, step: &RecordedStep) -> Result { - run.validate()?; - step.payload_bytes()?; - let configuration = configured_configuration(run)?; - let grid = GridGeometry::new(run.counts, run.spacing, run.origin) - .map_err(|_| RecordingError::Invalid("configured geometry"))?; - let PublicationControls { - carrier_stamp, - fraction_stamp, - fraction_time, - receipt, - runtime, - } = decode_controls(run, step)?; - let initial = step.stage == SnapshotStage::Constructor; - if initial != receipt.is_none() - || step.fields.len() != if initial { 5 } else { 6 } - || carrier_stamp.id != configuration.transport.carrier_id - || carrier_stamp.version != step.generation - || fraction_stamp.id != configuration.transport.volume_stamp.id - || configuration - .transport - .volume_stamp - .version - .checked_add(step.generation) - != Some(fraction_stamp.version) - || fraction_time.to_bits() != step.time.to_bits() - || step.generation > configuration.max_steps as u64 - { - return Err(RecordingError::Invalid( - "configured publication association", - )); - } - let numerical_bytes = step - .fields - .iter() - .try_fold(0usize, |n, f| n.checked_add(f.data.len())) - .ok_or(RecordingError::Limit("configured field bytes"))?; - if numerical_bytes > configuration.transport.carrier.memory_limit { - return Err(RecordingError::Invalid( - "configured constructor memory bound", - )); - } - let stage = if initial { "constructor" } else { "accepted" }; - let mut faces = Vec::new(); - for (i, (name, axis)) in [ - ("velocity_x", Axis::X), - ("velocity_y", Axis::Y), - ("velocity_z", Axis::Z), - ] - .into_iter() - .enumerate() - { - faces.push(f32_values(required( - step, - name, - "f32", - "m/s", - FACE[i], - stage, - grid.face_counts(axis), - None, - )?)?); - } - let tracer = f32_values(required( + decode_native_with_controls(run, step, &step.controls) + } +} + +pub(super) fn decode_native_with_controls( + run: &RecordingRun, + step: &RecordedStep, + controls: &str, +) -> Result { + run.validate()?; + step.payload_bytes()?; + let configuration = configured_configuration(run)?; + let grid = GridGeometry::new(run.counts, run.spacing, run.origin) + .map_err(|_| RecordingError::Invalid("configured geometry"))?; + let PublicationControls { + carrier_stamp, + fraction_stamp, + fraction_time, + receipt, + runtime, + } = decode_controls(run, step, controls)?; + let initial = step.stage == SnapshotStage::Constructor; + if initial != receipt.is_none() + || step.fields.len() != if initial { 5 } else { 6 } + || carrier_stamp.id != configuration.transport.carrier_id + || carrier_stamp.version != step.generation + || fraction_stamp.id != configuration.transport.volume_stamp.id + || configuration + .transport + .volume_stamp + .version + .checked_add(step.generation) + != Some(fraction_stamp.version) + || fraction_time.to_bits() != step.time.to_bits() + || step.generation > configuration.max_steps as u64 + { + return Err(RecordingError::Invalid( + "configured publication association", + )); + } + let numerical_bytes = step + .fields + .iter() + .try_fold(0usize, |n, f| n.checked_add(f.data.len())) + .ok_or(RecordingError::Limit("configured field bytes"))?; + if numerical_bytes > configuration.transport.carrier.memory_limit { + return Err(RecordingError::Invalid( + "configured constructor memory bound", + )); + } + let stage = if initial { "constructor" } else { "accepted" }; + let mut faces = Vec::new(); + for (i, (name, axis)) in [ + ("velocity_x", Axis::X), + ("velocity_y", Axis::Y), + ("velocity_z", Axis::Z), + ] + .into_iter() + .enumerate() + { + faces.push(f32_values(required( step, - "tracer", + name, "f32", - "1", - CELL, + "m/s", + FACE[i], stage, - grid.counts(), + grid.face_counts(axis), None, - )?)?; - let fraction = f64_values(required( + )?)?); + } + let tracer = f32_values(required( + step, + "tracer", + "f32", + "1", + CELL, + stage, + grid.counts(), + None, + )?)?; + let fraction = f64_values(required( + step, + "fraction", + "f64", + "1", + CELL, + stage, + grid.counts(), + None, + )?)?; + if tracer.iter().any(|v| !(0.0..=1.0).contains(v)) + || fraction.iter().any(|v| !(0.0..=1.0).contains(v)) + { + return Err(RecordingError::Invalid("configured scalar range")); + } + if receipt.as_ref().is_some_and(|r| r.viscosity_applied) + && configuration.transport.carrier.density.to_bits() + != configuration.transport.represented_density.to_bits() + { + return Err(RecordingError::Invalid("configured viscous domain")); + } + let interval_pressure = if let Some(r) = &receipt { + let p = step + .field("interval_pressure") + .ok_or(RecordingError::Invalid("configured field inventory"))?; + let start = p + .evaluation_time + .ok_or(RecordingError::Invalid("configured interval"))?; + let dt = step + .dt + .ok_or(RecordingError::Invalid("configured interval"))?; + if !start.is_finite() + || start < 0.0 + || start >= step.time + || (start + dt).to_bits() != step.time.to_bits() + || (step.generation == 1 && start.to_bits() != 0.0_f64.to_bits()) + { + return Err(RecordingError::Invalid("configured interval")); + } + validate_receipt(r, &configuration, &grid, step, start)?; + let values = f64_values(required( step, - "fraction", + "interval_pressure", "f64", - "1", + "Pa", CELL, - stage, + PRESSURE, grid.counts(), - None, + Some(start), )?)?; - if tracer.iter().any(|v| !(0.0..=1.0).contains(v)) - || fraction.iter().any(|v| !(0.0..=1.0).contains(v)) - { - return Err(RecordingError::Invalid("configured scalar range")); - } - if receipt.as_ref().is_some_and(|r| r.viscosity_applied) - && configuration.transport.carrier.density.to_bits() - != configuration.transport.represented_density.to_bits() - { - return Err(RecordingError::Invalid("configured viscous domain")); + if values[0] != 0.0 { + return Err(RecordingError::Invalid("configured pressure gauge")); } - let interval_pressure = if let Some(r) = &receipt { - let p = step - .field("interval_pressure") - .ok_or(RecordingError::Invalid("configured field inventory"))?; - let start = p - .evaluation_time - .ok_or(RecordingError::Invalid("configured interval"))?; - let dt = step - .dt - .ok_or(RecordingError::Invalid("configured interval"))?; - if !start.is_finite() - || start < 0.0 - || start >= step.time - || (start + dt).to_bits() != step.time.to_bits() - || (step.generation == 1 && start.to_bits() != 0.0_f64.to_bits()) - { - return Err(RecordingError::Invalid("configured interval")); - } - validate_receipt(r, &configuration, &grid, step, start)?; - let values = f64_values(required( - step, - "interval_pressure", - "f64", - "Pa", - CELL, - PRESSURE, - grid.counts(), - Some(start), - )?)?; - if values[0] != 0.0 { - return Err(RecordingError::Invalid("configured pressure gauge")); - } - Some((start, values)) - } else { - None - }; - let z = faces.pop().unwrap(); - let y = faces.pop().unwrap(); - let x = faces.pop().unwrap(); - Ok(Self { - grid, - configuration, - generation: step.generation, - time: step.time, - dt: step.dt, - carrier_stamp, - fraction_stamp, - fraction_time, - x, - y, - z, - tracer, - fraction, - interval_pressure, - receipt, - runtime, - }) - } + Some((start, values)) + } else { + None + }; + let z = faces.pop().unwrap(); + let y = faces.pop().unwrap(); + let x = faces.pop().unwrap(); + Ok(RecordedConfiguredSession { + grid, + configuration, + generation: step.generation, + time: step.time, + dt: step.dt, + carrier_stamp, + fraction_stamp, + fraction_time, + x, + y, + z, + tracer, + fraction, + interval_pressure, + receipt, + runtime, + }) } /// Recompute prior accepted-pressure hashes where the previous publication is @@ -595,10 +686,25 @@ pub fn verify_configured_recording( // Only a digest and lineage survive each iteration, not a second field set. let mut previous: Option<(u64, f64, [u8; 32])> = None; let mut previous_time: Option = None; + let mut previous_native: Option<[u8; 32]> = None; + let mut previous_attempt_id: Option = None; let mut history: Option<(f64, usize, bool)> = None; for ordinal in 0..reader.count()? { let step = reader.select(ordinal)?; let current = RecordedConfiguredSession::decode(reader.run(), &step)?; + if let Some((_, attempt, _)) = super::workflow::split_publication_controls(&step.controls)? + { + if previous_native.is_some_and(|digest| digest != attempt.input_sha256) { + return Err(RecordingError::Invalid("workflow prior native input")); + } + if previous_attempt_id.is_some_and(|prior| attempt.attempt_id <= prior) { + return Err(RecordingError::Invalid( + "workflow attempt identity sequence", + )); + } + previous_attempt_id = Some(attempt.attempt_id); + } + previous_native = Some(super::workflow::native_state_digest(¤t)?); if let Some((start, _)) = ¤t.interval_pressure && previous_time.is_some_and(|time| time.to_bits() != start.to_bits()) { @@ -782,7 +888,7 @@ fn validate_pressure(p: PressureReport, accepted: bool) -> Result<(), RecordingE } // Bind each publication to its actual Session identity and immutable source // configuration/geometry. Caller provenance is intentionally not an identity. -fn source_binding(run: &RecordingRun) -> [u8; 32] { +pub(super) fn source_binding(run: &RecordingRun) -> [u8; 32] { let mut hash = Sha256::new(); hash.update(run.identity.run_id.to_le_bytes()); hash_text(&mut hash, &run.identity.source_revision); @@ -1198,33 +1304,33 @@ fn get_pressure(d: &mut Decoder) -> Result { } #[derive(Default)] -struct Encoder(Vec); +pub(super) struct Encoder(pub(super) Vec); impl Encoder { - fn u8(&mut self, v: u8) { + pub(super) fn u8(&mut self, v: u8) { self.0.push(v); } - fn boolean(&mut self, v: bool) { + pub(super) fn boolean(&mut self, v: bool) { self.u8(u8::from(v)); } - fn u32(&mut self, v: u32) { + pub(super) fn u32(&mut self, v: u32) { self.0.extend_from_slice(&v.to_le_bytes()); } - fn u64(&mut self, v: u64) { + pub(super) fn u64(&mut self, v: u64) { self.0.extend_from_slice(&v.to_le_bytes()); } - fn usize(&mut self, v: usize) { + pub(super) fn usize(&mut self, v: usize) { self.u64(v as u64); } - fn f64(&mut self, v: f64) { + pub(super) fn f64(&mut self, v: f64) { self.u64(v.to_bits()); } - fn string(&mut self, v: &str) -> Result<(), RecordingError> { + pub(super) fn string(&mut self, v: &str) -> Result<(), RecordingError> { bounded(v)?; self.u32(v.len() as u32); self.0.extend_from_slice(v.as_bytes()); Ok(()) } - fn text(self, prefix: &str) -> Result { + pub(super) fn text(self, prefix: &str) -> Result { if self.0.len() > (MAX_TEXT - prefix.len()) / 2 { return Err(RecordingError::Limit("configured receipt text")); } @@ -1237,12 +1343,12 @@ impl Encoder { Ok(out) } } -struct Decoder { - data: Vec, +pub(super) struct Decoder { + pub(super) data: Vec, at: usize, } impl Decoder { - fn text(value: &str, prefix: &str) -> Result { + pub(super) fn text(value: &str, prefix: &str) -> Result { if value.len() > MAX_TEXT { return Err(RecordingError::Limit("configured metadata")); } @@ -1268,7 +1374,7 @@ impl Decoder { } Ok(Self { data, at: 0 }) } - fn array(&mut self) -> Result<[u8; N], RecordingError> { + pub(super) fn array(&mut self) -> Result<[u8; N], RecordingError> { let end = self .at .checked_add(N) @@ -1282,29 +1388,29 @@ impl Decoder { self.at = end; Ok(value) } - fn u8(&mut self) -> Result { + pub(super) fn u8(&mut self) -> Result { Ok(self.array::<1>()?[0]) } - fn boolean(&mut self) -> Result { + pub(super) fn boolean(&mut self) -> Result { match self.u8()? { 0 => Ok(false), 1 => Ok(true), _ => Err(RecordingError::Invalid("configured boolean")), } } - fn u32(&mut self) -> Result { + pub(super) fn u32(&mut self) -> Result { Ok(u32::from_le_bytes(self.array()?)) } - fn u64(&mut self) -> Result { + pub(super) fn u64(&mut self) -> Result { Ok(u64::from_le_bytes(self.array()?)) } - fn usize(&mut self) -> Result { + pub(super) fn usize(&mut self) -> Result { usize::try_from(self.u64()?).map_err(|_| RecordingError::Limit("configured integer")) } - fn f64(&mut self) -> Result { + pub(super) fn f64(&mut self) -> Result { Ok(f64::from_bits(self.u64()?)) } - fn string(&mut self) -> Result { + pub(super) fn string(&mut self) -> Result { let len = self.u32()? as usize; if len > 1000 { return Err(RecordingError::Invalid("configured text")); @@ -1323,7 +1429,7 @@ impl Decoder { self.at = end; Ok(text.into()) } - fn end(self) -> Result<(), RecordingError> { + pub(super) fn end(self) -> Result<(), RecordingError> { if self.at != self.data.len() { Err(RecordingError::Invalid("configured trailing metadata")) } else { diff --git a/src/recording/provider/runtime.rs b/src/recording/provider/runtime.rs index 9467717a..50be9627 100644 --- a/src/recording/provider/runtime.rs +++ b/src/recording/provider/runtime.rs @@ -316,6 +316,8 @@ impl RuntimeTermination { } pub fn decode(run: &RecordingRun, status: &RecordingStatus) -> Result { + let workflow = crate::recording::workflow::split_terminal_status(status)?; + let status = workflow.as_ref().map_or(status, |(status, _, _)| status); if status.outcome == "active" { return Err(RecordingError::Unsupported("runtime active termination")); } @@ -353,6 +355,14 @@ impl RuntimeTermination { source, }; termination.validate(run)?; + if let Some((_, attempt, source)) = &workflow { + crate::recording::workflow::validate_terminal_binding( + run, + &termination, + attempt, + *source, + )?; + } if status.outcome != cause.outcome() || status.accepted_generation != Some(accepted_generation) { @@ -407,7 +417,7 @@ impl RuntimeTermination { Ok(()) } - fn encode(&self) -> Result { + pub(in crate::recording) fn encode(&self) -> Result { let mut encoder = Encoder::default(); encoder.0.extend_from_slice(&self.source); encoder.u8(match self.cause { @@ -789,7 +799,7 @@ fn get_context(decoder: &mut Decoder) -> Result Result<(), RecordingError> { @@ -807,7 +817,9 @@ fn put_binding( encoder.string(&binding.runtime)?; encoder.string(&binding.source_revision) } -fn get_binding(decoder: &mut Decoder) -> Result { +pub(in crate::recording) fn get_binding( + decoder: &mut Decoder, +) -> Result { Ok(ContextProviderIdentity { id: decoder.string()?, version: decoder.string()?, diff --git a/src/recording/workflow.rs b/src/recording/workflow.rs new file mode 100644 index 00000000..00a2c1d2 --- /dev/null +++ b/src/recording/workflow.rs @@ -0,0 +1,2078 @@ +//! Additive bounded workflow custody inside the existing SQLite v1 envelope. +//! RCP4 wraps an unchanged RCP2/RCP3 publication; RCT2 wraps unchanged RCT1 +//! terminal facts. Failed attempts are terminal diagnostics, never accepted rows. +use super::provider::runtime::{ + self, RuntimeObservation, RuntimeTermination, RuntimeTerminationAudit, RuntimeTerminationCause, +}; +use super::provider::{ + self, Decoder, Encoder, RecordedConfiguredReceipt, RecordedPressureSelection, +}; +use super::{ + RecordedStep, RecordingError, RecordingReader, RecordingRun, RecordingStatus, StepRecorder, +}; +use crate::workflow::{ + AttemptOutcome, MAX_NODES, NodeKind, NodeReceipt, NodeStatus, PressureFacts, WorkflowAttempt, + WorkflowDescriptor, +}; +use crate::{ + GridGeometry, PressureImplementation, PressureReport, PressureSettings, SessionSnapshot, +}; +use std::sync::Arc; + +pub const PUBLICATION_PROFILE: &str = "RCP4:"; +pub const TERMINAL_PROFILE: &str = "RCT2:"; + +pub(super) type PublicationEnvelope = (String, Arc, [u8; 32]); +pub(super) type TerminalEnvelope = (RecordingStatus, Option>, [u8; 32]); + +/// Publication evidence remains unavailable for historical profiles. Decode the +/// complete numerical publication before returning its associated graph facts. +pub fn publication( + run: &RecordingRun, + step: &RecordedStep, +) -> Result>, RecordingError> { + if run.solver != provider::PROFILE { + if (run.solver.starts_with("rheon-carrier-full-box-v1/") + || run.solver.starts_with("rheon-sph-preview/")) + && !step.controls.starts_with("RCP") + { + return Ok(None); + } + return Err(RecordingError::Unsupported( + "workflow publication source profile", + )); + } + provider::RecordedConfiguredSession::decode(run, step)?; + Ok(split_publication_controls(&step.controls)?.map(|(_, attempt, _)| attempt)) +} + +/// Explicit selection-time validation against the immediately preceding retained +/// native state. Reads at most one additional row; cached paint does no I/O. +/// An archive without the prior publication cannot supply this extra proof. +pub fn selection( + reader: &RecordingReader, + step: &RecordedStep, +) -> Result>, RecordingError> { + let evidence = publication(reader.run(), step)?; + if let Some(attempt) = &evidence + && step.ordinal > 0 + { + let previous = reader.select(step.ordinal - 1)?; + let native = provider::RecordedConfiguredSession::decode(reader.run(), &previous)?; + if let Some((_, prior, _)) = split_publication_controls(&previous.controls)? + && attempt.attempt_id <= prior.attempt_id + { + return Err(RecordingError::Invalid( + "workflow selected attempt identity", + )); + } + if native.generation != attempt.accepted_generation + || native.time.to_bits() != attempt.interval_start.to_bits() + || native_state_digest(&native)? != attempt.input_sha256 + { + return Err(RecordingError::Invalid( + "workflow selected prior native input", + )); + } + } + Ok(evidence) +} + +pub fn configured_publication_with_workflow( + snapshot: &SessionSnapshot<'_>, + ordinal: usize, + limit: usize, + runtime: Option<&RuntimeObservation>, +) -> Result { + let mut step = + provider::configured_publication_with_runtime(snapshot, ordinal, limit, runtime)?; + if let Some(attempt) = snapshot + .configured_provider_report() + .and_then(|report| report.workflow.as_ref()) + { + let mut encoder = Encoder::default(); + encoder + .0 + .extend_from_slice(&provider::source_binding(&provider::configured_run( + snapshot, + "workflow source", + )?)); + encoder.boolean(step.controls.starts_with("RCP3:")); + put_wrapped( + &mut encoder, + &step.controls, + if step.controls.starts_with("RCP3:") { + "RCP3:" + } else { + "RCP2:" + }, + )?; + put_attempt(&mut encoder, attempt)?; + step.controls = encoder.text(PUBLICATION_PROFILE)?; + if step.payload_bytes()? > limit { + return Err(RecordingError::Limit("workflow publication")); + } + provider::RecordedConfiguredSession::decode( + &provider::configured_run(snapshot, "workflow binding")?, + &step, + )?; + } + Ok(step) +} + +pub(super) fn split_publication_controls( + controls: &str, +) -> Result, RecordingError> { + if !controls.starts_with(PUBLICATION_PROFILE) { + return Ok(None); + } + let mut decoder = Decoder::text(controls, PUBLICATION_PROFILE)?; + let source = decoder.array()?; + let runtime = decoder.boolean()?; + let original = get_wrapped(&mut decoder, if runtime { "RCP3:" } else { "RCP2:" })?; + if !original.starts_with("RCP2:") && !original.starts_with("RCP3:") { + return Err(RecordingError::Unsupported( + "workflow wrapped publication profile", + )); + } + let attempt = Arc::new(get_attempt(&mut decoder)?); + decoder.end()?; + Ok(Some((original, attempt, source))) +} + +fn validate_source(run: &RecordingRun, attempt: &WorkflowAttempt) -> Result<(), RecordingError> { + attempt.validate().map_err(RecordingError::Invalid)?; + let config = provider::configured_configuration(run)?; + let d = &attempt.descriptor; + let p = config.transport.carrier.pressure; + if attempt.run_id != run.identity.run_id + || d.grid.counts().map(|n| n as u64) != run.counts + || d.grid.spacing().map(f64::to_bits) != run.spacing.map(f64::to_bits) + || d.grid.origin().map(f64::to_bits) != run.origin.map(f64::to_bits) + || d.density.to_bits() != config.transport.carrier.density.to_bits() + || d.implementation != config.implementation + || d.pressure.max_iterations != p.max_iterations + || [ + d.pressure.relative_residual, + d.pressure.absolute_residual, + d.pressure.divergence_limit, + d.actual_divergence_limit, + d.max_courant, + ] + .map(f64::to_bits) + != [ + p.relative_residual, + p.absolute_residual, + p.divergence_limit, + config.transport.carrier.actual_divergence_limit, + config.transport.carrier.max_courant, + ] + .map(f64::to_bits) + || attempt.attempted_generation > config.max_steps as u64 + { + return Err(RecordingError::Invalid("workflow source association")); + } + Ok(()) +} + +/// Reuse the numerical owner's canonical native-input digest over the exact +/// decoded fields. Constructor pressure is explicitly zero in this profile. +pub(super) fn native_state_digest( + recorded: &provider::RecordedConfiguredSession, +) -> Result<[u8; 32], RecordingError> { + let mut initial_pressure = Vec::new(); + let pressure = if let Some((_, pressure)) = &recorded.interval_pressure { + pressure.as_slice() + } else { + initial_pressure + .try_reserve_exact(recorded.grid.cell_len()) + .map_err(|_| RecordingError::Limit("workflow constructor pressure"))?; + initial_pressure.resize(recorded.grid.cell_len(), 0.0); + initial_pressure.as_slice() + }; + Ok(crate::workflow::input_digest(crate::LiquidTransportView { + carrier: crate::StateView { + x: &recorded.x, + y: &recorded.y, + z: &recorded.z, + tracer: &recorded.tracer, + time: recorded.time, + generation: recorded.generation, + }, + liquid: crate::LiquidVolumeView { + fraction: &recorded.fraction, + stamp: recorded.fraction_stamp, + time: recorded.fraction_time, + density: recorded.configuration.transport.represented_density, + }, + pressure, + carrier_stamp: recorded.carrier_stamp, + pressure_surface: None, + reconstructed_surface: None, + pressure_columns: None, + flat_column_mac: false, + })) +} + +pub(super) fn validate_publication( + run: &RecordingRun, + step: &RecordedStep, + attempt: &WorkflowAttempt, + receipt: Option<&RecordedConfiguredReceipt>, +) -> Result<(), RecordingError> { + validate_source(run, attempt)?; + let receipt = receipt.ok_or(RecordingError::Invalid("workflow without accepted receipt"))?; + if attempt.outcome != AttemptOutcome::Accepted + || attempt.publication != Some(step.generation) + || attempt.actual_dt.map(f64::to_bits) != step.dt.map(f64::to_bits) + || attempt + .actual_dt + .is_none_or(|dt| (attempt.interval_start + dt).to_bits() != step.time.to_bits()) + || attempt.descriptor.viscosity.is_some() != receipt.viscosity_applied + || attempt.descriptor.viscosity.unwrap_or(0.0).to_bits() + != receipt.dynamic_viscosity.to_bits() + { + return Err(RecordingError::Invalid("workflow publication association")); + } + let pressure = attempt + .pressure + .as_ref() + .ok_or(RecordingError::Invalid("workflow accepted pressure absent"))?; + let selected = match receipt.selected { + RecordedPressureSelection::Native(method) => method.id(), + RecordedPressureSelection::Configured => "configured-pressure-context-v1", + }; + if pressure.selected != selected + || pressure.binding != receipt.binding + || pressure.prediction_called != receipt.prediction_called + || pressure.accepted.map(report_bits) != Some(report_bits(receipt.accepted)) + || pressure.candidate.map(report_bits) != receipt.candidate.map(report_bits) + || receipt + .context + .as_ref() + .is_some_and(|c| pressure.rhs_sha256 != Some(c.rhs_sha256)) + || pressure.rejection + != receipt + .rejection + .as_ref() + .map(|rejection| format!("{rejection:?}")) + || pressure.pressure_call_ns != u64::try_from(receipt.total.as_nanos()).ok() + { + return Err(RecordingError::Invalid( + "workflow pressure receipt association", + )); + } + Ok(()) +} + +fn validate_runtime_outcome( + attempt: &WorkflowAttempt, + observation: &RuntimeObservation, +) -> Result<(), RecordingError> { + use super::diagnostic::NoCandidateReason; + let pressure = attempt + .pressure + .as_ref() + .ok_or(RecordingError::Invalid("workflow runtime pressure absent"))?; + let returned = attempt.nodes.iter().any(|node| { + node.node == NodeKind::PressureCandidate && node.status == NodeStatus::CandidateReturned + }); + let rejected = attempt.nodes.iter().any(|node| { + node.node == NodeKind::PressureCandidate && node.status == NodeStatus::Rejected + }); + let valid = match &observation.outcome { + runtime::RuntimeOutcome::CandidateReturned => { + returned + && !rejected + && pressure.rejection.as_deref().is_none_or(|reason| { + matches!(reason, "QualityGate" | "NonFiniteOutput" | "NonZeroGauge") + }) + } + runtime::RuntimeOutcome::NoCandidate { reason, .. } => { + !returned + && rejected + && pressure.candidate.is_none() + && match reason { + NoCandidateReason::Cancelled => { + pressure.rejection.as_deref() == Some("Cancelled") + } + NoCandidateReason::Unsupported | NoCandidateReason::UnsupportedContext => { + pressure + .rejection + .as_deref() + .is_some_and(|reason| reason.starts_with("Unsupported(")) + } + NoCandidateReason::RuntimeFailure | NoCandidateReason::InvalidOutput => { + pressure + .rejection + .as_deref() + .is_some_and(|reason| reason.starts_with("Execution(")) + } + } + } + }; + if !valid { + return Err(RecordingError::Invalid( + "workflow runtime outcome association", + )); + } + Ok(()) +} + +/// Terminal workflow facts have a separate publication association and may +/// describe an attempt after generation zero with no recorded publication. +#[derive(Debug, Clone)] +pub struct WorkflowTerminationAudit { + pub runtime: RuntimeTerminationAudit, + pub attempt: Option>, +} + +pub struct WorkflowTermination { + runtime: RuntimeTermination, + attempt: Option>, + source: [u8; 32], +} +impl WorkflowTermination { + pub fn capture( + snapshot: &SessionSnapshot<'_>, + cause: RuntimeTerminationCause, + detail: &str, + runtime: Option<&RuntimeObservation>, + attempt: Option<&Arc>, + ) -> Result { + let runtime = RuntimeTermination::capture(snapshot, cause, detail, runtime)?; + let value = Self { + runtime, + attempt: attempt.cloned(), + source: provider::source_binding(&provider::configured_run( + snapshot, + "workflow terminal source", + )?), + }; + value.validate(&provider::configured_run( + snapshot, + "workflow terminal source", + )?)?; + value.encode()?; + Ok(value) + } + fn validate(&self, run: &RecordingRun) -> Result<(), RecordingError> { + if self.source != provider::source_binding(run) { + return Err(RecordingError::Invalid("workflow terminal source")); + } + if let Some(attempt) = &self.attempt { + validate_source(run, attempt)?; + if let Some(observation) = &self.runtime.observation { + let pressure = attempt.pressure.as_ref().ok_or(RecordingError::Invalid( + "workflow terminal runtime facts absent", + ))?; + if observation.request.context.generation != attempt.attempted_generation + || observation.request.context.interval_start.to_bits() + != attempt.interval_start.to_bits() + || Some(observation.request.context.dt.to_bits()) + != attempt.actual_dt.map(f64::to_bits) + || pressure.binding.as_ref() != Some(&observation.request.binding) + || pressure.rhs_sha256 != Some(observation.request.context.rhs_sha256) + || !pressure.prediction_called + { + return Err(RecordingError::Invalid( + "workflow terminal runtime association", + )); + } + validate_runtime_outcome(attempt, observation)?; + } + if let Some(generation) = attempt.publication { + if generation != self.runtime.accepted_generation + || attempt.actual_dt.is_none_or(|dt| { + (attempt.interval_start + dt).to_bits() + != self.runtime.accepted_time.to_bits() + }) + { + return Err(RecordingError::Invalid( + "workflow terminal accepted association", + )); + } + } else if attempt.accepted_generation != self.runtime.accepted_generation + || attempt.interval_start.to_bits() != self.runtime.accepted_time.to_bits() + || self.runtime.cause == RuntimeTerminationCause::Completed + { + return Err(RecordingError::Invalid( + "workflow terminal attempted association", + )); + } + } + Ok(()) + } + fn encode(&self) -> Result { + let mut encoder = Encoder::default(); + encoder.0.extend_from_slice(&self.source); + put_wrapped(&mut encoder, &self.runtime.encode()?, "RCT1:")?; + encoder.boolean(self.attempt.is_some()); + if let Some(attempt) = &self.attempt { + put_attempt(&mut encoder, attempt)?; + } + encoder.text(TERMINAL_PROFILE) + } + pub fn finish(&self, recorder: &mut StepRecorder) -> Result<(), RecordingError> { + self.validate(recorder.run())?; + let status = match self.runtime.cause { + RuntimeTerminationCause::Completed => "completed", + RuntimeTerminationCause::Cancelled => "cancelled", + _ => "failed", + }; + recorder.finish( + status, + &self.encode()?, + Some(self.runtime.accepted_generation), + ) + } +} + +pub(super) fn split_terminal_status( + status: &RecordingStatus, +) -> Result, RecordingError> { + if !status.detail.starts_with(TERMINAL_PROFILE) { + return Ok(None); + } + let mut decoder = Decoder::text(&status.detail, TERMINAL_PROFILE)?; + let source = decoder.array()?; + let detail = get_wrapped(&mut decoder, "RCT1:")?; + if !detail.starts_with("RCT1:") { + return Err(RecordingError::Unsupported( + "workflow wrapped terminal profile", + )); + } + let attempt = if decoder.boolean()? { + Some(Arc::new(get_attempt(&mut decoder)?)) + } else { + None + }; + decoder.end()?; + Ok(Some(( + RecordingStatus { + detail, + ..status.clone() + }, + attempt, + source, + ))) +} + +pub(super) fn validate_terminal_binding( + run: &RecordingRun, + runtime: &RuntimeTermination, + attempt: &Option>, + source: [u8; 32], +) -> Result<(), RecordingError> { + WorkflowTermination { + runtime: runtime.clone(), + attempt: attempt.clone(), + source, + } + .validate(run) +} + +pub fn terminal( + reader: &RecordingReader, +) -> Result, RecordingError> { + let status = reader.status()?; + let Some((_, attempt, source)) = split_terminal_status(&status)? else { + if status.detail.starts_with("RCT1:") { + runtime::audit_runtime_termination(reader)?; + } else if status.detail.starts_with("RCT") { + return Err(RecordingError::Unsupported("workflow terminal version")); + } + return Ok(None); + }; + let runtime = runtime::audit_runtime_termination(reader)?; + WorkflowTermination { + runtime: runtime.termination.clone(), + attempt: attempt.clone(), + source, + } + .validate(reader.run())?; + if let Some(attempt) = &attempt { + let count = reader.count()?; + if count > 0 { + let row = reader.select(count - 1)?; + if attempt.publication != Some(row.generation) + && let Some((_, prior, _)) = split_publication_controls(&row.controls)? + && attempt.attempt_id <= prior.attempt_id + { + return Err(RecordingError::Invalid( + "workflow terminal attempt identity", + )); + } + if row.generation == attempt.accepted_generation { + let prior = provider::RecordedConfiguredSession::decode(reader.run(), &row)?; + if prior.time.to_bits() != attempt.interval_start.to_bits() + || native_state_digest(&prior)? != attempt.input_sha256 + { + return Err(RecordingError::Invalid("workflow terminal native input")); + } + } + if attempt.publication == Some(row.generation) { + if let Some(recorded) = publication(reader.run(), &row)? { + let mut a = Encoder::default(); + let mut b = Encoder::default(); + put_attempt(&mut a, attempt)?; + put_attempt(&mut b, &recorded)?; + if a.0 != b.0 { + return Err(RecordingError::Invalid( + "workflow terminal publication differs", + )); + } + } else { + return Err(RecordingError::Invalid( + "workflow terminal accepted evidence missing", + )); + } + } + } + } + Ok(Some(WorkflowTerminationAudit { runtime, attempt })) +} + +// Store the existing hex profile's decoded payload once. This preserves its +// exact bytes while avoiding nested hex expansion and the 1000-byte text cap. +fn put_wrapped(e: &mut Encoder, text: &str, profile: &str) -> Result<(), RecordingError> { + let original = Decoder::text(text, profile)?; + e.u32(original.data.len() as u32); + e.0.extend_from_slice(&original.data); + Ok(()) +} +fn get_wrapped(d: &mut Decoder, profile: &str) -> Result { + let len = d.u32()? as usize; + if len > super::MAX_TEXT / 2 { + return Err(RecordingError::Limit("workflow wrapped metadata")); + } + let mut bytes = Vec::with_capacity(len); + for _ in 0..len { + bytes.push(d.u8()?); + } + Encoder(bytes).text(profile) +} + +fn report_bits(report: PressureReport) -> [u64; 4] { + [ + report.iterations as u64, + report.true_residual_l2.to_bits(), + report.true_residual_max.to_bits(), + report.predicted_divergence_max.to_bits(), + ] +} +fn put_report(e: &mut Encoder, report: PressureReport) { + for n in report_bits(report) { + e.u64(n); + } +} +fn get_report(d: &mut Decoder) -> Result { + Ok(PressureReport { + iterations: d.usize()?, + true_residual_l2: d.f64()?, + true_residual_max: d.f64()?, + predicted_divergence_max: d.f64()?, + }) +} +fn put_f64(e: &mut Encoder, value: Option) { + e.boolean(value.is_some()); + if let Some(v) = value { + e.f64(v); + } +} +fn get_f64(d: &mut Decoder) -> Result, RecordingError> { + Ok(if d.boolean()? { Some(d.f64()?) } else { None }) +} +fn put_attempt(e: &mut Encoder, a: &WorkflowAttempt) -> Result<(), RecordingError> { + a.validate().map_err(RecordingError::Invalid)?; + let w = &a.descriptor; + e.u32(w.version); + for n in w.grid.counts() { + e.usize(n); + } + for v in w.grid.spacing().into_iter().chain(w.grid.origin()) { + e.f64(v); + } + e.f64(w.density); + put_f64(e, w.viscosity); + e.u8(match w.implementation { + PressureImplementation::JacobiPcgV1 => 0, + PressureImplementation::SymmetricGaussSeidelPcgV1 => 1, + }); + e.f64(w.pressure.relative_residual); + e.f64(w.pressure.absolute_residual); + e.f64(w.pressure.divergence_limit); + e.usize(w.pressure.max_iterations); + e.f64(w.actual_divergence_limit); + e.f64(w.max_courant); + e.0.extend_from_slice(&a.descriptor_sha256); + e.0.extend_from_slice(&a.input_sha256); + e.0.extend_from_slice(&a.request_sha256); + e.usize(a.force_count); + e.boolean(a.smoke_source_present); + e.boolean(a.volume_source_present); + for v in [ + a.run_id, + a.attempt_id, + a.accepted_generation, + a.attempted_generation, + ] { + e.u64(v); + } + e.f64(a.interval_start); + e.f64(a.requested_dt); + put_f64(e, a.actual_dt); + e.boolean(a.publication.is_some()); + if let Some(v) = a.publication { + e.u64(v); + } + e.u8(match a.outcome { + AttemptOutcome::Accepted => 0, + AttemptOutcome::Cancelled => 1, + AttemptOutcome::Failed => 2, + AttemptOutcome::Refused => 3, + }); + e.usize(a.nodes.len()); + for n in &a.nodes { + e.u8(n.node as u8); + e.u8(match n.status { + NodeStatus::Started => 5, + NodeStatus::Completed => 0, + NodeStatus::CandidateReturned => 1, + NodeStatus::Rejected => 2, + NodeStatus::Selected => 3, + NodeStatus::Accepted => 4, + }); + } + e.boolean(a.pressure.is_some()); + if let Some(p) = &a.pressure { + e.string(&p.selected)?; + e.boolean(p.binding.is_some()); + if let Some(b) = &p.binding { + runtime::put_binding(e, b)?; + } + e.boolean(p.prediction_called); + e.u8(match p.support { + None => 0, + Some(false) => 1, + Some(true) => 2, + }); + e.boolean(p.rejection.is_some()); + if let Some(r) = &p.rejection { + e.string(r)?; + } + e.boolean(p.rhs_sha256.is_some()); + if let Some(h) = p.rhs_sha256 { + e.0.extend_from_slice(&h); + } + for r in [p.candidate, p.accepted] { + e.boolean(r.is_some()); + if let Some(r) = r { + put_report(e, r); + } + } + e.boolean(p.pressure_call_ns.is_some()); + if let Some(v) = p.pressure_call_ns { + e.u64(v); + } + put_f64(e, p.residual_l2_limit); + } + put_f64(e, a.actual_divergence_max); + e.string(&a.diagnostic) +} +fn get_attempt(d: &mut Decoder) -> Result { + let version = d.u32()?; + if version != crate::workflow::DESCRIPTOR_VERSION { + return Err(RecordingError::Unsupported("workflow descriptor version")); + } + let counts = [d.u64()?, d.u64()?, d.u64()?]; + let spacing = [d.f64()?, d.f64()?, d.f64()?]; + let origin = [d.f64()?, d.f64()?, d.f64()?]; + let grid = GridGeometry::new(counts, spacing, origin) + .map_err(|_| RecordingError::Invalid("workflow geometry"))?; + let density = d.f64()?; + let viscosity = get_f64(d)?; + let implementation = match d.u8()? { + 0 => PressureImplementation::JacobiPcgV1, + 1 => PressureImplementation::SymmetricGaussSeidelPcgV1, + _ => return Err(RecordingError::Unsupported("workflow pressure method")), + }; + let pressure = PressureSettings { + relative_residual: d.f64()?, + absolute_residual: d.f64()?, + divergence_limit: d.f64()?, + max_iterations: d.usize()?, + }; + let descriptor = WorkflowDescriptor { + version, + grid, + density, + viscosity, + implementation, + pressure, + actual_divergence_limit: d.f64()?, + max_courant: d.f64()?, + }; + let descriptor_sha256 = d.array()?; + let input_sha256 = d.array()?; + let request_sha256 = d.array()?; + let force_count = d.usize()?; + let smoke_source_present = d.boolean()?; + let volume_source_present = d.boolean()?; + let run_id = d.u64()?; + let attempt_id = d.u64()?; + let accepted_generation = d.u64()?; + let attempted_generation = d.u64()?; + let interval_start = d.f64()?; + let requested_dt = d.f64()?; + let actual_dt = get_f64(d)?; + let publication = if d.boolean()? { Some(d.u64()?) } else { None }; + let outcome = match d.u8()? { + 0 => AttemptOutcome::Accepted, + 1 => AttemptOutcome::Cancelled, + 2 => AttemptOutcome::Failed, + 3 => AttemptOutcome::Refused, + _ => return Err(RecordingError::Unsupported("workflow outcome")), + }; + let count = d.usize()?; + if count > MAX_NODES { + return Err(RecordingError::Limit("workflow node count")); + } + let mut nodes = Vec::with_capacity(count); + for _ in 0..count { + let node = *NodeKind::ALL + .get(d.u8()? as usize) + .ok_or(RecordingError::Unsupported("workflow node kind"))?; + let status = match d.u8()? { + 5 => NodeStatus::Started, + 0 => NodeStatus::Completed, + 1 => NodeStatus::CandidateReturned, + 2 => NodeStatus::Rejected, + 3 => NodeStatus::Selected, + 4 => NodeStatus::Accepted, + _ => return Err(RecordingError::Unsupported("workflow node status")), + }; + nodes.push(NodeReceipt { node, status }); + } + let pressure = if d.boolean()? { + let selected = d.string()?; + let binding = if d.boolean()? { + Some(runtime::get_binding(d)?) + } else { + None + }; + let prediction_called = d.boolean()?; + let support = match d.u8()? { + 0 => None, + 1 => Some(false), + 2 => Some(true), + _ => return Err(RecordingError::Unsupported("workflow support")), + }; + let rejection = if d.boolean()? { + Some(d.string()?) + } else { + None + }; + let rhs_sha256 = if d.boolean()? { Some(d.array()?) } else { None }; + let candidate = if d.boolean()? { + Some(get_report(d)?) + } else { + None + }; + let accepted = if d.boolean()? { + Some(get_report(d)?) + } else { + None + }; + let pressure_call_ns = if d.boolean()? { Some(d.u64()?) } else { None }; + let residual_l2_limit = get_f64(d)?; + Some(PressureFacts { + selected, + binding, + prediction_called, + support, + rejection, + rhs_sha256, + candidate, + accepted, + pressure_call_ns, + residual_l2_limit, + }) + } else { + None + }; + let attempt = WorkflowAttempt { + descriptor, + descriptor_sha256, + input_sha256, + request_sha256, + force_count, + smoke_source_present, + volume_source_present, + run_id, + attempt_id, + accepted_generation, + attempted_generation, + interval_start, + requested_dt, + actual_dt, + publication, + outcome, + nodes, + pressure, + actual_divergence_max: get_f64(d)?, + diagnostic: d.string()?, + }; + attempt.validate().map_err(RecordingError::Invalid)?; + Ok(attempt) +} + +#[cfg(test)] +mod tests { + use super::super::RecordingLimits; + use super::*; + use crate::{ + LiquidInlet, LiquidStepInputs, LiquidTransportConfig, LiquidVolumeSettings, + ProviderStepWorkspace, SessionIdentity, SimulationConfig, SimulationSession, VolumeStamp, + }; + use std::sync::atomic::{AtomicU64, Ordering}; + const CAP: usize = 1024 * 1024; + fn fixture() -> (SimulationSession, ProviderStepWorkspace) { + fixture_with_iterations(1000) + } + fn fixture_with_iterations( + max_iterations: usize, + ) -> (SimulationSession, ProviderStepWorkspace) { + let grid = GridGeometry::new([2; 3], [0.5; 3], [0.0; 3]).unwrap(); + let config = LiquidTransportConfig { + carrier: SimulationConfig { + density: 1000.0, + memory_limit: CAP, + pressure: PressureSettings { + relative_residual: 1e-12, + absolute_residual: 1e-12, + divergence_limit: 1e-9, + max_iterations, + }, + actual_divergence_limit: 1e-5, + max_courant: 1.0, + }, + represented_density: 1000.0, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + }; + let workspace = + ProviderStepWorkspace::new(&grid, 1000.0, CAP, PressureImplementation::JacobiPcgV1) + .unwrap(); + ( + SimulationSession::new( + SessionIdentity { + run_id: 711, + source_revision: "workflow-custody-fixture".into(), + }, + grid, + config, + PressureImplementation::JacobiPcgV1, + vec![1.0; 8], + CAP, + 4, + ) + .unwrap(), + workspace, + ) + } + fn inputs() -> LiquidStepInputs<'static> { + LiquidStepInputs { + requested_dt: 0.0625, + smoke_source: None, + forces: &[], + source: None, + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]).unwrap(), + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + } + } + fn path() -> std::path::PathBuf { + static NEXT: AtomicU64 = AtomicU64::new(0); + std::env::temp_dir().join(format!( + "rheon-workflow-{}-{}.sqlite", + std::process::id(), + NEXT.fetch_add(1, Ordering::Relaxed) + )) + } + fn wrap(run: &RecordingRun, original: &str, attempt: &WorkflowAttempt) -> String { + let mut e = Encoder::default(); + e.0.extend_from_slice(&provider::source_binding(run)); + e.boolean(original.starts_with("RCP3:")); + put_wrapped( + &mut e, + original, + if original.starts_with("RCP3:") { + "RCP3:" + } else { + "RCP2:" + }, + ) + .unwrap(); + put_attempt(&mut e, attempt).unwrap(); + e.text(PUBLICATION_PROFILE).unwrap() + } + #[test] + fn accepted_round_trip_and_legacy_profiles_preserve_original_meaning() { + let (mut session, mut workspace) = fixture(); + session + .step_with_configured_pressure(inputs(), &mut workspace, None, None, None, |_| false) + .unwrap(); + let snapshot = session.snapshot(); + let run = provider::configured_run(&snapshot, "fixture").unwrap(); + let legacy = provider::configured_publication(&snapshot, 0, CAP).unwrap(); + assert!(legacy.controls.starts_with("RCP2:")); + assert!(publication(&run, &legacy).unwrap().is_none()); + let step = configured_publication_with_workflow(&snapshot, 0, CAP, None).unwrap(); + let (original, expected, _) = split_publication_controls(&step.controls).unwrap().unwrap(); + assert_eq!(original, legacy.controls); + let decoded = publication(&run, &step).unwrap().unwrap(); + assert_eq!(decoded.descriptor_sha256, expected.descriptor_sha256); + assert_eq!(decoded.input_sha256, expected.input_sha256); + assert_eq!(decoded.request_sha256, expected.request_sha256); + assert_eq!(decoded.force_count, expected.force_count); + assert_eq!(decoded.publication, Some(1)); + assert_eq!(decoded.accepted_generation, 0); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder.append(&step).unwrap(); + WorkflowTermination::capture( + &snapshot, + RuntimeTerminationCause::Completed, + "done", + None, + Some(&decoded), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + drop(session); + let reader = RecordingReader::open(&archive, limits).unwrap(); + let terminal = terminal(&reader).unwrap().unwrap(); + assert_eq!(terminal.runtime.termination.accepted_generation, 1); + assert_eq!(terminal.attempt.unwrap().publication, Some(1)); + provider::verify_configured_recording(&reader).unwrap(); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + struct CandidateFixture { + invalid: bool, + observation: Option, + } + impl crate::solver_provider::configured::ContextPressureProvider for CandidateFixture { + fn identity(&self) -> Arc { + Arc::new( + crate::solver_provider::configured::ContextProviderIdentity { + id: "workflow-classical-fixture".into(), + version: "1".into(), + manifest_sha256: [3; 32], + checkpoint_sha256: None, + training_run_id: None, + runtime: "native-fixture".into(), + source_revision: "fixture-source".into(), + }, + ) + } + fn supports( + &self, + _: &crate::solver_provider::configured::ContextPressureRequest<'_>, + ) -> Result<(), crate::solver_provider::ProviderRejection> { + Ok(()) + } + fn predict( + &mut self, + request: &crate::solver_provider::configured::ContextPressureRequest<'_>, + output: &mut [f64], + _: &mut dyn FnMut() -> bool, + ) -> Result<(), crate::solver_provider::ProviderRejection> { + self.observation = Some(RuntimeObservation { + request: runtime::RuntimeRequestStamp::capture(request, &self.identity()).unwrap(), + outcome: runtime::RuntimeOutcome::CandidateReturned, + }); + output.fill(if self.invalid { f64::NAN } else { 0.0 }); + Ok(()) + } + } + #[test] + fn candidate_and_fallback_runtime_profiles_round_trip_actual_provider_identity() { + for invalid in [false, true] { + let (mut session, mut workspace) = fixture(); + let mut provider = CandidateFixture { + invalid, + observation: None, + }; + let mut viscosity = + crate::ViscosityWorkspace::new(session.snapshot().grid().clone(), CAP).unwrap(); + let mut evidence = None; + session + .step_with_configured_pressure_observed( + inputs(), + &mut workspace, + Some((&mut viscosity, 0.0)), + Some(&mut provider), + None, + |_| false, + 6, + &mut evidence, + ) + .unwrap(); + let evidence = evidence.unwrap(); + let run = provider::configured_run(&session.snapshot(), "runtime fixture").unwrap(); + let old = provider::configured_publication_with_runtime( + &session.snapshot(), + 0, + CAP, + provider.observation.as_ref(), + ) + .unwrap(); + assert!(old.controls.starts_with("RCP3:")); + assert!(publication(&run, &old).unwrap().is_none()); + let row = configured_publication_with_workflow( + &session.snapshot(), + 0, + CAP, + provider.observation.as_ref(), + ) + .unwrap(); + let recorded = publication(&run, &row).unwrap().unwrap(); + assert_eq!(recorded.descriptor.viscosity, Some(0.0)); + assert_eq!( + recorded.pressure.as_ref().unwrap().rejection.is_some(), + invalid + ); + assert_eq!( + recorded + .pressure + .as_ref() + .unwrap() + .binding + .as_ref() + .unwrap() + .id, + "workflow-classical-fixture" + ); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder.append(&row).unwrap(); + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Completed, + "done", + provider.observation.as_ref(), + Some(&evidence), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + drop(session); + drop(provider); + let reader = RecordingReader::open(&archive, limits).unwrap(); + let retained = terminal(&reader).unwrap().unwrap(); + assert_eq!(retained.attempt.unwrap().attempt_id, 6); + assert!(retained.runtime.termination.observation.is_some()); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + } + + #[test] + fn cancellation_at_generation_zero_is_cold_inspectable_without_accepted_row() { + for final_checkpoint in [false, true] { + let (mut session, mut workspace) = fixture(); + let mut evidence = None; + assert!( + session + .step_with_configured_pressure_observed( + inputs(), + &mut workspace, + None, + None, + None, + |stage| !final_checkpoint || stage == crate::LiquidStepStage::BeforeCommit, + 9, + &mut evidence + ) + .is_err() + ); + let attempt = evidence.unwrap(); + assert_eq!(attempt.accepted_generation, 0); + assert_eq!(attempt.attempted_generation, 1); + assert_eq!(attempt.publication, None); + assert_eq!(attempt.outcome, AttemptOutcome::Cancelled); + let archive = path(); + let limits = RecordingLimits::default(); + let run = provider::configured_run(&session.snapshot(), "empty cancellation").unwrap(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Cancelled, + "cancelled", + None, + Some(&attempt), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + drop(session); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert_eq!(reader.count().unwrap(), 0); + let retained = terminal(&reader).unwrap().unwrap(); + assert_eq!(retained.runtime.termination.accepted_generation, 0); + let retained = retained.attempt.unwrap(); + assert_eq!(retained.attempt_id, 9); + assert_eq!(retained.publication, None); + assert_eq!(retained.pressure.is_some(), final_checkpoint); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + } + #[test] + fn advection_cancel_velocity_live_and_cold() { + advection_cancel_live_and_cold(crate::StepStage::VelocitySlice); + } + + #[test] + fn advection_cancel_tracer_live_and_cold() { + advection_cancel_live_and_cold(crate::StepStage::TracerSlice); + } + + fn advection_cancel_live_and_cold(checkpoint: crate::StepStage) { + for prior_accepted in [false, true] { + let (mut session, mut workspace) = fixture(); + if prior_accepted { + session + .step_with_configured_pressure( + inputs(), + &mut workspace, + None, + None, + None, + |_| false, + ) + .unwrap(); + } + let snapshot = session.snapshot(); + let generation = snapshot.state().carrier.generation; + let prior_receipt = snapshot + .configured_provider_report() + .and_then(|report| report.workflow.clone()); + let prior_metadata = format!( + "{:?}:{:?}:{:?}", + snapshot.report(), + snapshot.provider_report(), + snapshot.accepted_interval_start() + ); + let prior_row = prior_accepted + .then(|| configured_publication_with_workflow(&snapshot, 0, CAP, None).unwrap()); + let mut before = Vec::new(); + snapshot.write_dense3d(&mut before).unwrap(); + let archive = path(); + let limits = RecordingLimits::default(); + let run = provider::configured_run(&snapshot, "advection cancellation").unwrap(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + if prior_accepted { + recorder + .append(&configured_publication_with_workflow(&snapshot, 0, CAP, None).unwrap()) + .unwrap(); + } + let mut evidence = None; + let error = session + .step_with_configured_pressure_observed( + inputs(), + &mut workspace, + None, + None, + None, + |stage| stage == crate::LiquidStepStage::Carrier(checkpoint), + 19, + &mut evidence, + ) + .unwrap_err(); + assert!( + matches!( + error, + crate::SessionError::Step(crate::LiquidStepError::Carrier( + crate::SimulationError::Advection(crate::AdvectionError::Cancelled) + )) + ), + "{error:?}" + ); + let mut after = Vec::new(); + session.snapshot().write_dense3d(&mut after).unwrap(); + assert_eq!(after, before); + let snapshot = session.snapshot(); + assert_eq!( + format!( + "{:?}:{:?}:{:?}", + snapshot.report(), + snapshot.provider_report(), + snapshot.accepted_interval_start() + ), + prior_metadata + ); + match ( + prior_receipt.as_ref(), + snapshot + .configured_provider_report() + .and_then(|report| report.workflow.as_ref()), + ) { + (Some(before), Some(after)) => assert!(Arc::ptr_eq(before, after)), + (None, None) => {} + _ => panic!("accepted receipt changed on cancellation"), + } + let attempt = evidence.unwrap(); + assert_eq!(attempt.accepted_generation, generation); + assert_eq!(attempt.attempted_generation, generation + 1); + assert_eq!(attempt.publication, None); + assert_eq!(attempt.outcome, AttemptOutcome::Cancelled); + assert_eq!( + attempt.pressure.is_some(), + checkpoint == crate::StepStage::TracerSlice + ); + assert!(!attempt.nodes.iter().any(|node| matches!( + node.node, + NodeKind::TracerTransport | NodeKind::VolumeTransport | NodeKind::Publication + ))); + assert_eq!( + attempt + .nodes + .iter() + .any(|node| node.node == NodeKind::Advection), + checkpoint == crate::StepStage::TracerSlice + ); + assert_eq!( + attempt + .nodes + .iter() + .any(|node| node.node == NodeKind::Projection), + checkpoint == crate::StepStage::TracerSlice + ); + attempt.validate().unwrap(); + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Cancelled, + "actual advection cancellation", + None, + Some(&attempt), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + // An old explicitly Failed receipt must not be reinterpreted on decode. + let old_archive = path(); + let old_run = + provider::configured_run(&session.snapshot(), "historical failed label").unwrap(); + let mut old_writer = StepRecorder::create(&old_archive, old_run, limits).unwrap(); + if prior_accepted { + old_writer + .append( + &configured_publication_with_workflow(&session.snapshot(), 0, CAP, None) + .unwrap(), + ) + .unwrap(); + } + let mut old_attempt = (*attempt).clone(); + old_attempt.outcome = AttemptOutcome::Failed; + let old_attempt = Arc::new(old_attempt); + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Cancelled, + "retained pre-repair receipt meaning", + None, + Some(&old_attempt), + ) + .unwrap() + .finish(&mut old_writer) + .unwrap(); + drop(old_writer); + // Cancellation consumed no publication/quota: same owner can accept the next interval. + session + .step_with_configured_pressure(inputs(), &mut workspace, None, None, None, |_| { + false + }) + .unwrap(); + assert_eq!( + session.snapshot().state().carrier.generation, + generation + 1 + ); + drop(session); + drop(workspace); + for (file, expected) in [ + (archive, AttemptOutcome::Cancelled), + (old_archive, AttemptOutcome::Failed), + ] { + let reader = RecordingReader::open(&file, limits).unwrap(); + assert_eq!(reader.count().unwrap(), usize::from(prior_accepted)); + if let Some(expected_row) = &prior_row { + let row = reader.select_record(0).unwrap(); + assert_eq!(row.controls, expected_row.controls); + assert_eq!(row.time.to_bits(), expected_row.time.to_bits()); + } + let retained = terminal(&reader).unwrap().unwrap(); + assert_eq!(retained.runtime.termination.accepted_generation, generation); + let retained = retained.attempt.unwrap(); + assert_eq!(retained.attempt_id, 19); + assert_eq!(retained.outcome, expected); + assert_eq!(retained.publication, None); + assert_eq!(retained.accepted_generation, generation); + assert_eq!(retained.attempted_generation, generation + 1); + assert_eq!( + retained.pressure.is_some(), + checkpoint == crate::StepStage::TracerSlice + ); + drop(reader); + std::fs::remove_file(file).unwrap(); + } + } + } + + #[test] + fn advection_cancel_repair_keeps_actual_pressure_failure_failed_live_and_cold() { + let (mut session, mut workspace) = fixture_with_iterations(0); + let forces = [crate::BodyForce { + value: [0.125, 0.0, 0.0], + units: crate::ForceUnits::Acceleration, + region: None, + }]; + let mut input = inputs(); + input.forces = &forces; + let mut before = Vec::new(); + session.snapshot().write_dense3d(&mut before).unwrap(); + let mut evidence = None; + let error = session + .step_with_configured_pressure_observed( + input, + &mut workspace, + None, + None, + None, + |_| false, + 20, + &mut evidence, + ) + .unwrap_err(); + assert!( + matches!( + error, + crate::SessionError::Step(crate::LiquidStepError::Carrier( + crate::SimulationError::Pressure(crate::PressureError::IterationLimit { + iterations: 0, + .. + }) + )) + ), + "{error:?}" + ); + let mut after = Vec::new(); + session.snapshot().write_dense3d(&mut after).unwrap(); + assert_eq!(before, after); + let attempt = evidence.unwrap(); + assert_eq!(attempt.outcome, AttemptOutcome::Failed); + assert_eq!(attempt.publication, None); + let archive = path(); + let limits = RecordingLimits::default(); + let run = provider::configured_run(&session.snapshot(), "actual pressure failure").unwrap(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::NumericalFailure, + "actual numerical failure", + None, + Some(&attempt), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + drop(session); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert_eq!(reader.count().unwrap(), 0); + assert_eq!( + terminal(&reader).unwrap().unwrap().attempt.unwrap().outcome, + AttemptOutcome::Failed + ); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + + #[test] + fn malformed_cross_linked_and_unknown_workflow_evidence_is_rejected() { + let (mut session, mut workspace) = fixture(); + session + .step_with_configured_pressure(inputs(), &mut workspace, None, None, None, |_| false) + .unwrap(); + let run = provider::configured_run(&session.snapshot(), "fixture").unwrap(); + let mut step = + configured_publication_with_workflow(&session.snapshot(), 0, CAP, None).unwrap(); + let (original, attempt, _) = split_publication_controls(&step.controls).unwrap().unwrap(); + let good = step.controls.clone(); + let mut other = (*attempt).clone(); + other.run_id += 1; + step.controls = wrap(&run, &original, &other); + assert!(publication(&run, &step).is_err()); + let mut other_source = run.clone(); + other_source.identity.source_revision.push_str("-different"); + step.controls = wrap(&other_source, &original, &attempt); + assert!(publication(&run, &step).is_err()); + step.controls = good.clone(); + step.controls.pop(); + assert!(publication(&run, &step).is_err()); + step.controls = good; + step.time += 0.01; + assert!(publication(&run, &step).is_err()); + let mut e = Encoder::default(); + put_attempt(&mut e, &attempt).unwrap(); + e.0[0..4].copy_from_slice(&99u32.to_le_bytes()); + let text = e.text("TEST:").unwrap(); + let mut d = Decoder::text(&text, "TEST:").unwrap(); + assert!(matches!( + get_attempt(&mut d), + Err(RecordingError::Unsupported(_)) + )); + let mut e = Encoder::default(); + e.u32((super::super::MAX_TEXT + 1) as u32); + let text = e.text("TEST:").unwrap(); + let mut d = Decoder::text(&text, "TEST:").unwrap(); + assert!(matches!( + get_wrapped(&mut d, "RCT1:"), + Err(RecordingError::Limit(_)) + )); + } + #[test] + fn terminal_rejects_contradictory_runtime_outcome_and_unknown_version() { + let (mut session, mut workspace) = fixture(); + let mut provider = CandidateFixture { + invalid: false, + observation: None, + }; + let mut evidence = None; + assert!( + session + .step_with_configured_pressure_observed( + inputs(), + &mut workspace, + None, + Some(&mut provider), + None, + |stage| stage == crate::LiquidStepStage::BeforeCommit, + 4, + &mut evidence + ) + .is_err() + ); + let evidence = evidence.unwrap(); + let mut contradiction = provider.observation.clone().unwrap(); + contradiction.outcome = runtime::RuntimeOutcome::NoCandidate { + reason: super::super::diagnostic::NoCandidateReason::Cancelled, + detail: "authored contradiction".into(), + dispatched: true, + invalid_payload_sha256: None, + }; + assert!(matches!( + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Cancelled, + "cancelled", + Some(&contradiction), + Some(&evidence) + ), + Err(RecordingError::Invalid( + "workflow runtime outcome association" + )) + )); + let mut terminal = WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Cancelled, + "cancelled", + provider.observation.as_ref(), + Some(&evidence), + ) + .unwrap(); + terminal.runtime.observation = Some(contradiction); + let archive = path(); + let limits = RecordingLimits::default(); + let run = provider::configured_run(&session.snapshot(), "runtime contradiction").unwrap(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder + .finish("cancelled", &terminal.encode().unwrap(), Some(0)) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(matches!( + super::terminal(&reader), + Err(RecordingError::Invalid( + "workflow runtime outcome association" + )) + )); + drop(reader); + std::fs::remove_file(archive).unwrap(); + let archive = path(); + let run = provider::configured_run(&session.snapshot(), "unknown terminal").unwrap(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder.finish("failed", "RCT3:00", Some(0)).unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(matches!( + super::terminal(&reader), + Err(RecordingError::Unsupported("workflow terminal version")) + )); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + + #[test] + fn forged_native_input_hash_is_rejected_by_bounded_selection_and_archive_chain() { + let (mut session, mut workspace) = fixture(); + let constructor = provider::configured_publication(&session.snapshot(), 0, CAP).unwrap(); + session + .step_with_configured_pressure(inputs(), &mut workspace, None, None, None, |_| false) + .unwrap(); + let run = provider::configured_run(&session.snapshot(), "input-link fixture").unwrap(); + let mut row = + configured_publication_with_workflow(&session.snapshot(), 1, CAP, None).unwrap(); + let (original, attempt, _) = split_publication_controls(&row.controls).unwrap().unwrap(); + assert_eq!( + native_state_digest( + &provider::RecordedConfiguredSession::decode(&run, &constructor).unwrap() + ) + .unwrap(), + attempt.input_sha256 + ); + let mut forged = (*attempt).clone(); + forged.input_sha256[0] ^= 1; + row.controls = wrap(&run, &original, &forged); + // The row remains intrinsically well formed; only the prior native + // publication proves this reachable cross-link is false. + publication(&run, &row).unwrap(); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder.append(&constructor).unwrap(); + recorder.append(&row).unwrap(); + recorder + .finish("failed", "authored cross-link refusal fixture", Some(1)) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(matches!( + selection(&reader, &row), + Err(RecordingError::Invalid( + "workflow selected prior native input" + )) + )); + assert!(matches!( + provider::verify_configured_recording(&reader), + Err(RecordingError::Invalid("workflow prior native input")) + )); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + + #[test] + fn duplicate_attempt_ids_are_rejected_for_publications_and_next_terminal() { + let (mut session, mut workspace) = fixture(); + session + .step_with_configured_pressure(inputs(), &mut workspace, None, None, None, |_| false) + .unwrap(); + let first = + configured_publication_with_workflow(&session.snapshot(), 0, CAP, None).unwrap(); + let run = + provider::configured_run(&session.snapshot(), "attempt sequence fixture").unwrap(); + let mut cancelled = None; + assert!( + session + .step_with_configured_pressure_observed( + inputs(), + &mut workspace, + None, + None, + None, + |stage| stage == crate::LiquidStepStage::BeforeCommit, + 1, + &mut cancelled + ) + .is_err() + ); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run.clone(), limits).unwrap(); + recorder.append(&first).unwrap(); + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::Cancelled, + "duplicate attempted id", + None, + cancelled.as_ref(), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(matches!( + terminal(&reader), + Err(RecordingError::Invalid( + "workflow terminal attempt identity" + )) + )); + drop(reader); + std::fs::remove_file(archive).unwrap(); + session + .step_with_configured_pressure(inputs(), &mut workspace, None, None, None, |_| false) + .unwrap(); + let mut second = + configured_publication_with_workflow(&session.snapshot(), 1, CAP, None).unwrap(); + let (original, attempt, _) = split_publication_controls(&second.controls) + .unwrap() + .unwrap(); + let mut forged = (*attempt).clone(); + forged.attempt_id = 1; + second.controls = wrap(&run, &original, &forged); + let archive = path(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder.append(&first).unwrap(); + recorder.append(&second).unwrap(); + recorder + .finish("failed", "authored attempt-id refusal fixture", Some(2)) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert!(matches!( + selection(&reader, &second), + Err(RecordingError::Invalid( + "workflow selected attempt identity" + )) + )); + assert!(matches!( + provider::verify_configured_recording(&reader), + Err(RecordingError::Invalid( + "workflow attempt identity sequence" + )) + )); + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + + #[test] + fn legacy_terminal_is_unavailable_and_storage_failure_preserves_accepted_tail() { + let (mut session, mut workspace) = fixture(); + let limits = RecordingLimits::default(); + let legacy_path = path(); + let run = provider::configured_run(&session.snapshot(), "legacy").unwrap(); + let mut recorder = StepRecorder::create(&legacy_path, run, limits).unwrap(); + RuntimeTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::StartupFailure, + "legacy", + None, + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&legacy_path, limits).unwrap(); + assert!(terminal(&reader).unwrap().is_none()); + runtime::audit_runtime_termination(&reader).unwrap(); + drop(reader); + std::fs::remove_file(legacy_path).unwrap(); + let constructor = provider::configured_publication(&session.snapshot(), 0, CAP).unwrap(); + session + .step_with_configured_pressure(inputs(), &mut workspace, None, None, None, |_| false) + .unwrap(); + let evidence = session + .snapshot() + .configured_provider_report() + .unwrap() + .workflow + .clone() + .unwrap(); + for (keep_constructor, forge_input) in [(false, false), (true, false), (true, true)] { + let archive = path(); + let run = provider::configured_run(&session.snapshot(), "unrecorded tail").unwrap(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + if keep_constructor { + recorder.append(&constructor).unwrap(); + } + let mut retained = (*evidence).clone(); + if forge_input { + retained.input_sha256[0] ^= 1; + } + WorkflowTermination::capture( + &session.snapshot(), + RuntimeTerminationCause::StorageFailure, + "row not recorded", + None, + Some(&Arc::new(retained)), + ) + .unwrap() + .finish(&mut recorder) + .unwrap(); + drop(recorder); + let reader = RecordingReader::open(&archive, limits).unwrap(); + if forge_input { + assert!(matches!( + terminal(&reader), + Err(RecordingError::Invalid("workflow terminal native input")) + )); + } else { + let audit = terminal(&reader).unwrap().unwrap(); + assert!( + matches!(audit.runtime.coverage,runtime::RuntimeTerminalCoverage::UnrecordedAcceptedTail {last_recorded_generation} if last_recorded_generation == keep_constructor.then_some(0)) + ); + assert_eq!(audit.attempt.unwrap().publication, Some(1)); + } + drop(reader); + std::fs::remove_file(archive).unwrap(); + } + } + + #[derive(Clone, Copy, Debug)] + enum IterationTrace { + Native, + RejectedCandidate, + AcceptedCandidate, + } + fn iteration_trace( + kind: IterationTrace, + cancelled: bool, + max_iterations: usize, + ) -> (SimulationSession, Arc) { + use crate::solver_provider::configured::ContextPressureProvider; + let (mut session, mut workspace) = fixture_with_iterations(max_iterations); + let mut candidate = CandidateFixture { + invalid: false, + observation: None, + }; + let forces = [crate::BodyForce { + value: [1.0, 0.0, 0.0], + units: crate::ForceUnits::Acceleration, + region: None, + }]; + let mut request = inputs(); + if matches!(kind, IterationTrace::RejectedCandidate) { + request.forces = &forces; + } + let preferred: Option<&mut dyn ContextPressureProvider> = + if matches!(kind, IterationTrace::Native) { + None + } else { + Some(&mut candidate) + }; + let mut evidence = None; + let result = session.step_with_configured_pressure_observed( + request, + &mut workspace, + None, + preferred, + None, + |stage| cancelled && stage == crate::LiquidStepStage::BeforeCommit, + 1, + &mut evidence, + ); + assert_eq!(result.is_err(), cancelled); + let evidence = evidence.unwrap(); + evidence.validate().unwrap(); + if matches!(kind, IterationTrace::RejectedCandidate) { + assert_eq!( + evidence.pressure.as_ref().unwrap().rejection.as_deref(), + Some("QualityGate") + ); + assert!(evidence.pressure.as_ref().unwrap().candidate.is_some()); + } + (session, evidence) + } + fn iteration_bad_count(trace: &WorkflowAttempt, kind: IterationTrace) -> WorkflowAttempt { + let mut bad = trace.clone(); + let pressure = bad.pressure.as_mut().unwrap(); + match kind { + IterationTrace::Native => { + pressure.accepted.as_mut().unwrap().iterations = + bad.descriptor.pressure.max_iterations + 1 + } + IterationTrace::RejectedCandidate => { + let candidate = pressure.candidate.as_mut().unwrap(); + // Rejected numerical diagnostics retain their IEEE payloads; + // their iteration count still belongs to the supplied stage. + candidate.true_residual_l2 = f64::NAN; + candidate.true_residual_max = f64::INFINITY; + candidate.predicted_divergence_max = f64::NEG_INFINITY; + candidate.iterations = 1; + } + IterationTrace::AcceptedCandidate => { + pressure.candidate.as_mut().unwrap().iterations = 1; + pressure.accepted.as_mut().unwrap().iterations = 1; + } + } + bad + } + // This negative-fixture helper first uses the real encoder on an admissible + // trace, then changes only the serialized iteration u64s. It deliberately + // bypasses outbound validation so cold-reader refusal is independently tested. + fn iteration_bad_attempt_bytes(attempt: &WorkflowAttempt) -> Vec { + let mut valid = attempt.clone(); + let pressure = valid.pressure.as_mut().unwrap(); + if let Some(report) = &mut pressure.candidate { + report.iterations = 0; + } + if let Some(report) = &mut pressure.accepted { + report.iterations = 0; + } + let mut encoder = Encoder::default(); + put_attempt(&mut encoder, &valid).unwrap(); + let pressure = attempt.pressure.as_ref().unwrap(); + // Tail after the accepted report: optional pressure-call ns, optional + // residual limit, optional actual divergence, then bounded UTF-8 detail. + let tail = 1 + + usize::from(pressure.pressure_call_ns.is_some()) * 8 + + 1 + + usize::from(pressure.residual_l2_limit.is_some()) * 8 + + 1 + + usize::from(attempt.actual_divergence_max.is_some()) * 8 + + 4 + + attempt.diagnostic.len(); + let end = encoder.0.len() - tail; + if let Some(report) = pressure.accepted { + encoder.0[end - 32..end - 24] + .copy_from_slice(&(report.iterations as u64).to_le_bytes()); + } + if let Some(report) = pressure.candidate { + let candidate_end = end - 1 - usize::from(pressure.accepted.is_some()) * 32; + encoder.0[candidate_end - 32..candidate_end - 24] + .copy_from_slice(&(report.iterations as u64).to_le_bytes()); + } + encoder.0 + } + fn iteration_rcp4_controls( + run: &RecordingRun, + inner: &str, + attempt: &WorkflowAttempt, + ) -> String { + let mut encoder = Encoder::default(); + encoder.0.extend_from_slice(&provider::source_binding(run)); + encoder.boolean(false); + put_wrapped(&mut encoder, inner, "RCP2:").unwrap(); + encoder + .0 + .extend_from_slice(&iteration_bad_attempt_bytes(attempt)); + encoder.text(PUBLICATION_PROFILE).unwrap() + } + fn iteration_check_standalone(kind: IterationTrace) { + for cancelled in [false, true] { + let (_, trace) = iteration_trace(kind, cancelled, 1000); + let mut bad = iteration_bad_count(&trace, kind); + assert!( + bad.validate().is_err(), + "accepted malformed {kind:?}; cancelled={cancelled}" + ); + if cancelled { + // A failed later stage has the same completed pressure prefix. + bad.outcome = AttemptOutcome::Failed; + assert!( + bad.validate().is_err(), + "accepted malformed failed-later {kind:?}" + ); + } + } + } + #[test] + fn iteration_limits_standalone_native_pressure_count() { + iteration_check_standalone(IterationTrace::Native); + } + #[test] + fn iteration_limits_standalone_rejected_candidate_count() { + iteration_check_standalone(IterationTrace::RejectedCandidate); + } + #[test] + fn iteration_limits_standalone_accepted_candidate_count() { + iteration_check_standalone(IterationTrace::AcceptedCandidate); + } + #[test] + fn iteration_limits_valid_edges_and_zero_budget_candidate_are_preserved() { + let (_, native) = iteration_trace(IterationTrace::Native, false, 1000); + let mut at_cap = (*native).clone(); + at_cap + .pressure + .as_mut() + .unwrap() + .accepted + .as_mut() + .unwrap() + .iterations = 1000; + at_cap.validate().unwrap(); + let (_, candidate) = iteration_trace(IterationTrace::AcceptedCandidate, false, 0); + assert_eq!(candidate.descriptor.pressure.max_iterations, 0); + assert_eq!( + candidate + .pressure + .as_ref() + .unwrap() + .candidate + .unwrap() + .iterations, + 0 + ); + assert_eq!( + candidate + .pressure + .as_ref() + .unwrap() + .accepted + .unwrap() + .iterations, + 0 + ); + candidate.validate().unwrap(); + let (_, rejected) = iteration_trace(IterationTrace::RejectedCandidate, true, 1000); + let mut ieee = iteration_bad_count(&rejected, IterationTrace::RejectedCandidate); + ieee.pressure + .as_mut() + .unwrap() + .candidate + .as_mut() + .unwrap() + .iterations = 0; + ieee.validate().unwrap(); + let mut encoder = Encoder::default(); + put_attempt(&mut encoder, &ieee).unwrap(); + let text = encoder.text("TEST:").unwrap(); + let mut decoder = Decoder::text(&text, "TEST:").unwrap(); + let decoded = get_attempt(&mut decoder).unwrap(); + let report = decoded.pressure.as_ref().unwrap().candidate.unwrap(); + assert_eq!(report.true_residual_l2.to_bits(), f64::NAN.to_bits()); + assert_eq!(report.true_residual_max.to_bits(), f64::INFINITY.to_bits()); + assert_eq!( + report.predicted_divergence_max.to_bits(), + f64::NEG_INFINITY.to_bits() + ); + } + #[test] + fn iteration_limits_rcp4_matching_inner_counts_already_hit_old_receipt_gate() { + for kind in [ + IterationTrace::Native, + IterationTrace::RejectedCandidate, + IterationTrace::AcceptedCandidate, + ] { + let (session, trace) = iteration_trace(kind, false, 1000); + let run = provider::configured_run(&session.snapshot(), "old-inner iteration control") + .unwrap(); + let mut row = provider::configured_publication(&session.snapshot(), 0, CAP).unwrap(); + let mut bad = iteration_bad_count(&trace, kind); + // Only counts differ here: the coherent inner and outer diagnostic + // values otherwise remain the real, finite producer observations. + if matches!(kind, IterationTrace::RejectedCandidate) { + bad.pressure.as_mut().unwrap().candidate = trace + .pressure + .as_ref() + .unwrap() + .candidate + .map(|mut report| { + report.iterations = 1; + report + }); + } + let pressure = bad.pressure.as_ref().unwrap(); + let mut inner = Decoder::text(&row.controls, "RCP2:").unwrap().data; + // Unchanged RCP2 receipt ends in accepted PressureReport (32 bytes) + // and four duration pairs (u64 seconds, u32 nanoseconds). + let accepted_start = inner.len() - 4 * 12 - 32; + inner[accepted_start..accepted_start + 8] + .copy_from_slice(&(pressure.accepted.unwrap().iterations as u64).to_le_bytes()); + if let Some(candidate) = pressure.candidate { + let candidate_start = accepted_start - 32; + inner[candidate_start..candidate_start + 8] + .copy_from_slice(&(candidate.iterations as u64).to_le_bytes()); + } + let inner = Encoder(inner).text("RCP2:").unwrap(); + row.controls = inner.clone(); + let expected = if matches!(kind, IterationTrace::Native) { + "configured accepted pressure gates" + } else { + "configured candidate diagnostics" + }; + assert!( + matches!(provider::RecordedConfiguredSession::decode(&run, &row), Err(RecordingError::Invalid(reason)) if reason == expected), + "unchanged RCP2 failed to refuse {kind:?}" + ); + row.controls = iteration_rcp4_controls(&run, &inner, &bad); + assert!( + publication(&run, &row).is_err(), + "matching forged RCP4 escaped {kind:?}" + ); + } + } + fn iteration_check_cold_terminal(kind: IterationTrace) { + for cancelled in [false, true] { + let (session, trace) = iteration_trace(kind, cancelled, 1000); + let bad = iteration_bad_count(&trace, kind); + let cause = if cancelled { + RuntimeTerminationCause::Cancelled + } else { + RuntimeTerminationCause::StorageFailure + }; + let runtime = RuntimeTermination::capture( + &session.snapshot(), + cause, + "authored malformed iteration evidence", + None, + ) + .unwrap(); + let run = + provider::configured_run(&session.snapshot(), "cold iteration negative fixture") + .unwrap(); + let mut encoder = Encoder::default(); + encoder.0.extend_from_slice(&provider::source_binding(&run)); + put_wrapped(&mut encoder, &runtime.encode().unwrap(), "RCT1:").unwrap(); + encoder.boolean(true); + encoder + .0 + .extend_from_slice(&iteration_bad_attempt_bytes(&bad)); + let archive = path(); + let limits = RecordingLimits::default(); + let mut recorder = StepRecorder::create(&archive, run, limits).unwrap(); + recorder + .finish( + if cancelled { "cancelled" } else { "failed" }, + &encoder.text(TERMINAL_PROFILE).unwrap(), + Some(session.snapshot().state().carrier.generation), + ) + .unwrap(); + drop(recorder); + drop(session); + let reader = RecordingReader::open(&archive, limits).unwrap(); + assert_eq!(reader.count().unwrap(), 0); + let result = terminal(&reader); + let refused = matches!(result, Err(RecordingError::Invalid(_))); + drop(reader); + std::fs::remove_file(archive).unwrap(); + assert!( + refused, + "cold RCT2 accepted malformed {kind:?}; cancelled={cancelled}" + ); + } + } + #[test] + fn iteration_limits_rct2_native_pressure_count() { + iteration_check_cold_terminal(IterationTrace::Native); + } + #[test] + fn iteration_limits_rct2_rejected_candidate_count() { + iteration_check_cold_terminal(IterationTrace::RejectedCandidate); + } + #[test] + fn iteration_limits_rct2_accepted_candidate_count() { + iteration_check_cold_terminal(IterationTrace::AcceptedCandidate); + } +} diff --git a/src/session.rs b/src/session.rs index f9880cdd..1c33f2e7 100644 --- a/src/session.rs +++ b/src/session.rs @@ -6,6 +6,7 @@ use crate::{ }; use std::{fmt, io::Write, time::Instant}; mod configured; +mod projection; /// Caller-assigned run and source identity, not proof of provenance or independence. #[derive(Debug, Clone, PartialEq, Eq)] @@ -83,6 +84,8 @@ pub struct SessionSnapshot<'a> { provider: Option<&'a crate::solver_provider::ProviderReport>, configured: Option<&'a crate::solver_provider::configured::ConfiguredProviderReport>, frame: usize, + projection_intent: Option, + projection_attempt: Option<&'a std::sync::Arc>, } impl<'a> SessionSnapshot<'a> { pub fn identity(&self) -> &'a SessionIdentity { @@ -161,6 +164,9 @@ pub struct SimulationSession { steps: usize, max_steps: usize, stopped: bool, + projection_intent: Option, + projection_attempt: Option>, + projection_attempt_counter: u64, } impl SimulationSession { pub fn new( @@ -202,6 +208,9 @@ impl SimulationSession { steps: 0, max_steps, stopped: false, + projection_intent: None, + projection_attempt: None, + projection_attempt_counter: 0, }) } pub fn capabilities(&self) -> SessionCapabilities { @@ -224,6 +233,8 @@ impl SimulationSession { provider: self.provider.as_ref(), configured: self.configured.as_ref(), frame: self.steps, + projection_intent: self.projection_intent, + projection_attempt: self.projection_attempt.as_ref(), } } /// Vec-capacity payload only, excluding caller allocations, identity, object @@ -269,6 +280,7 @@ impl SimulationSession { mut cancel: F, mut now: N, ) -> Result<(LiquidStepReport, crate::solver_provider::ProviderReport), SessionError> { + self.require_legacy_intent()?; if self.stopped { return Err(SessionError::Stopped); } @@ -315,6 +327,7 @@ impl SimulationSession { mut cancel: F, mut now: N, ) -> Result { + self.require_legacy_intent()?; if self.stopped { return Err(SessionError::Stopped); } diff --git a/src/session/configured.rs b/src/session/configured.rs index 02f5fa46..f69377bc 100644 --- a/src/session/configured.rs +++ b/src/session/configured.rs @@ -39,8 +39,50 @@ impl SimulationSession { Instant::now, ) } - #[allow(clippy::too_many_arguments)] // Explicit workspaces and injectable deadline clock. + /// Observe one real attempt, including failures with no accepted publication. + /// The caller owns monotonically increasing attempt ids within this run. + #[allow(clippy::too_many_arguments)] + pub fn step_with_configured_pressure_observed bool>( + &mut self, + inputs: LiquidStepInputs<'_>, + workspace: &mut crate::ProviderStepWorkspace, + viscosity: Option<(&mut crate::ViscosityWorkspace, f64)>, + preferred: Option<&mut dyn ContextPressureProvider>, + deadline: Option, + cancel: F, + attempt_id: u64, + evidence: &mut Option>, + ) -> Result<(LiquidStepReport, ConfiguredProviderReport), SessionError> { + self.configured_step_observed_clock( + inputs, + workspace, + viscosity, + preferred, + deadline, + cancel, + Instant::now, + attempt_id, + evidence, + ) + } + #[allow(clippy::too_many_arguments)] fn configured_step_with_clock bool, N: FnMut() -> Instant>( + &mut self, + inputs: LiquidStepInputs<'_>, + workspace: &mut crate::ProviderStepWorkspace, + viscosity: Option<(&mut crate::ViscosityWorkspace, f64)>, + preferred: Option<&mut dyn ContextPressureProvider>, + deadline: Option, + cancel: F, + now: N, + ) -> Result<(LiquidStepReport, ConfiguredProviderReport), SessionError> { + let attempt_id = self.simulation.state().carrier.generation.saturating_add(1); + self.configured_step_observed_clock( + inputs, workspace, viscosity, preferred, deadline, cancel, now, attempt_id, &mut None, + ) + } + #[allow(clippy::too_many_arguments)] + fn configured_step_observed_clock bool, N: FnMut() -> Instant>( &mut self, inputs: LiquidStepInputs<'_>, workspace: &mut crate::ProviderStepWorkspace, @@ -49,69 +91,164 @@ impl SimulationSession { deadline: Option, mut cancel: F, mut now: N, + attempt_id: u64, + evidence: &mut Option>, ) -> Result<(LiquidStepReport, ConfiguredProviderReport), SessionError> { - if self.stopped { - return Err(SessionError::Stopped); - } - if self.steps >= self.max_steps { - return Err(SessionError::StepLimit); - } - if deadline.is_some_and(|d| now() >= d) { - return Err(SessionError::Deadline); - } - let generation = self - .simulation - .state() - .carrier - .generation - .checked_add(1) - .ok_or(SessionError::PressureBinding( + use crate::workflow::{AttemptOutcome, NodeKind, NodeReceipt, NodeStatus, WorkflowAttempt}; + *evidence = None; + self.require_legacy_intent()?; + if attempt_id == 0 { + return Err(SessionError::PressureBinding( crate::solver_provider::ProviderRejection::Unsupported( - "pressure generation exhausted", + "workflow attempt identity must be nonzero", ), - ))?; - let run_id = self.identity.run_id.to_string(); + )); + } + let accepted_generation = self.simulation.state().carrier.generation; + let generation = + accepted_generation + .checked_add(1) + .ok_or(SessionError::PressureBinding( + crate::solver_provider::ProviderRejection::Unsupported( + "pressure generation exhausted", + ), + ))?; + let descriptor = self + .simulation + .workflow_descriptor(viscosity.as_ref().map(|(_, mu)| *mu)); let interval_start = self.simulation.state().carrier.time; - let configured = AcceptedContextInput { - run_id, - generation, + let trace = std::rc::Rc::new(std::cell::RefCell::new(WorkflowAttempt { + descriptor_sha256: descriptor.digest(), + descriptor, + input_sha256: crate::workflow::input_digest(self.simulation.state()), + request_sha256: crate::workflow::request_digest(inputs), + force_count: inputs.forces.len(), + smoke_source_present: inputs.smoke_source.is_some(), + volume_source_present: inputs.source.is_some(), + run_id: self.identity.run_id, + attempt_id, + accepted_generation, + attempted_generation: generation, interval_start, - history: self.pressure_history, - dynamic_viscosity: viscosity.as_ref().map_or(0.0, |(_, mu)| *mu), - provider: preferred, - }; - let mut expired = false; - let result = self.simulation.step_with_configured_pressure( - inputs, - workspace, - viscosity, - configured, - |stage| { - expired = deadline.is_some_and(|d| now() >= d); + requested_dt: inputs.requested_dt, + actual_dt: None, + publication: None, + outcome: AttemptOutcome::Failed, + nodes: Vec::with_capacity(NodeKind::ALL.len() + 2), + pressure: None, + actual_divergence_max: None, + diagnostic: String::new(), + })); + let result = (|| { + if self.stopped { + return Err(SessionError::Stopped); + } + if self.steps >= self.max_steps { + return Err(SessionError::StepLimit); + } + if deadline.is_some_and(|d| now() >= d) { + return Err(SessionError::Deadline); + } + trace.borrow_mut().nodes.extend([ + NodeReceipt { + node: NodeKind::Geometry, + status: NodeStatus::Completed, + }, + NodeReceipt { + node: NodeKind::AcceptedState, + status: NodeStatus::Completed, + }, + ]); + let configured = AcceptedContextInput { + workflow: trace.clone(), + run_id: self.identity.run_id.to_string(), + generation, + interval_start, + history: self.pressure_history, + dynamic_viscosity: viscosity.as_ref().map_or(0.0, |(_, mu)| *mu), + provider: preferred, + }; + let mut expired = false; + let result = self.simulation.step_with_configured_pressure( + inputs, + workspace, + viscosity, + configured, + |stage| { + expired = deadline.is_some_and(|d| now() >= d); + if expired { + return true; + } + let cancelled = cancel(stage); + expired = deadline.is_some_and(|d| now() >= d); + expired || cancelled + }, + ); + let (report, provider) = result.map_err(|e| { if expired { - return true; + SessionError::Deadline + } else { + SessionError::Step(e) } - let cancelled = cancel(stage); - expired = deadline.is_some_and(|d| now() >= d); - expired || cancelled - }, - ); - let (report, provider) = result.map_err(|e| { - if expired { - SessionError::Deadline - } else { - SessionError::Step(e) + })?; + // In-memory bounded receipt adoption follows the existing atomic commit. + self.accept_pressure_history(report, &provider.pressure, provider.dynamic_viscosity); + self.interval_start = Some(interval_start); + self.steps += 1; + self.report = Some(report); + self.provider = Some(provider.pressure.clone()); + self.configured = Some(provider.clone()); + Ok((report, provider)) + })(); + *evidence = Some(match &result { + Ok((_, provider)) => provider + .workflow + .as_ref() + .expect("workflow prepared before commit") + .clone(), + Err(error) => { + let mut trace = trace.borrow_mut(); + let diagnostic = format!("{error}"); + trace.diagnostic = diagnostic.chars().take(240).collect(); + trace.outcome = match error { + SessionError::Deadline + | SessionError::Step(crate::LiquidStepError::Cancelled) + | SessionError::Step(crate::LiquidStepError::Carrier( + crate::SimulationError::Cancelled { .. }, + )) + | SessionError::Step(crate::LiquidStepError::Carrier( + crate::SimulationError::Advection(crate::AdvectionError::Cancelled), + )) + | SessionError::Step(crate::LiquidStepError::Carrier( + crate::SimulationError::Pressure(crate::PressureError::Cancelled { + .. + }), + )) + | SessionError::Step(crate::LiquidStepError::Carrier( + crate::SimulationError::Viscosity(crate::ViscosityError::Cancelled { + .. + }), + )) + | SessionError::Step(crate::LiquidStepError::Volume( + crate::LiquidVolumeError::Cancelled { .. }, + )) => AttemptOutcome::Cancelled, + SessionError::Stopped + | SessionError::StepLimit + | SessionError::PressureBinding(_) + | SessionError::Step(crate::LiquidStepError::Carrier( + crate::SimulationError::UnsupportedProviderDomain + | crate::SimulationError::ProviderWorkspaceMismatch + | crate::SimulationError::InvalidTimeStep, + )) + | SessionError::Step(crate::LiquidStepError::Carrier( + crate::SimulationError::Viscosity(crate::ViscosityError::UnsupportedDomain), + )) => AttemptOutcome::Refused, + _ => AttemptOutcome::Failed, + }; + std::sync::Arc::new(trace.clone()) } - })?; - // All fallible/allocating work and callbacks ended before the physics - // commit. Arc receipt clones are bounded ownership updates, not arrays. - self.accept_pressure_history(report, &provider.pressure, provider.dynamic_viscosity); - self.interval_start = Some(interval_start); - self.steps += 1; - self.report = Some(report); - self.provider = Some(provider.pressure.clone()); - self.configured = Some(provider.clone()); - Ok((report, provider)) + }); + result } pub(super) fn accept_pressure_history( &mut self, diff --git a/src/session/projection.rs b/src/session/projection.rs new file mode 100644 index 00000000..554c0af4 --- /dev/null +++ b/src/session/projection.rs @@ -0,0 +1,325 @@ +//! Opt-in closed projection execution through the existing full interval owner. +use super::*; +use crate::projection_step::*; +use std::{ + cell::{Cell, RefCell}, + sync::Arc, +}; + +impl<'a> SessionSnapshot<'a> { + pub fn projection_intent(&self) -> Option { + self.projection_intent + } + /// Accepted receipt only. A later failed attempt never replaces this Arc. + pub fn projection_attempt(&self) -> Option<&'a Arc> { + self.projection_attempt + } +} +impl SimulationSession { + /// Construct the sealed, stationary constant-density builtin projection + /// path. Intent is immutable; legacy Session step entrypoints then refuse. + /// There is no caller provider, optional viscosity, or external runtime. + #[allow(clippy::too_many_arguments)] + pub fn new_with_projection( + identity: SessionIdentity, + grid: GridGeometry, + config: LiquidTransportConfig, + implementation: PressureImplementation, + fraction: Vec, + workspace_limit: usize, + max_steps: usize, + intent: ProjectionIntent, + ) -> Result { + let configuration = SessionConfiguration { + transport: config, + implementation, + boundary_workspace_limit: workspace_limit, + max_steps, + }; + intent.validate_configuration(&configuration).map_err(|_| { + SessionError::PressureBinding(crate::solver_provider::ProviderRejection::Unsupported( + "invalid native projection configuration", + )) + })?; + let mut session = Self::new( + identity, + grid, + config, + implementation, + fraction, + workspace_limit, + max_steps, + )?; + session.projection_intent = Some(intent); + Ok(session) + } + /// Produce and qualify actual provisional native fields, then publish only + /// after the existing complete carrier/volume gates. Failure returns a + /// separate attempt and consumes no accepted quota. Deadlines are cooperative. + /// The additive recording profile supports cold library inspection; the + /// existing desktop workflow graph deliberately does not inspect this profile. + pub fn step_with_native_projection( + &mut self, + inputs: LiquidStepInputs<'_>, + workspace: &mut ProjectionStepWorkspace, + deadline: Option, + cancel: impl FnMut(ProjectionStepStage) -> bool, + ) -> Result { + self.projection_step_with_clock(inputs, workspace, deadline, cancel, Instant::now) + } + fn projection_step_with_clock( + &mut self, + inputs: LiquidStepInputs<'_>, + workspace: &mut ProjectionStepWorkspace, + deadline: Option, + mut cancel: impl FnMut(ProjectionStepStage) -> bool, + mut now: impl FnMut() -> Instant, + ) -> Result { + let Some(attempt_id) = self.projection_attempt_counter.checked_add(1) else { + return Err(ProjectionStepFailure { + error: ProjectionStepError::AttemptExhausted, + attempt: None, + }); + }; + self.projection_attempt_counter = attempt_id; + let state = self.simulation.state(); + let accepted_generation = state.carrier.generation; + let interval_start = state.carrier.time; + let intent = self + .projection_intent + .unwrap_or(ProjectionIntent::BuiltinNativeV1); + let mut capture = ProjectionCapture { + stage: ProjectionAttemptStage::SessionGuard, + attempt: Arc::new(ProjectionAttempt { + version: intent.version(), + intent, + source: self.identity.clone(), + attempt_id, + accepted_generation, + attempted_generation: accepted_generation.checked_add(1), + interval_start, + requested_dt: inputs.requested_dt, + actual_dt: None, + input_sha256: crate::workflow::input_digest(state), + controls_sha256: crate::workflow::request_digest(inputs), + provisional_input_id: None, + producer: None, + producer_failure: None, + qualification: None, + selected_native: None, + outcome: ProjectionAttemptOutcome::Failed { + stage: ProjectionAttemptStage::SessionGuard, + code: ProjectionFailureCode::InvalidInput, + }, + output_sha256: None, + diagnostic: String::new(), + }), + }; + #[cfg(test)] + let _alias = workspace + .alias_before_work() + .then(|| capture.attempt.clone()); + let expired = Cell::new(false); + let result = (|| { + capture + .update(|_| {}) + .map_err(|_| ProjectionStepError::ReceiptAliased)?; + if self.projection_intent.is_none() { + return Err(ProjectionStepError::IntentMismatch); + } + if self.stopped { + return Err(ProjectionStepError::Session(SessionError::Stopped)); + } + if self.steps >= self.max_steps { + return Err(ProjectionStepError::Session(SessionError::StepLimit)); + } + if capture.attempt.attempted_generation.is_none() { + return Err(ProjectionStepError::Session(SessionError::Step( + LiquidStepError::Carrier(crate::SimulationError::GenerationOverflow), + ))); + } + if !workspace.matches_intent( + self.simulation.grid(), + self.configuration.transport.carrier.density, + self.configuration.implementation, + intent, + ) { + return Err(ProjectionStepError::WorkspaceMismatch); + } + if deadline.is_some_and(|d| now() >= d) { + return Err(ProjectionStepError::Session(SessionError::Deadline)); + } + let mut guarded = |stage| { + if deadline.is_some_and(|d| now() >= d) { + expired.set(true); + return true; + } + let cancelled = cancel(stage); + if deadline.is_some_and(|d| now() >= d) { + expired.set(true); + return true; + } + cancelled + }; + let control = ProjectionControl { + callback: RefCell::new(&mut guarded), + }; + let (report, native) = self + .simulation + .step_with_native_projection( + inputs, + ProjectionStepInput { + workspace, + capture: &mut capture, + source: &self.identity, + configuration: &self.configuration, + control: &control, + }, + |stage| { + crate::projection_step::ProjectionCancellation::poll( + &control, + ProjectionStepStage::Liquid(stage), + ) + }, + ) + .map_err(|error| projection_step_error(error, expired.get()))?; + // Successful receipt was fully validated/sealed before Liquid's + // infallible pressure copy and owner swaps. Adoption adds no callback. + self.interval_start = Some(interval_start); + self.steps += 1; + self.report = Some(report); + self.provider = Some(native.clone()); + self.configured = Some( + crate::solver_provider::configured::ConfiguredProviderReport { + workflow: None, + dynamic_viscosity: 0.0, + binding: None, + context: None, + prediction_called: false, + pressure: native, + }, + ); + self.pressure_history = None; + self.projection_attempt = Some(capture.attempt.clone()); + Ok(report) + })(); + match result { + Ok(report) => Ok(ProjectionStepAccepted { + report, + attempt: capture.attempt, + }), + Err(error) => { + let (code, cancelled, refused) = failure_facts(&error, capture.stage); + let diagnostic = format!("{error}").chars().take(240).collect::(); + let outcome = if cancelled { + ProjectionAttemptOutcome::Cancelled { + stage: capture.stage, + } + } else if refused { + ProjectionAttemptOutcome::Refused { + stage: capture.stage, + code, + } + } else { + ProjectionAttemptOutcome::Failed { + stage: capture.stage, + code, + } + }; + // Aliased diagnostic scratch is not mutated. A separate bounded + // failure receipt is allocated before any accepted publication. + if Arc::get_mut(&mut capture.attempt).is_none() { + let mut failure = (*capture.attempt).clone(); + failure.outcome = outcome; + failure.output_sha256 = None; + failure.diagnostic = diagnostic; + capture.attempt = Arc::new(failure); + } else { + let failure = Arc::get_mut(&mut capture.attempt).expect("exclusivity checked"); + failure.outcome = outcome; + failure.output_sha256 = None; + failure.diagnostic = diagnostic; + } + Err(ProjectionStepFailure { + error, + attempt: Some(capture.attempt), + }) + } + } + } + pub(super) fn require_legacy_intent(&self) -> Result<(), SessionError> { + if self.projection_intent.is_some() { + return Err(SessionError::PressureBinding( + crate::solver_provider::ProviderRejection::Unsupported( + "projection Session requires its immutable native projection path", + ), + )); + } + Ok(()) + } +} +fn projection_step_error(error: LiquidStepError, expired: bool) -> ProjectionStepError { + if expired { + return ProjectionStepError::Session(SessionError::Deadline); + } + match error { + LiquidStepError::Carrier(crate::SimulationError::ProjectionMixedQualificationFallback) => { + ProjectionStepError::UnrepresentableMixedQualificationFallback + } + LiquidStepError::Carrier(crate::SimulationError::ProjectionReceiptAliased) => { + ProjectionStepError::ReceiptAliased + } + LiquidStepError::Carrier(crate::SimulationError::ProjectionReceiptInvalid(reason)) => { + ProjectionStepError::InvalidReceipt(reason) + } + other => ProjectionStepError::Session(SessionError::Step(other)), + } +} +fn failure_facts( + error: &ProjectionStepError, + stage: ProjectionAttemptStage, +) -> (ProjectionFailureCode, bool, bool) { + use ProjectionFailureCode as C; + let code = match error { + ProjectionStepError::IntentMismatch => C::IntentMismatch, + ProjectionStepError::WorkspaceMismatch => C::WorkspaceMismatch, + ProjectionStepError::ReceiptAliased => C::ReceiptAliased, + ProjectionStepError::InvalidReceipt(_) => C::InvalidInput, + ProjectionStepError::UnrepresentableMixedQualificationFallback => { + C::UnrepresentableMixedQualificationFallback + } + ProjectionStepError::AttemptExhausted => C::InvalidInput, + ProjectionStepError::Session(SessionError::Stopped) => C::Stopped, + ProjectionStepError::Session(SessionError::StepLimit) => C::StepLimit, + ProjectionStepError::Session(SessionError::Deadline) => return (C::Deadline, true, false), + ProjectionStepError::Session(SessionError::Step(LiquidStepError::Carrier( + crate::SimulationError::GenerationOverflow, + ))) => C::GenerationExhausted, + ProjectionStepError::Session(SessionError::Step( + LiquidStepError::Cancelled + | LiquidStepError::Carrier( + crate::SimulationError::Cancelled { .. } + | crate::SimulationError::Advection(crate::AdvectionError::Cancelled) + | crate::SimulationError::Pressure(crate::PressureError::Cancelled { .. }) + | crate::SimulationError::Projection( + crate::solver_provider::composition::projection::ProjectionError::Cancelled + | crate::solver_provider::composition::projection::ProjectionError::Pressure( + crate::PressureError::Cancelled { .. }, + ), + ), + ) + | LiquidStepError::Volume(crate::LiquidVolumeError::Cancelled { .. }), + )) => return (C::InvalidInput, true, false), + _ => match stage { + ProjectionAttemptStage::NativeProducer => C::NativePressure, + ProjectionAttemptStage::HostQualification => C::HostQualification, + ProjectionAttemptStage::VolumeTransport => C::Volume, + _ => C::Carrier, + }, + }; + (code, false, stage == ProjectionAttemptStage::SessionGuard) +} + +#[cfg(test)] +#[path = "projection_tests.rs"] +mod tests; diff --git a/src/session/projection_tests.rs b/src/session/projection_tests.rs new file mode 100644 index 00000000..62eff008 --- /dev/null +++ b/src/session/projection_tests.rs @@ -0,0 +1,1265 @@ +use super::*; +use crate::Axis; +use crate::projection_step::ProjectionFault; +use crate::solver_provider::composition::projection::{ProjectionCheckpoint, ProjectionSelection}; +use crate::{ + BodyForce, ForceUnits, GridGeometry, LiquidInlet, LiquidVolumeSettings, PressureSettings, + SimulationConfig, VolumeStamp, +}; +const CAP: usize = 16 * 1024 * 1024; +const FORCE: [BodyForce; 1] = [BodyForce { + value: [0.001, 0.0, 0.0], + units: ForceUnits::Acceleration, + region: None, +}]; +fn config() -> LiquidTransportConfig { + LiquidTransportConfig { + carrier: SimulationConfig { + density: 998.2, + memory_limit: CAP, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 2000, + }, + actual_divergence_limit: 1e-5, + max_courant: 1.0, + }, + represented_density: 998.2, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + } +} +fn inputs() -> LiquidStepInputs<'static> { + LiquidStepInputs { + requested_dt: 0.001, + smoke_source: None, + forces: &FORCE, + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]).unwrap(), + source: None, + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + } +} +fn owner( + method: PressureImplementation, + quota: usize, +) -> (SimulationSession, ProjectionStepWorkspace) { + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let session = SimulationSession::new_with_projection( + SessionIdentity { + run_id: 101, + source_revision: "c1b2-private-fixed-native".into(), + }, + grid.clone(), + config(), + method, + vec![0.5; grid.cell_len()], + CAP, + quota, + ProjectionIntent::BuiltinNativeV1, + ) + .unwrap(); + let workspace = ProjectionStepWorkspace::new(&grid, 998.2, CAP, method).unwrap(); + (session, workspace) +} +fn state(session: &SimulationSession) -> ([u8; 32], usize, Option>) { + ( + crate::workflow::input_digest(session.snapshot().state()), + session.snapshot().frame(), + session.snapshot().projection_attempt().cloned(), + ) +} +fn unchanged( + session: &SimulationSession, + before: &([u8; 32], usize, Option>), +) { + let after = state(session); + assert_eq!(after.0, before.0); + assert_eq!(after.1, before.1); + match (&after.2, &before.2) { + (Some(a), Some(b)) => assert!(Arc::ptr_eq(a, b)), + (None, None) => {} + _ => panic!("accepted receipt changed"), + } +} +fn validate(session: &SimulationSession, attempt: &ProjectionAttempt) { + attempt + .validate( + session.snapshot().configuration(), + session.snapshot().grid(), + ) + .unwrap(); +} +#[test] +fn c1b2_private_faults_keep_clean_fallback_and_refuse_mixed_fallback_without_publication() { + for method in PressureImplementation::ALL { + let (mut session, mut workspace) = owner(method, 10); + for fault in [ + ProjectionFault::WrongVelocity, + ProjectionFault::NonFiniteVelocity, + ] { + workspace.set_fault(fault); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + validate(&session, &accepted.attempt); + assert_eq!( + accepted.attempt.qualification.as_ref().unwrap().selection, + ProjectionSelection::NativeFallback + ); + assert!( + accepted + .attempt + .qualification + .as_ref() + .unwrap() + .witness + .is_none() + ); + let report = session.snapshot().provider_report().unwrap().clone(); + assert!( + report.attempted.is_none() + && report.rejection.is_none() + && report.candidate.is_none() + ); + assert_eq!(report.selected, method.id()); + } + for (fault, reason) in [ + ( + ProjectionFault::BadGauge, + ProjectionPressureRejection::NonZeroGauge, + ), + ( + ProjectionFault::BadPressure, + ProjectionPressureRejection::QualityGate, + ), + ] { + workspace.set_fault(fault); + let before = state(&session); + let failure = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::UnrepresentableMixedQualificationFallback + )); + let attempt = failure.attempt.unwrap(); + validate(&session, &attempt); + unchanged(&session, &before); + let q = attempt.qualification.as_ref().unwrap(); + assert_eq!( + q.rejection, + Some(ProjectionRejectionFacts::Pressure(reason)) + ); + assert_eq!( + q.witness.as_ref().unwrap().outcome, + ProjectionWitnessOutcome::Rejected(reason) + ); + assert!(q.native_fallback.is_some()); + assert!(attempt.selected_native.is_none()); + workspace.set_fault(ProjectionFault::None); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + assert_eq!(accepted.attempt.attempt_id, attempt.attempt_id + 1); + validate(&session, &accepted.attempt); + } + } +} +#[test] +fn c1b2_cancellation_at_every_observed_checkpoint_preserves_complete_publication() { + for method in PressureImplementation::ALL { + let (mut probe, mut probe_workspace) = owner(method, 10); + let mut checkpoints = Vec::new(); + probe + .step_with_native_projection(inputs(), &mut probe_workspace, None, |stage| { + if !checkpoints.contains(&stage) { + checkpoints.push(stage); + } + false + }) + .unwrap(); + assert!(checkpoints.contains(&ProjectionStepStage::ProducerPressurePoll)); + for point in [ + ProjectionCheckpoint::BeforeQualification, + ProjectionCheckpoint::BeforePressure, + ProjectionCheckpoint::PressurePoll, + ProjectionCheckpoint::AfterPressure, + ProjectionCheckpoint::BeforeReturn, + ] { + assert!(checkpoints.contains(&ProjectionStepStage::Qualification(point))); + } + assert!(checkpoints.contains(&ProjectionStepStage::Liquid(LiquidStepStage::BeforeCommit))); + for target in checkpoints { + let (mut session, mut workspace) = owner(method, 2); + session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let before = state(&session); + let mut observed = false; + let failure = session + .step_with_native_projection(inputs(), &mut workspace, None, |stage| { + if stage == target { + observed = true; + true + } else { + false + } + }) + .err() + .unwrap(); + assert!(observed, "{target:?}"); + unchanged(&session, &before); + let attempt = failure.attempt.unwrap(); + validate(&session, &attempt); + assert!( + matches!(attempt.outcome, ProjectionAttemptOutcome::Cancelled { .. }), + "target={target:?}; error={:?}; outcome={:?}", + failure.error, + attempt.outcome + ); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + assert_eq!(accepted.attempt.attempt_id, attempt.attempt_id + 1); + assert_eq!(accepted.report.carrier.step.generation, 2); + } + } +} +#[test] +fn c1b2_deadline_stop_quota_counter_and_arc_exclusivity_leave_accepted_state_unchanged() { + let method = PressureImplementation::JacobiPcgV1; + let (mut session, mut workspace) = owner(method, 10); + session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let before = state(&session); + let now = Instant::now(); + let failure = session + .projection_step_with_clock( + inputs(), + &mut workspace, + Some(now), + |_| panic!("expired callback"), + || now, + ) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Deadline) + )); + validate(&session, &failure.attempt.unwrap()); + unchanged(&session, &before); + let deadline = now + std::time::Duration::from_secs(1); + let clock = Cell::new(now); + let failure = session + .projection_step_with_clock( + inputs(), + &mut workspace, + Some(deadline), + |stage| { + if stage == ProjectionStepStage::Liquid(LiquidStepStage::BeforeCommit) { + clock.set(deadline); + } + false + }, + || clock.get(), + ) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Deadline) + )); + validate(&session, &failure.attempt.unwrap()); + unchanged(&session, &before); + for fault in [ + ProjectionFault::AliasBeforeWork, + ProjectionFault::AliasBeforeSeal, + ] { + workspace.set_fault(fault); + let failure = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .err() + .unwrap(); + assert!(matches!(failure.error, ProjectionStepError::ReceiptAliased)); + validate(&session, &failure.attempt.unwrap()); + unchanged(&session, &before); + } + workspace.set_fault(ProjectionFault::None); + session.projection_attempt_counter = u64::MAX; + let failure = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| { + panic!("exhausted callback") + }) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::AttemptExhausted + )); + assert!(failure.attempt.is_none()); + unchanged(&session, &before); + let (mut quota, mut w) = owner(method, 1); + quota + .step_with_native_projection(inputs(), &mut w, None, |_| false) + .unwrap(); + let old = state("a); + let failure = quota + .step_with_native_projection(inputs(), &mut w, None, |_| panic!("quota callback")) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::StepLimit) + )); + validate("a, &failure.attempt.unwrap()); + unchanged("a, &old); + quota.stop(); + let failure = quota + .step_with_native_projection(inputs(), &mut w, None, |_| panic!("stopped callback")) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Stopped) + )); + validate("a, &failure.attempt.unwrap()); + unchanged("a, &old); +} +#[test] +fn c1b2_late_volume_failure_and_native_pressure_failure_allow_clean_retry() { + for method in PressureImplementation::ALL { + let (mut session, mut workspace) = owner(method, 3); + session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let before = state(&session); + let mut invalid = inputs(); + invalid.volume.actual_divergence_limit = 0.0; + let failure = session + .step_with_native_projection(invalid, &mut workspace, None, |_| false) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Step(LiquidStepError::Volume( + crate::LiquidVolumeError::DivergenceLimit { .. } + ))) + )); + let attempt = failure.attempt.unwrap(); + validate(&session, &attempt); + assert!(attempt.qualification.is_some()); + unchanged(&session, &before); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + assert_eq!(accepted.attempt.attempt_id, attempt.attempt_id + 1); + // Existing positive fallback iteration budget is admitted; exhaustion is + // an actual native-producer error, never invented candidate fallback. + let mut cfg = config(); + cfg.carrier.pressure.max_iterations = 1; + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let mut owner = SimulationSession::new_with_projection( + SessionIdentity { + run_id: 105, + source_revision: "native-exhaustion".into(), + }, + grid.clone(), + cfg, + method, + vec![0.5; grid.cell_len()], + CAP, + 2, + ProjectionIntent::BuiltinNativeV1, + ) + .unwrap(); + let mut w = ProjectionStepWorkspace::new(&grid, 998.2, CAP, method).unwrap(); + let old = state(&owner); + let failure = owner + .step_with_native_projection(inputs(), &mut w, None, |_| false) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Step(LiquidStepError::Carrier( + crate::SimulationError::Pressure(crate::PressureError::IterationLimit { + iterations: 1, + .. + }) + ))) + )); + let attempt = failure.attempt.unwrap(); + validate(&owner, &attempt); + assert!(attempt.producer.is_none()); + assert!(attempt.qualification.is_none()); + unchanged(&owner, &old); + let mut zero = inputs(); + zero.forces = &[]; + owner + .step_with_native_projection(zero, &mut w, None, |_| false) + .unwrap(); + } +} +#[test] +fn c1b2_receipt_validator_rejects_crosslinked_reports_and_impossible_phase_prefixes() { + let (mut session, mut workspace) = owner(PressureImplementation::JacobiPcgV1, 3); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + for case in 0..11 { + let mut a = (*accepted.attempt).clone(); + match case { + 0 => a.selected_native.as_mut().unwrap().pressure.iterations = 0, + 1 => { + a.qualification + .as_mut() + .unwrap() + .witness + .as_mut() + .unwrap() + .diagnostics + .as_mut() + .unwrap() + .iterations = 1 + } + 2 => { + a.outcome = ProjectionAttemptOutcome::Cancelled { + stage: ProjectionAttemptStage::SessionGuard, + }; + a.output_sha256 = None; + } + 3 => { + a.outcome = ProjectionAttemptOutcome::Refused { + stage: ProjectionAttemptStage::BeforeCommit, + code: ProjectionFailureCode::Stopped, + }; + a.output_sha256 = None; + } + 4 => { + a.qualification.as_mut().unwrap().rejection = + Some(ProjectionRejectionFacts::MomentumWitness { + axis: Axis::X, + index: usize::MAX, + }) + } + 5 => a.qualification.as_mut().unwrap().selection = ProjectionSelection::NativeFallback, + 6 => a.provisional_input_id = None, + 7 => a.actual_dt = Some(a.requested_dt * 2.0), + 8..=10 => { + a.outcome = ProjectionAttemptOutcome::Failed { + stage: ProjectionAttemptStage::HostQualification, + code: if case == 10 { + ProjectionFailureCode::HostQualification + } else { + ProjectionFailureCode::UnrepresentableMixedQualificationFallback + }, + }; + a.output_sha256 = None; + a.selected_native = None; + if case == 8 { + a.qualification = None; + } + } + _ => unreachable!(), + } + assert!( + a.validate( + session.snapshot().configuration(), + session.snapshot().grid() + ) + .is_err(), + "case {case}" + ); + } + workspace.set_fault(ProjectionFault::BadPressure); + let failed = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .err() + .unwrap() + .attempt + .unwrap(); + let mut ieee = (*failed).clone(); + ieee.qualification + .as_mut() + .unwrap() + .witness + .as_mut() + .unwrap() + .diagnostics + .as_mut() + .unwrap() + .true_residual_l2 = f64::NAN; + // Rejected measured diagnostics retain their IEEE payload; acceptance never + // borrows that rule. This is a codec-validation negative fixture only. + validate(&session, &ieee); +} + +#[test] +fn c1b2_preparation_refusals_have_valid_failed_receipts_before_work() { + for method in PressureImplementation::ALL { + let (mut session, mut workspace) = owner(method, 3); + session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let before = state(&session); + let bad_rate = [0.0]; + for case in 0..2 { + let mut input = inputs(); + if case == 0 { + input.volume.max_outward_courant = 0.0; + } else { + input.source = Some( + crate::LiquidVolumeSource::new(VolumeStamp { id: 9, version: 1 }, &bad_rate) + .unwrap(), + ); + } + let failure = session + .step_with_native_projection(input, &mut workspace, None, |_| { + panic!("preparation callback") + }) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Step(LiquidStepError::Volume(_))) + )); + let attempt = failure.attempt.unwrap(); + validate(&session, &attempt); + unchanged(&session, &before); + assert!(matches!( + attempt.outcome, + ProjectionAttemptOutcome::Failed { + stage: ProjectionAttemptStage::CarrierPreparation, + .. + } + )); + assert!(attempt.producer.is_none() && attempt.qualification.is_none()); + } + for (grid, density, implementation) in [ + ( + GridGeometry::new([5; 3], [0.2; 3], [0.0; 3]).unwrap(), + 998.2, + method, + ), + (session.snapshot().grid().clone(), 1.0, method), + ( + session.snapshot().grid().clone(), + 998.2, + if method == PressureImplementation::JacobiPcgV1 { + PressureImplementation::SymmetricGaussSeidelPcgV1 + } else { + PressureImplementation::JacobiPcgV1 + }, + ), + ] { + let mut wrong = + ProjectionStepWorkspace::new(&grid, density, CAP, implementation).unwrap(); + let failure = session + .step_with_native_projection(inputs(), &mut wrong, None, |_| { + panic!("workspace refusal callback") + }) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::WorkspaceMismatch + )); + validate(&session, &failure.attempt.unwrap()); + unchanged(&session, &before); + } + let grid = session.snapshot().grid().clone(); + assert!(ProjectionStepWorkspace::new(&grid, 998.2, 0, method).is_err()); + assert!(ProjectionStepWorkspace::new(&grid, 0.0, CAP, method).is_err()); + let required = workspace.allocated_bytes(); + assert_eq!( + ProjectionStepWorkspace::new(&grid, 998.2, required, method) + .unwrap() + .allocated_bytes(), + required + ); + assert!(ProjectionStepWorkspace::new(&grid, 998.2, required - 1, method).is_err()); + let mut cfg = config(); + cfg.carrier.pressure.max_iterations = 0; + assert!( + SimulationSession::new_with_projection( + SessionIdentity { + run_id: 2, + source_revision: "invalid-positive-fallback".into() + }, + grid.clone(), + cfg, + method, + vec![0.5; grid.cell_len()], + CAP, + 2, + ProjectionIntent::BuiltinNativeV1 + ) + .is_err() + ); + } +} + +fn other_method(method: PressureImplementation) -> PressureImplementation { + match method { + PressureImplementation::JacobiPcgV1 => PressureImplementation::SymmetricGaussSeidelPcgV1, + PressureImplementation::SymmetricGaussSeidelPcgV1 => PressureImplementation::JacobiPcgV1, + } +} +fn selection_owner( + fallback: PressureImplementation, + producer_cap: usize, + quota: usize, +) -> (SimulationSession, ProjectionStepWorkspace) { + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let intent = ProjectionIntent::ClassicalSelectionV1 { + producer: other_method(fallback), + producer_max_iterations: producer_cap, + }; + let session = SimulationSession::new_with_projection( + SessionIdentity { + run_id: 101, + source_revision: "c1b3-fixed-native-selection".into(), + }, + grid.clone(), + config(), + fallback, + vec![0.5; grid.cell_len()], + CAP, + quota, + intent, + ) + .unwrap(); + let workspace = + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, CAP, fallback, intent).unwrap(); + (session, workspace) +} +#[test] +fn c1b3_each_observed_checkpoint_cancels_without_retry_or_publication_and_reused_scratch_matches_fresh() + { + for fallback in PressureImplementation::ALL { + for cap in [1, 2000] { + let (mut probe, mut scratch) = selection_owner(fallback, cap, 3); + let mut checkpoints = Vec::new(); + let actual = probe + .step_with_native_projection(inputs(), &mut scratch, None, |stage| { + if !checkpoints.contains(&stage) { + checkpoints.push(stage); + } + false + }) + .unwrap(); + validate(&probe, &actual.attempt); + assert_eq!(actual.attempt.version, 2); + assert_eq!(actual.attempt.producer_failure.is_some(), cap == 1); + for target in checkpoints { + let (mut owner, mut workspace) = selection_owner(fallback, cap, 2); + owner + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let before = state(&owner); + let mut reached = false; + let mut qualification_seen = false; + let failure = owner + .step_with_native_projection(inputs(), &mut workspace, None, |stage| { + if matches!(stage, ProjectionStepStage::Qualification(_)) { + qualification_seen = true; + } + if stage == target { + reached = true; + true + } else { + false + } + }) + .err() + .unwrap(); + assert!(reached, "{target:?}"); + unchanged(&owner, &before); + let attempt = failure.attempt.unwrap(); + validate(&owner, &attempt); + assert!( + matches!(attempt.outcome, ProjectionAttemptOutcome::Cancelled { .. }), + "{target:?}: {:?}", + failure.error + ); + if target == ProjectionStepStage::ProducerPressurePoll { + assert!(!qualification_seen); + assert!(attempt.producer_failure.is_none()); + assert!(attempt.qualification.is_none()); + } + if matches!(target, ProjectionStepStage::Qualification(_)) { + assert_eq!(attempt.producer_failure.is_some(), cap == 1); + assert!(attempt.qualification.is_none()); + } + let accepted = owner + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + assert_eq!(accepted.attempt.attempt_id, attempt.attempt_id + 1); + assert_eq!(accepted.report.carrier.step.generation, 2); + let (mut fresh, mut fresh_workspace) = selection_owner(fallback, cap, 2); + fresh + .step_with_native_projection(inputs(), &mut fresh_workspace, None, |_| false) + .unwrap(); + fresh + .step_with_native_projection(inputs(), &mut fresh_workspace, None, |_| false) + .unwrap(); + assert_eq!(state(&owner).0, state(&fresh).0); + assert_eq!( + format!("{:?}", owner.snapshot().report().unwrap().carrier.step), + format!("{:?}", fresh.snapshot().report().unwrap().carrier.step) + ); + } + } + } +} +#[test] +fn c1b3_distinct_producer_faults_preserve_clean_host_fallback_and_unpublished_mixed_receipts() { + for fallback in PressureImplementation::ALL { + let (mut session, mut workspace) = selection_owner(fallback, 2000, 10); + for fault in [ + ProjectionFault::WrongVelocity, + ProjectionFault::NonFiniteVelocity, + ] { + workspace.set_fault(fault); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + validate(&session, &accepted.attempt); + assert_eq!( + accepted.attempt.producer.as_ref().unwrap().implementation, + other_method(fallback) + ); + assert!(accepted.attempt.producer_failure.is_none()); + assert_eq!( + accepted.attempt.qualification.as_ref().unwrap().selection, + ProjectionSelection::NativeFallback + ); + assert_eq!( + accepted + .attempt + .selected_native + .as_ref() + .unwrap() + .implementation, + fallback + ); + } + for fault in [ProjectionFault::BadGauge, ProjectionFault::BadPressure] { + workspace.set_fault(fault); + let before = state(&session); + let failure = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::UnrepresentableMixedQualificationFallback + )); + let attempt = failure.attempt.unwrap(); + validate(&session, &attempt); + unchanged(&session, &before); + assert!(attempt.qualification.is_some()); + assert!(attempt.selected_native.is_none()); + workspace.set_fault(ProjectionFault::None); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + assert_eq!(accepted.attempt.attempt_id, attempt.attempt_id + 1); + assert_eq!( + accepted + .attempt + .selected_native + .as_ref() + .unwrap() + .implementation, + other_method(fallback) + ); + } + } +} +#[test] +fn c1b3_invalid_intents_caps_and_exact_workspace_mismatch_refuse_before_invocation() { + for fallback in PressureImplementation::ALL { + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + for intent in [ + ProjectionIntent::ClassicalSelectionV1 { + producer: fallback, + producer_max_iterations: 2000, + }, + ProjectionIntent::ClassicalSelectionV1 { + producer: other_method(fallback), + producer_max_iterations: 0, + }, + ProjectionIntent::ClassicalSelectionV1 { + producer: other_method(fallback), + producer_max_iterations: 2001, + }, + ] { + assert!( + SimulationSession::new_with_projection( + SessionIdentity { + run_id: 1, + source_revision: "invalid-selection".into() + }, + grid.clone(), + config(), + fallback, + vec![0.5; grid.cell_len()], + CAP, + 2, + intent + ) + .is_err() + ); + } + for intent in [ + ProjectionIntent::ClassicalSelectionV1 { + producer: fallback, + producer_max_iterations: 2000, + }, + ProjectionIntent::ClassicalSelectionV1 { + producer: other_method(fallback), + producer_max_iterations: 0, + }, + ] { + assert!( + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, CAP, fallback, intent) + .is_err() + ); + } + let (mut session, mut correct) = selection_owner(fallback, 2000, 4); + session + .step_with_native_projection(inputs(), &mut correct, None, |_| false) + .unwrap(); + let before = state(&session); + for intent in [ + ProjectionIntent::BuiltinNativeV1, + ProjectionIntent::ClassicalSelectionV1 { + producer: other_method(fallback), + producer_max_iterations: 1, + }, + ] { + let mut wrong = + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, CAP, fallback, intent) + .unwrap(); + let failure = session + .step_with_native_projection(inputs(), &mut wrong, None, |_| { + panic!("mismatched workspace callback") + }) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::WorkspaceMismatch + )); + validate(&session, &failure.attempt.unwrap()); + unchanged(&session, &before); + } + let intent = session.snapshot().projection_intent().unwrap(); + for (wrong_grid, density, method, wrong_intent) in [ + ( + GridGeometry::new([5; 3], [0.2; 3], [0.0; 3]).unwrap(), + 998.2, + fallback, + intent, + ), + (grid.clone(), 1.0, fallback, intent), + ( + grid.clone(), + 998.2, + other_method(fallback), + ProjectionIntent::ClassicalSelectionV1 { + producer: fallback, + producer_max_iterations: 2000, + }, + ), + ] { + let mut wrong = ProjectionStepWorkspace::new_with_intent( + &wrong_grid, + density, + CAP, + method, + wrong_intent, + ) + .unwrap(); + let failure = session + .step_with_native_projection(inputs(), &mut wrong, None, |_| { + panic!("mismatched grid/rho/method callback") + }) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::WorkspaceMismatch + )); + unchanged(&session, &before); + } + assert!( + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, 0, fallback, intent).is_err() + ); + let required = correct.allocated_bytes(); + assert_eq!( + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, required, fallback, intent) + .unwrap() + .allocated_bytes(), + required + ); + assert!( + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, required - 1, fallback, intent) + .is_err() + ); + // Legacy builtin workspace still uses its original constructor and is + // separately matched; neither immutable run intent can borrow the other. + let (mut builtin, mut builtin_workspace) = owner(fallback, 2); + let old = state(&builtin); + let failure = builtin + .step_with_native_projection(inputs(), &mut correct, None, |_| { + panic!("builtin mismatch callback") + }) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::WorkspaceMismatch + )); + unchanged(&builtin, &old); + builtin + .step_with_native_projection(inputs(), &mut builtin_workspace, None, |_| false) + .unwrap(); + } +} + +#[test] +fn c1b3_genuine_fallback_iteration_failure_is_unpublished_and_repeatable() { + for fallback in PressureImplementation::ALL { + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let mut cfg = config(); + cfg.carrier.pressure.max_iterations = 1; + let intent = ProjectionIntent::ClassicalSelectionV1 { + producer: other_method(fallback), + producer_max_iterations: 1, + }; + let make = || { + SimulationSession::new_with_projection( + SessionIdentity { + run_id: 103, + source_revision: "c1b3-frozen-both-cap1".into(), + }, + grid.clone(), + cfg, + fallback, + vec![0.5; grid.cell_len()], + CAP, + 3, + intent, + ) + .unwrap() + }; + let mut session = make(); + let mut workspace = + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, CAP, fallback, intent).unwrap(); + let mut zero = inputs(); + zero.forces = &[]; + session + .step_with_native_projection(zero, &mut workspace, None, |_| false) + .unwrap(); + let before = state(&session); + let failed = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .err() + .unwrap(); + assert!(matches!( + failed.error, + ProjectionStepError::Session(SessionError::Step(LiquidStepError::Carrier( + crate::SimulationError::Projection( + crate::solver_provider::composition::projection::ProjectionError::Pressure( + crate::PressureError::IterationLimit { iterations: 1, .. } + ) + ) + ))) + )); + let attempt = failed.attempt.unwrap(); + validate(&session, &attempt); + unchanged(&session, &before); + assert!(matches!( + attempt.producer_failure.as_ref().unwrap().failure, + ProjectionProducerFailure::IterationLimit { iterations: 1, .. } + )); + assert!( + attempt.producer.is_none() + && attempt.qualification.is_none() + && attempt.selected_native.is_none() + ); + assert!(matches!( + attempt.outcome, + ProjectionAttemptOutcome::Failed { + stage: ProjectionAttemptStage::HostQualification, + code: ProjectionFailureCode::HostQualification + } + )); + let retry = session + .step_with_native_projection(zero, &mut workspace, None, |_| false) + .unwrap(); + assert_eq!(retry.attempt.attempt_id, attempt.attempt_id + 1); + let mut fresh = make(); + let mut fresh_workspace = + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, CAP, fallback, intent).unwrap(); + fresh + .step_with_native_projection(zero, &mut fresh_workspace, None, |_| false) + .unwrap(); + fresh + .step_with_native_projection(zero, &mut fresh_workspace, None, |_| false) + .unwrap(); + assert_eq!(state(&session).0, state(&fresh).0); + } +} +#[test] +fn c1b3_deadlines_inner_iterations_late_volume_and_terminal_guards_do_not_publish() { + for fallback in PressureImplementation::ALL { + for cap in [1, 2000] { + let (mut session, mut workspace) = selection_owner(fallback, cap, 8); + session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let before = state(&session); + let now = Instant::now(); + let deadline = now + std::time::Duration::from_secs(1); + let failure = session + .projection_step_with_clock( + inputs(), + &mut workspace, + Some(now), + |_| panic!("expired callback"), + || now, + ) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Deadline) + )); + validate(&session, &failure.attempt.unwrap()); + unchanged(&session, &before); + for target in [ + ProjectionStepStage::ProducerPressurePoll, + ProjectionStepStage::Qualification(ProjectionCheckpoint::PressurePoll), + ProjectionStepStage::Liquid(LiquidStepStage::BeforeCommit), + ] { + let clock = Cell::new(now); + let failure = session + .projection_step_with_clock( + inputs(), + &mut workspace, + Some(deadline), + |stage| { + if stage == target { + clock.set(deadline); + } + false + }, + || clock.get(), + ) + .err() + .unwrap(); + assert!( + matches!( + failure.error, + ProjectionStepError::Session(SessionError::Deadline) + ), + "{target:?}" + ); + validate(&session, &failure.attempt.unwrap()); + unchanged(&session, &before); + } + let target = if cap == 1 { + ProjectionStepStage::Qualification(ProjectionCheckpoint::PressurePoll) + } else { + ProjectionStepStage::ProducerPressurePoll + }; + let mut polls = 0; + let failure = session + .step_with_native_projection(inputs(), &mut workspace, None, |stage| { + if stage == target { + polls += 1; + } + stage == target && polls == 4 + }) + .err() + .unwrap(); + assert_eq!(polls, 4); + let attempt = failure.attempt.unwrap(); + validate(&session, &attempt); + unchanged(&session, &before); + assert!(matches!( + attempt.outcome, + ProjectionAttemptOutcome::Cancelled { .. } + )); + assert_eq!(attempt.producer_failure.is_some(), cap == 1); + assert!(attempt.qualification.is_none()); + let mut input = inputs(); + input.volume.actual_divergence_limit = 0.0; + let failure = session + .step_with_native_projection(input, &mut workspace, None, |_| false) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Step(LiquidStepError::Volume( + crate::LiquidVolumeError::DivergenceLimit { .. } + ))) + )); + validate(&session, &failure.attempt.unwrap()); + unchanged(&session, &before); + session.projection_attempt_counter = u64::MAX; + let exhausted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| { + panic!("counter callback") + }) + .err() + .unwrap(); + assert!(matches!( + exhausted.error, + ProjectionStepError::AttemptExhausted + )); + assert!(exhausted.attempt.is_none()); + unchanged(&session, &before); + let (mut quota, mut qworkspace) = selection_owner(fallback, cap, 1); + quota + .step_with_native_projection(inputs(), &mut qworkspace, None, |_| false) + .unwrap(); + let old = state("a); + let failure = quota + .step_with_native_projection(inputs(), &mut qworkspace, None, |_| { + panic!("quota callback") + }) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::StepLimit) + )); + validate("a, &failure.attempt.unwrap()); + unchanged("a, &old); + quota.stop(); + let failure = quota + .step_with_native_projection(inputs(), &mut qworkspace, None, |_| { + panic!("stop callback") + }) + .err() + .unwrap(); + assert!(matches!( + failure.error, + ProjectionStepError::Session(SessionError::Stopped) + )); + validate("a, &failure.attempt.unwrap()); + unchanged("a, &old); + } + } +} +#[test] +fn c1b3_versioned_receipts_bind_producer_failure_method_cap_and_selected_role() { + for fallback in PressureImplementation::ALL { + let (mut session, mut workspace) = selection_owner(fallback, 1, 3); + let accepted = session + .step_with_native_projection(inputs(), &mut workspace, None, |_| false) + .unwrap(); + let original = &accepted.attempt; + validate(&session, original); + for case in 0..11 { + let mut a = (**original).clone(); + match case { + 0 => a.version = 1, + 1 => a.intent = ProjectionIntent::BuiltinNativeV1, + 2 => a.producer_failure.as_mut().unwrap().implementation = fallback, + 3 => { + a.producer_failure.as_mut().unwrap().failure = + ProjectionProducerFailure::IterationLimit { + iterations: 2, + residual_max: 0.0, + } + } + 4 => { + a.producer_failure.as_mut().unwrap().failure = + ProjectionProducerFailure::IterationLimit { + iterations: 1, + residual_max: f64::NAN, + } + } + 5 => a.producer_failure.as_mut().unwrap().residual_l2_limit = -1.0, + 6 => a.producer_failure = None, + 7 => { + a.qualification.as_mut().unwrap().selection = + ProjectionSelection::NativeFallback + } + 8 => a.selected_native.as_mut().unwrap().implementation = other_method(fallback), + 9 => { + a.qualification.as_mut().unwrap().rejection = Some( + ProjectionRejectionFacts::Field(ProjectionFieldRejection::NonFiniteInput), + ) + } + 10 => { + a.producer = Some(NativeProjectionProducerFacts { + implementation: other_method(fallback), + pressure: a.selected_native.as_ref().unwrap().pressure, + residual_l2_limit: a.producer_failure.as_ref().unwrap().residual_l2_limit, + elapsed: std::time::Duration::ZERO, + }) + } + _ => unreachable!(), + } + assert!( + a.validate( + session.snapshot().configuration(), + session.snapshot().grid() + ) + .is_err(), + "case {case}" + ); + } + let (mut selected, mut sw) = selection_owner(fallback, 2000, 2); + let good = selected + .step_with_native_projection(inputs(), &mut sw, None, |_| false) + .unwrap(); + let mut wrong = (*good.attempt).clone(); + wrong.selected_native.as_mut().unwrap().implementation = fallback; + assert!( + wrong + .validate( + selected.snapshot().configuration(), + selected.snapshot().grid() + ) + .is_err() + ); + let mut wrong = (*good.attempt).clone(); + wrong.producer.as_mut().unwrap().pressure.iterations = 2001; + assert!( + wrong + .validate( + selected.snapshot().configuration(), + selected.snapshot().grid() + ) + .is_err() + ); + let (mut legacy, mut legacy_workspace) = owner(fallback, 1); + let old = legacy + .step_with_native_projection(inputs(), &mut legacy_workspace, None, |_| false) + .unwrap(); + assert_eq!(old.attempt.version, 1); + assert!(old.attempt.producer_failure.is_none()); + validate(&legacy, &old.attempt); + let mut forged = (*old.attempt).clone(); + forged.producer_failure = original.producer_failure.clone(); + assert!( + forged + .validate(legacy.snapshot().configuration(), legacy.snapshot().grid()) + .is_err() + ); + } +} diff --git a/src/simulation.rs b/src/simulation.rs index b9062237..628ad077 100644 --- a/src/simulation.rs +++ b/src/simulation.rs @@ -77,6 +77,10 @@ pub enum SimulationError { DivergenceLimit { actual: f64, limit: f64 }, CourantLimit { actual: f64, limit: f64 }, ArithmeticFailure, + Projection(crate::solver_provider::composition::projection::ProjectionError), + ProjectionReceiptAliased, + ProjectionReceiptInvalid(&'static str), + ProjectionMixedQualificationFallback, } impl fmt::Display for SimulationError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -141,6 +145,7 @@ struct BoundaryStepInput<'a> { boundary: crate::BoxFluxStepBoundary, } struct StepDomains<'a, 'p> { + workflow: Option<&'a crate::workflow::Capture>, fields: Option<&'a crate::ForceSnapshot>, emitter: Option, barrier: Option<&'a crate::TriangleSurface>, @@ -148,6 +153,7 @@ struct StepDomains<'a, 'p> { surface: Option>, viscosity: Option<(&'a mut crate::ViscosityWorkspace, f64)>, provider: Option>, + projection: Option>, } pub(crate) struct StepOutcome { pub(crate) legacy: crate::BarrierStepReport, @@ -455,6 +461,7 @@ impl Simulation { source, &[], StepDomains { + workflow: None, fields: (!fields.scene().objects.is_empty()).then_some(fields), emitter, barrier: None, @@ -462,6 +469,7 @@ impl Simulation { surface: None, viscosity: None, provider: None, + projection: None, }, cancel, )?; @@ -495,6 +503,7 @@ impl Simulation { None, &[], StepDomains { + workflow: None, fields: None, emitter: Some(emitter), barrier: None, @@ -502,6 +511,7 @@ impl Simulation { surface: None, viscosity: None, provider: None, + projection: None, }, cancel, )?; @@ -577,12 +587,14 @@ impl Simulation { source, forces, StepDomains { + workflow: None, fields: None, emitter: None, barrier: None, boundary: None, surface: None, viscosity: None, + projection: None, provider: Some(crate::provider_step::ProviderStepInput { workspace, preferred, @@ -614,6 +626,7 @@ impl Simulation { source, forces, StepDomains { + workflow: None, fields: None, emitter: None, barrier, @@ -621,6 +634,7 @@ impl Simulation { surface: None, viscosity: None, provider: None, + projection: None, }, cancel, )?; @@ -637,6 +651,8 @@ impl Simulation { surface: Option>, viscosity: Option<(&mut crate::ViscosityWorkspace, f64)>, provider: Option>, + workflow: Option<&crate::workflow::Capture>, + projection: Option>, cancel: impl FnMut(StepStage) -> bool, ) -> Result { self.prepare_impl( @@ -644,12 +660,14 @@ impl Simulation { source, forces, StepDomains { + workflow, fields: None, emitter: None, barrier: None, surface, viscosity, provider, + projection, boundary: boundary.map(|(workspace, boundary)| BoundaryStepInput { workspace, boundary, @@ -658,12 +676,37 @@ impl Simulation { cancel, ) } + pub(crate) fn workflow_descriptor( + &self, + viscosity: Option, + ) -> crate::workflow::WorkflowDescriptor { + crate::workflow::WorkflowDescriptor { + version: crate::workflow::DESCRIPTOR_VERSION, + grid: self.grid.clone(), + density: self.config.density, + viscosity, + implementation: self.implementation, + pressure: self.config.pressure, + actual_divergence_limit: self.config.actual_divergence_limit, + max_courant: self.config.max_courant, + } + } pub(crate) fn density(&self) -> f64 { self.config.density } pub(crate) fn candidate_velocity(&self) -> [&[f32]; 3] { self.candidate.velocity() } + pub(crate) fn candidate_state(&self, step: StepReport) -> StateView<'_> { + StateView { + x: &self.candidate.x, + y: &self.candidate.y, + z: &self.candidate.z, + tracer: &self.candidate.tracer, + time: step.time, + generation: step.generation, + } + } pub(crate) fn candidate_pressure(&self) -> &[f64] { self.workspace.pressure() } @@ -764,6 +807,7 @@ impl Simulation { self.inspection_pressure = None; self.inspection_force_pressure = None; let StepDomains { + workflow, fields, emitter, barrier, @@ -771,8 +815,15 @@ impl Simulation { surface, viscosity, mut provider, + mut projection, } = domains; - if provider.is_some() && (boundary.is_some() || surface.is_some()) { + if (provider.is_some() || projection.is_some()) && (boundary.is_some() || surface.is_some()) + || projection.is_some() + && (provider.is_some() + || viscosity.is_some() + || emitter.is_some() + || barrier.is_some()) + { return Err(SimulationError::UnsupportedProviderDomain); } if provider.as_ref().is_some_and(|p| { @@ -781,6 +832,12 @@ impl Simulation { }) { return Err(SimulationError::ProviderWorkspaceMismatch); } + if projection.as_ref().is_some_and(|p| { + !p.workspace + .matches(&self.grid, self.config.density, self.implementation) + }) { + return Err(SimulationError::ProviderWorkspaceMismatch); + } if self.paused { return Err(SimulationError::Paused); } @@ -905,6 +962,14 @@ impl Simulation { if dt <= 0.0 || !next_time.is_finite() || next_time <= self.time { return Err(SimulationError::TimeResolution); } + if let Some(trace) = workflow { + trace.borrow_mut().actual_dt = Some(dt); + } + crate::workflow::complete( + workflow, + crate::workflow::NodeKind::Interval, + crate::workflow::NodeStatus::Completed, + ); checkpoint(&mut cancel, StepStage::BeforeAdvection)?; advect_velocity( &self.grid, @@ -913,6 +978,11 @@ impl Simulation { self.candidate.velocity_mut(), || cancel(StepStage::VelocitySlice), )?; + crate::workflow::complete( + workflow, + crate::workflow::NodeKind::Advection, + crate::workflow::NodeStatus::Completed, + ); if let Some(surface) = surface { match surface { crate::column_surface::PressureSurface::Slab(s) => { @@ -990,6 +1060,11 @@ impl Simulation { )? }) }; + crate::workflow::complete( + workflow, + crate::workflow::NodeKind::Forces, + crate::workflow::NodeStatus::Completed, + ); let viscosity = if let Some((workspace, mu)) = viscosity { let report = workspace .prepare( @@ -1001,13 +1076,49 @@ impl Simulation { ) .map_err(SimulationError::Viscosity)?; workspace.publish(self.candidate.velocity_mut()); + crate::workflow::complete( + workflow, + crate::workflow::NodeKind::Viscosity, + crate::workflow::NodeStatus::Completed, + ); Some(report) } else { None }; checkpoint(&mut cancel, StepStage::BeforePressure)?; let mut provider_report = None; - let (pressure, actual_divergence_max, projection) = if let Some(input) = &mut boundary { + let (pressure, actual_divergence_max, projection) = if let Some(input) = &mut projection { + let report = input.workspace.project( + self.config, + input.source, + self.generation, + self.time, + dt, + self.candidate.velocity(), + input.capture, + |stage| input.control.poll(stage), + )?; + for (output, qualified) in self + .candidate + .velocity_mut() + .into_iter() + .zip(input.workspace.velocity()) + { + output.copy_from_slice(qualified); + } + input.capture.stage = crate::projection_step::ProjectionAttemptStage::CarrierTransport; + checkpoint(&mut cancel, StepStage::BeforeProjectionAcceptance)?; + let divergence = input + .capture + .attempt + .qualification + .as_ref() + .expect("qualified projection facts") + .actual_divergence_max; + let pressure = report.accepted; + provider_report = Some(report); + (pressure, divergence, None) + } else if let Some(input) = &mut boundary { for (scratch, velocity) in input .workspace .provisional @@ -1057,8 +1168,10 @@ impl Simulation { dt, self.config.pressure, input.preferred.take(), + workflow, || cancel(StepStage::PressureIteration), )?; + crate::workflow::pressure_completed(workflow, &report); let pressure = report.accepted; operator.correct_candidate_in_place( input.workspace.pressure(), @@ -1093,6 +1206,14 @@ impl Simulation { limit: self.config.actual_divergence_limit, }); } + if let Some(trace) = workflow { + trace.borrow_mut().actual_divergence_max = Some(actual_divergence_max); + } + crate::workflow::complete( + workflow, + crate::workflow::NodeKind::Projection, + crate::workflow::NodeStatus::Completed, + ); (pressure, actual_divergence_max, None) }; if let (Some(work), Some(report)) = (&mut boundary_work, projection) { @@ -1205,6 +1326,11 @@ impl Simulation { if !tracer_integral.is_finite() || !kinetic_energy.is_finite() { return Err(SimulationError::ArithmeticFailure); } + crate::workflow::complete( + workflow, + crate::workflow::NodeKind::TracerTransport, + crate::workflow::NodeStatus::Completed, + ); checkpoint(&mut cancel, StepStage::BeforeCommit)?; let legacy = crate::BarrierStepReport { step: ForcedStepReport { diff --git a/src/solver_provider.rs b/src/solver_provider.rs index d53e6c49..8c437957 100644 --- a/src/solver_provider.rs +++ b/src/solver_provider.rs @@ -6,6 +6,7 @@ use crate::{ PressureReport, PressureSettings, PressureWorkspace, }; use std::time::{Duration, Instant}; +pub mod composition; pub mod configured; pub mod context; mod modal; @@ -148,11 +149,21 @@ impl ProviderWorkspace { self.reference.allocated_bytes() + (self.pressure.capacity() + self.product.capacity()) * 8 } pub fn solve( + &mut self, + request: PressureRequest<'_>, + settings: PressureSettings, + preferred: Option<&mut dyn PressureProvider>, + cancelled: impl FnMut() -> bool, + ) -> Result { + self.solve_observed(request, settings, preferred, cancelled, None) + } + pub(crate) fn solve_observed( &mut self, request: PressureRequest<'_>, settings: PressureSettings, preferred: Option<&mut dyn PressureProvider>, mut cancelled: impl FnMut() -> bool, + workflow: Option<&crate::workflow::Capture>, ) -> Result { let start = Instant::now(); if request.grid != &self.grid { @@ -181,6 +192,11 @@ impl ProviderWorkspace { if !sum.is_finite() || !sum_abs.is_finite() || !norm.is_finite() || !threshold.is_finite() { return Err(PressureError::Breakdown { iteration: 0 }); } + if let Some(trace) = workflow + && let Some(p) = trace.borrow_mut().pressure.as_mut() + { + p.residual_l2_limit = Some(threshold); + } let rounding_budget = 64.0 * f64::EPSILON * sum_abs; if sum.abs() > rounding_budget { return Err(PressureError::IncompatibleRhs { @@ -253,6 +269,21 @@ impl ProviderWorkspace { Ok(candidate) }); report.qualification = begin.elapsed(); + if let Some(trace) = workflow { + if let Some(p) = trace.borrow_mut().pressure.as_mut() { + p.candidate = report.candidate; + p.rejection = qualified.as_ref().err().map(|r| format!("{r:?}")); + } + crate::workflow::complete( + Some(trace), + crate::workflow::NodeKind::PressureQualification, + if qualified.is_ok() { + crate::workflow::NodeStatus::Accepted + } else { + crate::workflow::NodeStatus::Rejected + }, + ); + } if cancelled() { return Err(PressureError::Cancelled { iterations: 0 }); } @@ -266,6 +297,16 @@ impl ProviderWorkspace { Err(reason) => report.rejection = Some(reason), } } + if let Some(trace) = workflow { + if let Some(p) = trace.borrow_mut().pressure.as_mut() { + p.selected = self.fallback.id().into(); + } + crate::workflow::complete( + Some(trace), + crate::workflow::NodeKind::NativeFallback, + crate::workflow::NodeStatus::Started, + ); + } let begin = Instant::now(); report.accepted = self.reference.solve_rhs( &operator, @@ -275,6 +316,11 @@ impl ProviderWorkspace { &mut cancelled, )?; self.pressure.copy_from_slice(self.reference.pressure()); + crate::workflow::complete( + workflow, + crate::workflow::NodeKind::NativeFallback, + crate::workflow::NodeStatus::Selected, + ); report.fallback = begin.elapsed(); report.total = start.elapsed(); Ok(report) diff --git a/src/solver_provider/composition.rs b/src/solver_provider/composition.rs new file mode 100644 index 00000000..81d7d725 --- /dev/null +++ b/src/solver_provider/composition.rs @@ -0,0 +1,101 @@ +//! Closed replacement selection over the existing pressure-v1 dispatcher. +//! +//! Pressure v1 remains the only callable replacement stage. The projection +//! submodule qualifies supplied arrays without provider execution or Session +//! adoption; integrated subgraph/whole-family replacement remains unavailable. +pub mod projection; +use super::{PressureProvider, PressureRequest, ProviderReport, ProviderWorkspace}; +use crate::{PressureError, PressureSettings}; +use std::fmt; + +/// Finite replacement scopes. Naming a scope does not make it available. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ReplacementContract { + PressureV1, + SealedMacProjectionV1, + WholeSealedMacV1, + WholeParticlePreviewV1, +} + +/// The selected scope has no callable replacement contract in C1-A. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ReplacementUnavailable { + pub requested: ReplacementContract, +} +impl fmt::Display for ReplacementUnavailable { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "replacement unavailable: {:?}", self.requested) + } +} +impl std::error::Error for ReplacementUnavailable {} + +/// Borrowed entry point to the existing sealed-MAC pressure-v1 dispatcher. +/// Selection and construction do not run a provider or modify its workspace. +pub struct PressureStageV1<'workspace> { + workspace: &'workspace mut ProviderWorkspace, +} +impl<'workspace> PressureStageV1<'workspace> { + pub fn select( + contract: ReplacementContract, + workspace: &'workspace mut ProviderWorkspace, + ) -> Result { + match contract { + ReplacementContract::PressureV1 => Ok(Self { workspace }), + requested => Err(ReplacementUnavailable { requested }), + } + } + + /// Preserve the original dispatcher's input, cancellation, provider and + /// fallback semantics. Metadata remains descriptive under pressure v1. + pub fn solve( + &mut self, + request: PressureRequest<'_>, + settings: PressureSettings, + preferred: Option<&mut dyn PressureProvider>, + cancelled: impl FnMut() -> bool, + ) -> Result, PressureError> { + let report = self + .workspace + .solve(request, settings, preferred, cancelled)?; + Ok(QualifiedPressureV1 { + pressure: self.workspace.pressure(), + report, + }) + } +} + +/// Host-qualified pressure with its original report. This is not a corrected +/// velocity or accepted Session state. The borrow prevents overwriting pressure +/// while the qualified view is used. Failed calls return no qualified view; +/// the original workspace's failure semantics still apply. +/// +/// ```compile_fail,E0499 +/// use rheon::solver_provider::{PressureRequest, composition::PressureStageV1}; +/// use rheon::PressureSettings; +/// fn cannot_overwrite(stage: &mut PressureStageV1<'_>, request: PressureRequest<'_>, +/// settings: PressureSettings) { +/// let accepted = stage.solve(request, settings, None, || false).unwrap(); +/// let _next = stage.solve(request, settings, None, || false); +/// println!("{:?}", accepted.pressure()); +/// } +/// ``` +pub struct QualifiedPressureV1<'workspace> { + pressure: &'workspace [f64], + report: ProviderReport, +} +impl QualifiedPressureV1<'_> { + pub fn pressure(&self) -> &[f64] { + self.pressure + } + pub fn report(&self) -> &ProviderReport { + &self.report + } + /// Release the pressure borrow and retain the dispatcher report. + pub fn into_report(self) -> ProviderReport { + self.report + } +} + +#[cfg(test)] +#[path = "composition_tests.rs"] +mod tests; diff --git a/src/solver_provider/composition/projection.rs b/src/solver_provider/composition/projection.rs new file mode 100644 index 00000000..b072442f --- /dev/null +++ b/src/solver_provider/composition/projection.rs @@ -0,0 +1,619 @@ +//! Stateless qualification of supplied sealed-MAC projection arrays. +//! +//! This is not a Session replacement or provider invocation API. Inputs and +//! candidate arrays are immutable caller data; returned arrays are disposable +//! scratch. Source tags are declared consistency facts, not authentication of +//! an accepted Session. Stateful candidates and external runtimes are absent. +use crate::solver_provider::{ + PressureProvider, PressureRequest, ProviderRejection, ProviderReport, ProviderWorkspace, + SolverMetadata, TensorMetadata, +}; +use crate::{ + Axis, GridGeometry, OperatorError, PressureError, PressureImplementation, PressureOperator, + PressureSettings, SessionIdentity, +}; +use sha2::{Digest, Sha256}; +use std::fmt; + +const CONTRACT: &str = "sealed-mac-projection-si-f32-faces-f64-cell-zero-gauge-v1"; +const OPERATOR: &str = "sealed-constant-density-mac-cell-zero-gauge-v1"; +const SUPPLIED_PRESSURE: &str = "supplied-projection-pressure-witness-v1"; + +/// Unsupported labels are explicit refusals, not additional geometry support. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionDomain { + SealedStationaryBox, + FreeSurface, + EmbeddedObstacle, + MovingWall, +} + +pub struct ProjectionInput<'a> { + pub grid: &'a GridGeometry, + pub density: f64, + pub interval_start: f64, + pub dt: f64, + pub source: &'a SessionIdentity, + pub generation: u64, + pub velocity: [&'a [f32]; 3], + pub settings: PressureSettings, + pub actual_divergence_limit: f64, + pub domain: ProjectionDomain, +} + +/// Digest of actual immutable inputs and the exact qualification contract. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ProjectionInputId([u8; 32]); +impl ProjectionInputId { + pub fn as_bytes(&self) -> &[u8; 32] { + &self.0 + } +} + +pub struct ProjectionRequest<'a> { + input: ProjectionInput<'a>, + input_id: ProjectionInputId, +} +impl<'a> ProjectionRequest<'a> { + pub fn new(input: ProjectionInput<'a>) -> Result { + if input.domain != ProjectionDomain::SealedStationaryBox { + return Err(ProjectionError::Refused( + ProjectionRefusal::UnsupportedDomain(input.domain), + )); + } + if !valid_text(&input.source.source_revision, 4096) { + return Err(ProjectionError::Refused(ProjectionRefusal::InvalidIdentity)); + } + let end = input.interval_start + input.dt; + if !input.interval_start.is_finite() + || input.interval_start < 0.0 + || !input.dt.is_finite() + || input.dt <= 0.0 + || !end.is_finite() + || end <= input.interval_start + || input.settings.max_iterations == 0 + || [ + input.settings.relative_residual, + input.settings.absolute_residual, + input.settings.divergence_limit, + input.actual_divergence_limit, + ] + .iter() + .any(|v| !v.is_finite() || *v < 0.0) + { + return Err(ProjectionError::InvalidInput); + } + PressureOperator::new(input.grid, input.density)?.validate_velocity(input.velocity)?; + let mut hash = Sha256::new(); + hash_text(&mut hash, CONTRACT); + let representation = ProjectionRepresentation::sealed_v1(input.grid); + hash.update(representation.version.to_le_bytes()); + hash_text(&mut hash, representation.operator); + for metadata in std::iter::once(&representation.pressure).chain(&representation.velocity) { + for count in metadata.shape_xyz { + hash.update((count as u64).to_le_bytes()); + } + hash_text(&mut hash, metadata.layout); + hash_text(&mut hash, metadata.scalar); + hash_text(&mut hash, metadata.units); + } + for n in input.grid.counts() { + hash.update((n as u64).to_le_bytes()); + } + for value in input.grid.spacing().into_iter().chain(input.grid.origin()) { + hash.update(value.to_bits().to_le_bytes()); + } + hash.update(input.source.run_id.to_le_bytes()); + hash_text(&mut hash, &input.source.source_revision); + hash.update(input.generation.to_le_bytes()); + for value in [ + input.density, + input.interval_start, + input.dt, + input.settings.relative_residual, + input.settings.absolute_residual, + input.settings.divergence_limit, + input.actual_divergence_limit, + ] { + hash.update(value.to_bits().to_le_bytes()); + } + hash.update((input.settings.max_iterations as u64).to_le_bytes()); + for values in input.velocity { + hash.update((values.len() as u64).to_le_bytes()); + for value in values { + hash.update(value.to_bits().to_le_bytes()); + } + } + Ok(Self { + input, + input_id: ProjectionInputId(hash.finalize().into()), + }) + } + pub fn input_id(&self) -> ProjectionInputId { + self.input_id + } + pub fn representation(&self) -> ProjectionRepresentation { + ProjectionRepresentation::sealed_v1(self.input.grid) + } +} + +fn valid_text(value: &str, limit: usize) -> bool { + !value.is_empty() && value.len() <= limit && !value.chars().any(char::is_control) +} +fn hash_text(hash: &mut Sha256, value: &str) { + hash.update((value.len() as u64).to_le_bytes()); + hash.update(value.as_bytes()); +} + +/// Strict new supplied-array representation; pressure-v1 metadata stays +/// descriptive under its original API and is not silently strengthened. +#[derive(Debug, Clone, PartialEq)] +pub struct ProjectionRepresentation { + pub version: u32, + pub operator: &'static str, + pub pressure: TensorMetadata, + pub velocity: [TensorMetadata; 3], +} +impl ProjectionRepresentation { + pub fn sealed_v1(grid: &GridGeometry) -> Self { + Self { + version: 1, + operator: OPERATOR, + pressure: pressure_metadata(grid.counts()), + velocity: std::array::from_fn(|d| TensorMetadata { + shape_xyz: grid.face_counts([Axis::X, Axis::Y, Axis::Z][d]), + layout: ["x-fastest-x-face", "x-fastest-y-face", "x-fastest-z-face"][d], + scalar: "f32", + units: "m/s", + }), + } + } +} +fn pressure_metadata(shape_xyz: [usize; 3]) -> TensorMetadata { + TensorMetadata { + shape_xyz, + layout: "x-fastest-cell-centered", + scalar: "f64", + units: "Pa", + } +} + +/// Caller-declared provenance of supplied data, not observed runtime execution. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ProjectionCandidateIdentity { + pub algorithm: &'static str, + pub version: &'static str, + pub source_revision: &'static str, +} +pub struct SuppliedProjection<'a> { + pub input_id: ProjectionInputId, + pub representation: ProjectionRepresentation, + pub identity: ProjectionCandidateIdentity, + pub pressure: &'a [f64], + pub velocity: [&'a [f32]; 3], +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionSelection { + SuppliedCandidate, + NativeBaseline, + NativeFallback, +} +#[derive(Debug, Clone, PartialEq)] +pub enum ProjectionRejection { + Field(OperatorError), + MomentumWitness { axis: Axis, index: usize }, + Pressure(ProviderRejection), + ActualDivergence { maximum: f64, limit: f64 }, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionRefusal { + UnsupportedDomain(ProjectionDomain), + WorkspaceGrid, + InputBinding, + Representation, + InvalidIdentity, +} +#[derive(Debug, Clone, PartialEq)] +pub enum ProjectionError { + Refused(ProjectionRefusal), + Operator(OperatorError), + Pressure(PressureError), + InvalidInput, + Cancelled, + BufferLimit { required: usize, limit: usize }, + AllocationFailed, + DivergenceExceeded { maximum: f64, limit: f64 }, +} +impl fmt::Display for ProjectionError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "supplied projection qualification: {self:?}") + } +} +impl std::error::Error for ProjectionError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Self::Operator(error) => Some(error), + Self::Pressure(error) => Some(error), + _ => None, + } + } +} +impl From for ProjectionError { + fn from(error: OperatorError) -> Self { + Self::Operator(error) + } +} +impl From for ProjectionError { + fn from(error: PressureError) -> Self { + Self::Pressure(error) + } +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProjectionCheckpoint { + BeforeQualification, + BeforePressure, + PressurePoll, + AfterPressure, + BeforeReturn, +} +#[derive(Debug, Clone)] +pub struct ProjectionReport { + pub input_id: ProjectionInputId, + pub selection: ProjectionSelection, + pub supplied_identity: Option, + pub rejection: Option, + /// Final selected pressure dispatch facts. The private supplied-array bridge is + /// a pressure witness, not observed candidate-provider execution. + pub pressure: ProviderReport, + /// Earlier accepted supplied pressure discarded by the subsequent actual + /// f32 divergence gate, before a separate native fallback dispatch. + pub discarded_candidate_pressure: Option, + pub actual_divergence_max: f64, +} + +/// Reusable disposable scratch. Managed array capacities include the original +/// pressure workspace, RHS/divergence and three f32 face arrays. Caller data, +/// allocator overhead, stack and metadata are excluded. No Session state lives +/// here and a failed call leaves no qualified result. +pub struct ProjectionWorkspace { + grid: GridGeometry, + pressure: ProviderWorkspace, + rhs: Vec, + divergence: Vec, + velocity: [Vec; 3], + allocated: usize, +} +impl ProjectionWorkspace { + pub fn new( + grid: &GridGeometry, + limit: usize, + fallback: PressureImplementation, + ) -> Result { + let faces = [Axis::X, Axis::Y, Axis::Z] + .into_iter() + .try_fold(0usize, |n, axis| { + n.checked_add(grid.face_len(axis)) + .ok_or(ProjectionError::AllocationFailed) + })?; + let required = grid + .cell_len() + .checked_mul(16) + .and_then(|n| faces.checked_mul(4).and_then(|m| n.checked_add(m))) + .ok_or(ProjectionError::AllocationFailed)?; + if required > limit { + return Err(ProjectionError::BufferLimit { required, limit }); + } + let rhs = allocate(grid.cell_len(), 0.0f64)?; + let divergence = allocate(grid.cell_len(), 0.0f64)?; + let velocity = [ + allocate(grid.face_len(Axis::X), 0.0f32)?, + allocate(grid.face_len(Axis::Y), 0.0f32)?, + allocate(grid.face_len(Axis::Z), 0.0f32)?, + ]; + let extra = rhs + .capacity() + .checked_add(divergence.capacity()) + .and_then(|n| n.checked_mul(8)) + .and_then(|n| { + velocity.iter().try_fold(n, |n, v| { + v.capacity().checked_mul(4).and_then(|m| n.checked_add(m)) + }) + }) + .ok_or(ProjectionError::AllocationFailed)?; + let remaining = limit + .checked_sub(extra) + .ok_or(ProjectionError::BufferLimit { + required: extra, + limit, + })?; + let pressure = ProviderWorkspace::new(grid, remaining, fallback)?; + let allocated = extra + .checked_add(pressure.allocated_bytes()) + .ok_or(ProjectionError::AllocationFailed)?; + if allocated > limit { + return Err(ProjectionError::BufferLimit { + required: allocated, + limit, + }); + } + Ok(Self { + grid: grid.clone(), + pressure, + rhs, + divergence, + velocity, + allocated, + }) + } + pub fn allocated_bytes(&self) -> usize { + self.allocated + } + + /// Integrated owner reads only after successful qualification and before + /// the next call. This scratch is never an accepted-state authority. + pub(crate) fn pressure_for_integrated_step(&self) -> &[f64] { + self.pressure.pressure() + } + + /// Shares the same successful-call lifetime as the selected pressure. + pub(crate) fn velocity_for_integrated_step(&self) -> [&[f32]; 3] { + [&self.velocity[0], &self.velocity[1], &self.velocity[2]] + } + + /// Qualify immutable supplied arrays or run the declared compatible native + /// baseline. Header/binding refusals never become fallback acceptance. + pub fn qualify( + &mut self, + request: &ProjectionRequest<'_>, + candidate: Option<&SuppliedProjection<'_>>, + mut cancelled: impl FnMut(ProjectionCheckpoint) -> bool, + ) -> Result, ProjectionError> { + let input = &request.input; + if input.grid != &self.grid { + return Err(ProjectionError::Refused(ProjectionRefusal::WorkspaceGrid)); + } + if let Some(candidate) = candidate { + if candidate.input_id != request.input_id { + return Err(ProjectionError::Refused(ProjectionRefusal::InputBinding)); + } + if candidate.representation != request.representation() { + return Err(ProjectionError::Refused(ProjectionRefusal::Representation)); + } + if !valid_text(candidate.identity.algorithm, 256) + || !valid_text(candidate.identity.version, 256) + || !valid_text(candidate.identity.source_revision, 4096) + { + return Err(ProjectionError::Refused(ProjectionRefusal::InvalidIdentity)); + } + } + checkpoint(&mut cancelled, ProjectionCheckpoint::BeforeQualification)?; + let operator = PressureOperator::new(input.grid, input.density)?; + operator.build_rhs(input.velocity, input.dt, &mut self.rhs)?; + let mut rejection = candidate.and_then(|candidate| { + check_candidate(&operator, input, candidate, &mut self.velocity).err() + }); + checkpoint(&mut cancelled, ProjectionCheckpoint::BeforePressure)?; + let pressure_request = PressureRequest { + grid: input.grid, + density: input.density, + dt: input.dt, + rhs: &self.rhs, + }; + let mut supplied = + candidate + .filter(|_| rejection.is_none()) + .map(|candidate| SuppliedPressure { + values: candidate.pressure, + shape: input.grid.counts(), + }); + let preferred = supplied + .as_mut() + .map(|value| value as &mut dyn PressureProvider); + let mut pressure_report = + self.pressure + .solve(pressure_request, input.settings, preferred, || { + cancelled(ProjectionCheckpoint::PressurePoll) + })?; + checkpoint(&mut cancelled, ProjectionCheckpoint::AfterPressure)?; + let mut supplied_accepted = pressure_report.selected == SUPPLIED_PRESSURE; + let mut discarded_candidate_pressure = None; + if let Some(reason) = &pressure_report.rejection { + rejection = Some(ProjectionRejection::Pressure(reason.clone())); + } + rebuild_velocity( + &operator, + input, + self.pressure.pressure(), + &mut self.velocity, + )?; + let mut divergence = actual_divergence(&operator, &self.velocity, &mut self.divergence)?; + if supplied_accepted && divergence > input.actual_divergence_limit { + rejection = Some(ProjectionRejection::ActualDivergence { + maximum: divergence, + limit: input.actual_divergence_limit, + }); + // All candidate output is disposable. Resolve and correct from the + // same immutable original input, never partially corrected scratch. + let native_report = + self.pressure + .solve(pressure_request, input.settings, None, || { + cancelled(ProjectionCheckpoint::PressurePoll) + })?; + discarded_candidate_pressure = + Some(std::mem::replace(&mut pressure_report, native_report)); + checkpoint(&mut cancelled, ProjectionCheckpoint::AfterPressure)?; + supplied_accepted = false; + rebuild_velocity( + &operator, + input, + self.pressure.pressure(), + &mut self.velocity, + )?; + divergence = actual_divergence(&operator, &self.velocity, &mut self.divergence)?; + } + if divergence > input.actual_divergence_limit { + return Err(ProjectionError::DivergenceExceeded { + maximum: divergence, + limit: input.actual_divergence_limit, + }); + } + checkpoint(&mut cancelled, ProjectionCheckpoint::BeforeReturn)?; + let selection = if supplied_accepted { + ProjectionSelection::SuppliedCandidate + } else if candidate.is_some() { + ProjectionSelection::NativeFallback + } else { + ProjectionSelection::NativeBaseline + }; + Ok(QualifiedProjection { + pressure: self.pressure.pressure(), + velocity: [&self.velocity[0], &self.velocity[1], &self.velocity[2]], + report: ProjectionReport { + input_id: request.input_id, + selection, + supplied_identity: candidate.map(|candidate| candidate.identity), + rejection, + pressure: pressure_report, + discarded_candidate_pressure, + actual_divergence_max: divergence, + }, + }) + } +} + +fn allocate(length: usize, value: T) -> Result, ProjectionError> { + let mut values = Vec::new(); + values + .try_reserve_exact(length) + .map_err(|_| ProjectionError::AllocationFailed)?; + values.resize(length, value); + Ok(values) +} +fn checkpoint( + cancel: &mut impl FnMut(ProjectionCheckpoint) -> bool, + point: ProjectionCheckpoint, +) -> Result<(), ProjectionError> { + if cancel(point) { + Err(ProjectionError::Cancelled) + } else { + Ok(()) + } +} +fn rebuild_velocity( + operator: &PressureOperator<'_>, + input: &ProjectionInput<'_>, + pressure: &[f64], + velocity: &mut [Vec; 3], +) -> Result<(), OperatorError> { + for (output, source) in velocity.iter_mut().zip(input.velocity) { + output.copy_from_slice(source); + } + let [x, y, z] = velocity; + operator.correct_candidate_in_place(pressure, input.dt, [x, y, z]) +} +fn check_candidate( + operator: &PressureOperator<'_>, + input: &ProjectionInput<'_>, + candidate: &SuppliedProjection<'_>, + velocity: &mut [Vec; 3], +) -> Result<(), ProjectionRejection> { + operator + .validate_cells(candidate.pressure) + .map_err(ProjectionRejection::Field)?; + operator + .validate_velocity(candidate.velocity) + .map_err(ProjectionRejection::Field)?; + rebuild_velocity(operator, input, candidate.pressure, velocity) + .map_err(ProjectionRejection::Field)?; + for (d, expected) in velocity.iter().enumerate() { + if let Some(index) = expected + .iter() + .zip(candidate.velocity[d]) + .position(|(a, b)| a.to_bits() != b.to_bits()) + { + return Err(ProjectionRejection::MomentumWitness { + axis: [Axis::X, Axis::Y, Axis::Z][d], + index, + }); + } + } + Ok(()) +} +fn actual_divergence( + operator: &PressureOperator<'_>, + velocity: &[Vec; 3], + output: &mut [f64], +) -> Result { + operator.divergence([&velocity[0], &velocity[1], &velocity[2]], output)?; + Ok(output + .iter() + .fold(0.0f64, |maximum, value| maximum.max(value.abs()))) +} + +struct SuppliedPressure<'a> { + values: &'a [f64], + shape: [usize; 3], +} +impl PressureProvider for SuppliedPressure<'_> { + fn metadata(&self) -> SolverMetadata { + SolverMetadata { + id: SUPPLIED_PRESSURE, + version: "1", + stage: "pressure", + input: TensorMetadata { + shape_xyz: self.shape, + layout: "x-fastest-cell-centered", + scalar: "f64", + units: "m^3/s^2", + }, + output: pressure_metadata(self.shape), + domain: "sealed box supplied-array witness only", + provenance: None, + } + } + fn supports(&self, _: &PressureRequest<'_>) -> Result<(), ProviderRejection> { + Ok(()) + } + fn predict( + &mut self, + _: &PressureRequest<'_>, + output: &mut [f64], + _: &mut dyn FnMut() -> bool, + ) -> Result<(), ProviderRejection> { + output.copy_from_slice(self.values); + Ok(()) + } +} + +/// Qualified disposable arrays, not accepted Session state. The immutable borrow +/// prevents another qualification while this view remains in use. +/// +/// ```compile_fail,E0499 +/// use rheon::solver_provider::composition::projection::{ProjectionWorkspace, ProjectionRequest}; +/// fn no_overwrite(workspace: &mut ProjectionWorkspace, request: &ProjectionRequest<'_>) { +/// let qualified = workspace.qualify(request, None, |_| false).unwrap(); +/// let _next = workspace.qualify(request, None, |_| false); +/// println!("{:?}", qualified.velocity()); +/// } +/// ``` +pub struct QualifiedProjection<'a> { + pressure: &'a [f64], + velocity: [&'a [f32]; 3], + report: ProjectionReport, +} +impl QualifiedProjection<'_> { + pub fn pressure(&self) -> &[f64] { + self.pressure + } + pub fn velocity(&self) -> [&[f32]; 3] { + self.velocity + } + pub fn report(&self) -> &ProjectionReport { + &self.report + } +} + +#[cfg(test)] +#[path = "projection_tests.rs"] +mod tests; diff --git a/src/solver_provider/composition/projection_tests.rs b/src/solver_provider/composition/projection_tests.rs new file mode 100644 index 00000000..30ecb086 --- /dev/null +++ b/src/solver_provider/composition/projection_tests.rs @@ -0,0 +1,987 @@ +use super::*; +use crate::solver_provider::{PressureRequest, ProviderReport, ProviderWorkspace}; +use crate::{Axis, PressureReport}; +use std::mem::size_of; + +const CAP: usize = 1024 * 1024; +const CANDIDATE_ID: ProjectionCandidateIdentity = ProjectionCandidateIdentity { + algorithm: "classical-supplied-projection", + version: "1", + source_revision: "c1b1-direct-existing-dispatcher", +}; + +struct Fixture { + grid: GridGeometry, + source: SessionIdentity, + velocity: [Vec; 3], +} +impl Fixture { + fn nonzero() -> Self { + let grid = GridGeometry::new([4, 3, 2], [0.25, 0.3, 0.4], [0.0; 3]).unwrap(); + let mut velocity = std::array::from_fn(|d| vec![0.0; grid.face_len(Axis::ALL[d])]); + for axis in Axis::ALL { + let d = axis.index(); + let shape = grid.face_counts(axis); + for k in 0..shape[2] { + for j in 0..shape[1] { + for i in 0..shape[0] { + let coordinate = [i, j, k]; + if coordinate[d] != 0 && coordinate[d] != grid.counts()[d] { + let index = grid.face_index(axis, coordinate).unwrap(); + velocity[d][index] = (0.001 * (0.3 * index as f64).sin()) as f32; + } + } + } + } + } + Self::with_fields(grid, velocity) + } + fn zero(value: f32) -> Self { + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let velocity = std::array::from_fn(|d| vec![value; grid.face_len(Axis::ALL[d])]); + Self::with_fields(grid, velocity) + } + fn with_fields(grid: GridGeometry, velocity: [Vec; 3]) -> Self { + Self { + grid, + source: SessionIdentity { + run_id: 101, + source_revision: "c1b1-frozen-reference".into(), + }, + velocity, + } + } + fn input(&self) -> ProjectionInput<'_> { + ProjectionInput { + grid: &self.grid, + density: 1.25, + interval_start: 0.0, + dt: 0.01, + source: &self.source, + generation: 0, + velocity: slices(&self.velocity), + settings: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 1000, + }, + actual_divergence_limit: 1e-5, + domain: ProjectionDomain::SealedStationaryBox, + } + } +} + +fn slices(values: &[Vec; 3]) -> [&[f32]; 3] { + std::array::from_fn(|d| values[d].as_slice()) +} +fn bits(values: [&[f32]; 3]) -> [Vec; 3] { + std::array::from_fn(|d| values[d].iter().map(|v| v.to_bits()).collect()) +} +fn pressure_bits(values: &[f64]) -> Vec { + values.iter().map(|v| v.to_bits()).collect() +} +fn diagnostics(report: &PressureReport) -> [u64; 3] { + [ + report.true_residual_l2.to_bits(), + report.true_residual_max.to_bits(), + report.predicted_divergence_max.to_bits(), + ] +} + +struct DirectProjection { + pressure: Vec, + velocity: [Vec; 3], + report: ProviderReport, + actual_divergence_max: f64, +} +fn direct(input: &ProjectionInput<'_>, method: PressureImplementation) -> DirectProjection { + let operator = PressureOperator::new(input.grid, input.density).unwrap(); + let mut rhs = vec![0.0; input.grid.cell_len()]; + operator + .build_rhs(input.velocity, input.dt, &mut rhs) + .unwrap(); + let mut workspace = ProviderWorkspace::new(input.grid, CAP, method).unwrap(); + let report = workspace + .solve( + PressureRequest { + grid: input.grid, + density: input.density, + dt: input.dt, + rhs: &rhs, + }, + input.settings, + None, + || false, + ) + .unwrap(); + let pressure = workspace.pressure().to_vec(); + let mut velocity = input.velocity.map(<[f32]>::to_vec); + let [x, y, z] = &mut velocity; + operator + .correct_candidate_in_place(&pressure, input.dt, [x, y, z]) + .unwrap(); + operator.divergence(slices(&velocity), &mut rhs).unwrap(); + let actual_divergence_max = rhs.iter().fold(0.0_f64, |a, b| a.max(b.abs())); + DirectProjection { + pressure, + velocity, + report, + actual_divergence_max, + } +} +fn supplied<'a>( + request: &ProjectionRequest<'_>, + direct: &'a DirectProjection, +) -> SuppliedProjection<'a> { + SuppliedProjection { + input_id: request.input_id(), + representation: request.representation(), + identity: CANDIDATE_ID, + pressure: &direct.pressure, + velocity: slices(&direct.velocity), + } +} +fn assert_native(result: &QualifiedProjection<'_>, direct: &DirectProjection) { + assert_eq!( + pressure_bits(result.pressure()), + pressure_bits(&direct.pressure) + ); + assert_eq!(bits(result.velocity()), bits(slices(&direct.velocity))); + assert_eq!( + diagnostics(&result.report().pressure.accepted), + diagnostics(&direct.report.accepted) + ); + assert_eq!( + result.report().pressure.accepted.iterations, + direct.report.accepted.iterations + ); + assert_eq!( + result.report().actual_divergence_max.to_bits(), + direct.actual_divergence_max.to_bits() + ); +} + +#[test] +fn c1b1_native_and_supplied_match_existing_kernel_for_100_independent_requests() { + let fixture = Fixture::nonzero(); + let original = bits(slices(&fixture.velocity)); + let operator = PressureOperator::new(&fixture.grid, 1.25).unwrap(); + let mut rhs = vec![0.0; fixture.grid.cell_len()]; + operator + .build_rhs(slices(&fixture.velocity), 0.01, &mut rhs) + .unwrap(); + assert!(rhs.iter().any(|value| *value != 0.0)); + for method in PressureImplementation::ALL { + let oracle = direct(&fixture.input(), method); + assert!(oracle.report.accepted.iterations > 0); + let candidate_pressure = pressure_bits(&oracle.pressure); + let candidate_velocity = bits(slices(&oracle.velocity)); + let mut workspace = ProjectionWorkspace::new(&fixture.grid, CAP, method).unwrap(); + let allocated = workspace.allocated_bytes(); + for generation in 0..100 { + let mut input = fixture.input(); + input.generation = generation; + input.interval_start = generation as f64 * 0.01; + let request = ProjectionRequest::new(input).unwrap(); + { + let result = workspace.qualify(&request, None, |_| false).unwrap(); + assert_native(&result, &oracle); + assert_eq!(result.report().input_id, request.input_id()); + assert_eq!( + result.report().selection, + ProjectionSelection::NativeBaseline + ); + assert_eq!(result.report().supplied_identity, None); + assert_eq!(result.report().rejection, None); + assert!(result.report().discarded_candidate_pressure.is_none()); + assert_eq!(result.report().pressure.selected, method.id()); + assert!(result.report().pressure.attempted.is_none()); + } + let candidate = supplied(&request, &oracle); + let result = workspace + .qualify(&request, Some(&candidate), |_| false) + .unwrap(); + assert_eq!(pressure_bits(result.pressure()), candidate_pressure); + assert_eq!(bits(result.velocity()), candidate_velocity); + assert_eq!( + result.report().selection, + ProjectionSelection::SuppliedCandidate + ); + assert_eq!(result.report().input_id, request.input_id()); + assert_eq!(result.report().supplied_identity, Some(CANDIDATE_ID)); + assert_eq!(result.report().rejection, None); + assert!(result.report().discarded_candidate_pressure.is_none()); + assert_eq!(result.report().pressure.accepted.iterations, 0); + assert_eq!( + diagnostics(&result.report().pressure.accepted), + diagnostics(&oracle.report.accepted) + ); + assert_eq!( + result.report().actual_divergence_max.to_bits(), + oracle.actual_divergence_max.to_bits() + ); + let bridge = result.report().pressure.attempted.as_ref().unwrap(); + assert_eq!(result.report().pressure.selected, bridge.id); + assert_eq!(bridge.id, "supplied-projection-pressure-witness-v1"); + assert!(bridge.provenance.is_none()); + assert_eq!(workspace.allocated_bytes(), allocated); + } + assert_eq!(pressure_bits(&oracle.pressure), candidate_pressure); + assert_eq!(bits(slices(&oracle.velocity)), candidate_velocity); + } + assert_eq!(bits(slices(&fixture.velocity)), original); +} + +#[test] +fn c1b1_divergence_free_wrong_dynamics_fail_the_exact_momentum_witness() { + let fixture = Fixture::zero(0.0); + let request = ProjectionRequest::new(fixture.input()).unwrap(); + for method in PressureImplementation::ALL { + let oracle = direct(&fixture.input(), method); + let mut wrong = oracle.velocity.clone(); + for (axis, coordinate, value) in [ + (Axis::X, [2, 1, 1], 0.125), + (Axis::Y, [2, 2, 1], 0.125), + (Axis::X, [2, 2, 1], -0.125), + (Axis::Y, [1, 2, 1], -0.125), + ] { + wrong[axis.index()][fixture.grid.face_index(axis, coordinate).unwrap()] = value; + } + let mut divergence = vec![f64::NAN; fixture.grid.cell_len()]; + let operator = PressureOperator::new(&fixture.grid, 1.25).unwrap(); + operator + .divergence(slices(&wrong), &mut divergence) + .unwrap(); + assert!(divergence.iter().all(|value| *value == 0.0)); + assert_eq!(oracle.report.accepted.true_residual_l2, 0.0); + let mut candidate = supplied(&request, &oracle); + candidate.velocity = slices(&wrong); + let original = bits(candidate.velocity); + let mut workspace = ProjectionWorkspace::new(&fixture.grid, CAP, method).unwrap(); + let result = workspace + .qualify(&request, Some(&candidate), |_| false) + .unwrap(); + assert_native(&result, &oracle); + assert_eq!( + result.report().selection, + ProjectionSelection::NativeFallback + ); + assert_eq!( + result.report().rejection, + Some(ProjectionRejection::MomentumWitness { + axis: Axis::X, + index: fixture.grid.face_index(Axis::X, [2, 1, 1]).unwrap(), + }) + ); + assert!(result.report().pressure.attempted.is_none()); + assert_eq!(bits(candidate.velocity), original); + } +} + +#[test] +fn c1b1_signed_zero_uses_in_place_correction_and_preserves_wall_bits() { + let fixture = Fixture::zero(-0.0); + let input_bits = bits(slices(&fixture.velocity)); + let request = ProjectionRequest::new(fixture.input()).unwrap(); + for method in PressureImplementation::ALL { + let mut oracle = direct(&fixture.input(), method); + oracle.pressure[0] = -0.0; + oracle.velocity = corrected(&fixture.input(), &oracle.pressure); + assert_eq!(oracle.velocity[0][0].to_bits(), (-0.0_f32).to_bits()); + let mut workspace = ProjectionWorkspace::new(&fixture.grid, CAP, method).unwrap(); + let good = supplied(&request, &oracle); + { + let result = workspace.qualify(&request, Some(&good), |_| false).unwrap(); + assert_eq!( + result.report().selection, + ProjectionSelection::SuppliedCandidate + ); + assert_eq!( + pressure_bits(result.pressure()), + pressure_bits(&oracle.pressure) + ); + assert_eq!(bits(result.velocity()), bits(slices(&oracle.velocity))); + } + let mut wrong = oracle.velocity.clone(); + wrong[0][0] = 0.0; + let mut bad = supplied(&request, &oracle); + bad.velocity = slices(&wrong); + let result = workspace.qualify(&request, Some(&bad), |_| false).unwrap(); + assert_eq!( + result.report().selection, + ProjectionSelection::NativeFallback + ); + assert_eq!( + result.report().rejection, + Some(ProjectionRejection::MomentumWitness { + axis: Axis::X, + index: 0 + }) + ); + assert_eq!(result.velocity()[0][0].to_bits(), (-0.0_f32).to_bits()); + } + assert_eq!(bits(slices(&fixture.velocity)), input_bits); +} + +fn corrected(input: &ProjectionInput<'_>, pressure: &[f64]) -> [Vec; 3] { + let mut velocity = input.velocity.map(<[f32]>::to_vec); + let [x, y, z] = &mut velocity; + PressureOperator::new(input.grid, input.density) + .unwrap() + .correct_candidate_in_place(pressure, input.dt, [x, y, z]) + .unwrap(); + velocity +} + +fn changed_binding(input: ProjectionInput<'_>, original: &SuppliedProjection<'_>) { + let mut workspace = + ProjectionWorkspace::new(input.grid, CAP, PressureImplementation::JacobiPcgV1).unwrap(); + let request = ProjectionRequest::new(input).unwrap(); + assert_ne!(request.input_id(), original.input_id); + assert_eq!( + workspace + .qualify(&request, Some(original), |_| panic!( + "header refusal called checkpoint" + )) + .err() + .unwrap(), + ProjectionError::Refused(ProjectionRefusal::InputBinding) + ); +} + +#[test] +fn c1b1_input_identity_binds_every_actual_input_fact_and_exact_face_bits() { + let fixture = Fixture::nonzero(); + let original = ProjectionRequest::new(fixture.input()).unwrap(); + let oracle = direct(&fixture.input(), PressureImplementation::JacobiPcgV1); + let candidate = supplied(&original, &oracle); + for field in 0..9 { + let mut input = fixture.input(); + match field { + 0 => input.dt *= 2.0, + 1 => input.interval_start = 0.125, + 2 => input.generation = 1, + 3 => input.density *= 2.0, + 4 => input.settings.relative_residual *= 2.0, + 5 => input.settings.absolute_residual *= 2.0, + 6 => input.settings.divergence_limit *= 2.0, + 7 => input.settings.max_iterations += 1, + 8 => input.actual_divergence_limit *= 2.0, + _ => unreachable!(), + } + changed_binding(input, &candidate); + } + for source in [ + SessionIdentity { + run_id: 102, + source_revision: fixture.source.source_revision.clone(), + }, + SessionIdentity { + run_id: 101, + source_revision: "another-declared-revision".into(), + }, + ] { + let mut input = fixture.input(); + input.source = &source; + changed_binding(input, &candidate); + } + for grid in [ + GridGeometry::new([4, 3, 2], [0.25, 0.3, 0.4], [0.1, 0.0, 0.0]).unwrap(), + GridGeometry::new([4, 3, 2], [0.26, 0.3, 0.4], [0.0; 3]).unwrap(), + ] { + let mut input = fixture.input(); + input.grid = &grid; + changed_binding(input, &candidate); + } + let mut velocity = fixture.velocity.clone(); + let index = fixture.grid.face_index(Axis::X, [1, 0, 0]).unwrap(); + velocity[0][index] = f32::from_bits(velocity[0][index].to_bits() + 1); + let mut input = fixture.input(); + input.velocity = slices(&velocity); + changed_binding(input, &candidate); + // Signed zero is a distinct actual input even though native validation accepts both. + let mut velocity = fixture.velocity.clone(); + velocity[0][0] = -0.0; + let mut input = fixture.input(); + input.velocity = slices(&velocity); + changed_binding(input, &candidate); + let grid = GridGeometry::new([5, 3, 2], [0.25, 0.3, 0.4], [0.0; 3]).unwrap(); + let velocity = std::array::from_fn(|d| vec![0.0; grid.face_len(Axis::ALL[d])]); + let changed = Fixture::with_fields(grid, velocity); + changed_binding(changed.input(), &candidate); + assert_eq!( + ProjectionRequest::new(fixture.input()).unwrap().input_id(), + original.input_id() + ); +} + +#[test] +fn c1b1_header_representation_identity_and_domain_refuse_before_callbacks() { + let fixture = Fixture::nonzero(); + let request = ProjectionRequest::new(fixture.input()).unwrap(); + let oracle = direct(&fixture.input(), PressureImplementation::JacobiPcgV1); + let mut workspace = + ProjectionWorkspace::new(&fixture.grid, CAP, PressureImplementation::JacobiPcgV1).unwrap(); + for field in 0..18 { + let mut candidate = supplied(&request, &oracle); + match field { + 0 => candidate.representation.version += 1, + 1 => candidate.representation.operator = "unsupported-operator", + _ => { + let field = field - 2; + let metadata = if field / 4 == 0 { + &mut candidate.representation.pressure + } else { + &mut candidate.representation.velocity[field / 4 - 1] + }; + match field % 4 { + 0 => metadata.shape_xyz[0] += 1, + 1 => metadata.layout = "unsupported-layout", + 2 => metadata.scalar = "unsupported-scalar", + 3 => metadata.units = "unsupported-units", + _ => unreachable!(), + } + } + } + assert_eq!( + workspace + .qualify(&request, Some(&candidate), |_| panic!( + "representation refusal called checkpoint" + )) + .err() + .unwrap(), + ProjectionError::Refused(ProjectionRefusal::Representation) + ); + } + for identity in [ + ProjectionCandidateIdentity { + algorithm: "", + ..CANDIDATE_ID + }, + ProjectionCandidateIdentity { + version: "bad\nversion", + ..CANDIDATE_ID + }, + ProjectionCandidateIdentity { + source_revision: "", + ..CANDIDATE_ID + }, + ProjectionCandidateIdentity { + algorithm: concat!( + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "a" + ), + ..CANDIDATE_ID + }, + ] { + let mut candidate = supplied(&request, &oracle); + candidate.identity = identity; + assert_eq!( + workspace + .qualify(&request, Some(&candidate), |_| panic!( + "identity refusal called checkpoint" + )) + .err() + .unwrap(), + ProjectionError::Refused(ProjectionRefusal::InvalidIdentity) + ); + } + for domain in [ + ProjectionDomain::FreeSurface, + ProjectionDomain::EmbeddedObstacle, + ProjectionDomain::MovingWall, + ] { + let mut input = fixture.input(); + input.domain = domain; + assert_eq!( + ProjectionRequest::new(input).err().unwrap(), + ProjectionError::Refused(ProjectionRefusal::UnsupportedDomain(domain)) + ); + } + let other = Fixture::zero(0.0); + let other_request = ProjectionRequest::new(other.input()).unwrap(); + assert_eq!( + workspace + .qualify(&other_request, None, |_| panic!( + "grid refusal called checkpoint" + )) + .err() + .unwrap(), + ProjectionError::Refused(ProjectionRefusal::WorkspaceGrid) + ); + let result = workspace.qualify(&request, None, |_| false).unwrap(); + assert_native(&result, &oracle); +} + +#[test] +fn c1b1_candidate_numerical_failures_retain_typed_reasons_and_clean_native_fallback() { + let fixture = Fixture::nonzero(); + let request = ProjectionRequest::new(fixture.input()).unwrap(); + let input_before = bits(slices(&fixture.velocity)); + let interior = fixture.grid.face_index(Axis::X, [1, 0, 0]).unwrap(); + for method in PressureImplementation::ALL { + let oracle = direct(&fixture.input(), method); + let mut workspace = ProjectionWorkspace::new(&fixture.grid, CAP, method).unwrap(); + for case in 0..8 { + let mut pressure = oracle.pressure.clone(); + let mut velocity = oracle.velocity.clone(); + let reason = match case { + 0 => { + pressure.pop(); + ProjectionRejection::Field(OperatorError::LengthMismatch) + } + 1 => { + pressure[1] = f64::NAN; + ProjectionRejection::Field(OperatorError::NonFiniteInput) + } + 2 => { + velocity[0].pop(); + ProjectionRejection::Field(OperatorError::LengthMismatch) + } + 3 => { + velocity[0][interior] = f32::NAN; + ProjectionRejection::Field(OperatorError::NonFiniteInput) + } + 4 => { + velocity[0][0] = 1.0; + ProjectionRejection::Field(OperatorError::NonZeroWallVelocity { + axis: Axis::X, + index: 0, + }) + } + 5 => { + pressure.fill(0.0); + velocity = corrected(&fixture.input(), &pressure); + ProjectionRejection::Pressure(ProviderRejection::QualityGate) + } + 6 => { + pressure.fill(1.0); + velocity = corrected(&fixture.input(), &pressure); + ProjectionRejection::Pressure(ProviderRejection::NonZeroGauge) + } + 7 => { + velocity[0][interior] = f32::from_bits(velocity[0][interior].to_bits() ^ 1); + ProjectionRejection::MomentumWitness { + axis: Axis::X, + index: interior, + } + } + _ => unreachable!(), + }; + let candidate = SuppliedProjection { + pressure: &pressure, + velocity: slices(&velocity), + ..supplied(&request, &oracle) + }; + let candidate_pressure = pressure_bits(candidate.pressure); + let candidate_velocity = bits(candidate.velocity); + { + let result = workspace + .qualify(&request, Some(&candidate), |_| false) + .unwrap(); + assert_native(&result, &oracle); + assert_eq!( + result.report().selection, + ProjectionSelection::NativeFallback, + "case {case}" + ); + assert_eq!(result.report().supplied_identity, Some(CANDIDATE_ID)); + assert_eq!( + result.report().rejection, + Some(reason.clone()), + "case {case}" + ); + assert_eq!(result.report().pressure.selected, method.id()); + if let ProjectionRejection::Pressure(pressure_reason) = reason { + assert_eq!(result.report().pressure.rejection, Some(pressure_reason)); + assert!(result.report().pressure.attempted.is_some()); + if case == 5 { + assert!(result.report().pressure.candidate.unwrap().true_residual_l2 > 0.0); + } + } else { + assert!(result.report().pressure.attempted.is_none()); + assert_eq!(result.report().pressure.rejection, None); + } + } + assert_eq!(pressure_bits(candidate.pressure), candidate_pressure); + assert_eq!(bits(candidate.velocity), candidate_velocity); + let good = supplied(&request, &oracle); + let result = workspace.qualify(&request, Some(&good), |_| false).unwrap(); + assert_eq!( + result.report().selection, + ProjectionSelection::SuppliedCandidate + ); + assert_eq!(result.report().rejection, None); + assert_eq!(bits(result.velocity()), bits(slices(&oracle.velocity))); + } + } + assert_eq!(bits(slices(&fixture.velocity)), input_before); +} + +#[test] +fn c1b1_invalid_actual_inputs_are_typed_constructor_errors() { + let fixture = Fixture::nonzero(); + for field in 0..15 { + let mut input = fixture.input(); + match field { + 0 => input.dt = 0.0, + 1 => input.dt = f64::NAN, + 2 => input.interval_start = -1.0, + 3 => input.interval_start = f64::INFINITY, + 4 => { + input.interval_start = f64::MAX; + input.dt = f64::MAX; + } + 5 => input.settings.relative_residual = -1.0, + 6 => input.settings.relative_residual = f64::NAN, + 7 => input.settings.absolute_residual = -1.0, + 8 => input.settings.absolute_residual = f64::INFINITY, + 9 => input.settings.divergence_limit = -1.0, + 10 => input.settings.divergence_limit = f64::NAN, + 11 => input.settings.max_iterations = 0, + 12 => input.actual_divergence_limit = -1.0, + 13 => input.actual_divergence_limit = f64::INFINITY, + 14 => input.interval_start = f64::MAX, + _ => unreachable!(), + } + assert_eq!( + ProjectionRequest::new(input).err().unwrap(), + ProjectionError::InvalidInput, + "field {field}" + ); + } + for density in [0.0, -1.0, f64::NAN, f64::INFINITY] { + let mut input = fixture.input(); + input.density = density; + assert_eq!( + ProjectionRequest::new(input).err().unwrap(), + ProjectionError::Operator(OperatorError::InvalidDensity) + ); + } + for revision in ["", "bad\nrevision"] { + let source = SessionIdentity { + run_id: 101, + source_revision: revision.into(), + }; + let mut input = fixture.input(); + input.source = &source; + assert_eq!( + ProjectionRequest::new(input).err().unwrap(), + ProjectionError::Refused(ProjectionRefusal::InvalidIdentity) + ); + } + for case in 0..3 { + let mut velocity = fixture.velocity.clone(); + let error = match case { + 0 => { + velocity[0].pop(); + OperatorError::LengthMismatch + } + 1 => { + velocity[0][1] = f32::NAN; + OperatorError::NonFiniteInput + } + 2 => { + velocity[0][0] = 1.0; + OperatorError::NonZeroWallVelocity { + axis: Axis::X, + index: 0, + } + } + _ => unreachable!(), + }; + let mut input = fixture.input(); + input.velocity = slices(&velocity); + assert_eq!( + ProjectionRequest::new(input).err().unwrap(), + ProjectionError::Operator(error) + ); + } +} + +#[test] +fn c1b1_cooperative_cancellation_returns_no_view_and_allows_clean_retry() { + let fixture = Fixture::nonzero(); + let request = ProjectionRequest::new(fixture.input()).unwrap(); + let before = bits(slices(&fixture.velocity)); + for method in PressureImplementation::ALL { + let oracle = direct(&fixture.input(), method); + let candidate = supplied(&request, &oracle); + let candidate_pressure = pressure_bits(candidate.pressure); + let candidate_velocity = bits(candidate.velocity); + let mut workspace = ProjectionWorkspace::new(&fixture.grid, CAP, method).unwrap(); + for with_candidate in [false, true] { + for target in [ + ProjectionCheckpoint::BeforeQualification, + ProjectionCheckpoint::BeforePressure, + ProjectionCheckpoint::PressurePoll, + ProjectionCheckpoint::AfterPressure, + ProjectionCheckpoint::BeforeReturn, + ] { + let mut seen = Vec::new(); + let error = workspace + .qualify(&request, with_candidate.then_some(&candidate), |point| { + seen.push(point); + point == target + }) + .err() + .unwrap(); + assert_eq!(seen.last(), Some(&target)); + if target == ProjectionCheckpoint::PressurePoll { + assert_eq!( + error, + ProjectionError::Pressure(PressureError::Cancelled { iterations: 0 }) + ); + } else { + assert_eq!(error, ProjectionError::Cancelled); + } + let result = workspace.qualify(&request, None, |_| false).unwrap(); + assert_native(&result, &oracle); + assert_eq!( + result.report().selection, + ProjectionSelection::NativeBaseline + ); + } + } + // Dispatcher poll, numerical entry poll, iteration-1 poll, then + // iteration-2 poll. This cancels inside the existing numerical solve. + assert!(oracle.report.accepted.iterations > 1); + let mut polls = 0; + let error = workspace + .qualify(&request, None, |point| { + if point == ProjectionCheckpoint::PressurePoll { + polls += 1; + } + point == ProjectionCheckpoint::PressurePoll && polls == 4 + }) + .err() + .unwrap(); + assert_eq!(polls, 4); + assert_eq!( + error, + ProjectionError::Pressure(PressureError::Cancelled { iterations: 1 }) + ); + let result = workspace + .qualify(&request, Some(&candidate), |_| false) + .unwrap(); + assert_eq!( + result.report().selection, + ProjectionSelection::SuppliedCandidate + ); + assert_eq!(bits(result.velocity()), candidate_velocity); + assert_eq!(pressure_bits(candidate.pressure), candidate_pressure); + assert_eq!(bits(candidate.velocity), candidate_velocity); + } + assert_eq!(bits(slices(&fixture.velocity)), before); +} + +#[test] +fn c1b1_native_iteration_failure_and_actual_divergence_failure_are_not_qualified() { + let fixture = Fixture::nonzero(); + let original_bits = bits(slices(&fixture.velocity)); + for method in PressureImplementation::ALL { + let oracle = direct(&fixture.input(), method); + assert!(oracle.report.accepted.iterations > 1); + let mut workspace = ProjectionWorkspace::new(&fixture.grid, CAP, method).unwrap(); + let mut bounded_input = fixture.input(); + bounded_input.settings.max_iterations = 1; + let bounded_request = ProjectionRequest::new(bounded_input).unwrap(); + let mut wrong_velocity = oracle.velocity.clone(); + wrong_velocity[0][0] = 1.0; + let mut bad = supplied(&bounded_request, &oracle); + bad.velocity = slices(&wrong_velocity); + for supplied in [None, Some(&bad)] { + let error = workspace + .qualify(&bounded_request, supplied, |_| false) + .err() + .unwrap(); + match error { + ProjectionError::Pressure(PressureError::IterationLimit { + iterations, + residual_max, + }) => { + assert_eq!(iterations, 1); + assert!(residual_max.is_finite() && residual_max > 0.0); + } + other => panic!("expected native iteration exhaustion, got {other:?}"), + } + } + // The same disposable workspace can still accept a qualified supplied + // result; max_iterations bounds native solving, not candidate acceptance. + let good = supplied(&bounded_request, &oracle); + { + let result = workspace + .qualify(&bounded_request, Some(&good), |_| false) + .unwrap(); + assert_eq!( + result.report().selection, + ProjectionSelection::SuppliedCandidate + ); + assert_eq!(result.report().pressure.accepted.iterations, 0); + } + let mut tight_input = fixture.input(); + tight_input.settings.relative_residual = 1.0; + tight_input.settings.absolute_residual = 1.0; + tight_input.settings.divergence_limit = 1.0; + tight_input.actual_divergence_limit = 0.0; + let loose_oracle = direct(&tight_input, method); + assert_eq!(loose_oracle.report.accepted.iterations, 0); + assert!(loose_oracle.actual_divergence_max > 0.0); + let tight_request = ProjectionRequest::new(tight_input).unwrap(); + let candidate = supplied(&tight_request, &loose_oracle); + for with_candidate in [false, true] { + let mut solves = 0; + let error = workspace + .qualify( + &tight_request, + with_candidate.then_some(&candidate), + |point| { + if point == ProjectionCheckpoint::AfterPressure { + solves += 1; + } + false + }, + ) + .err() + .unwrap(); + assert_eq!( + error, + ProjectionError::DivergenceExceeded { + maximum: loose_oracle.actual_divergence_max, + limit: 0.0 + } + ); + // Candidate pressure qualified; the actual-f32 gate retried native, + // whose identical correction cannot meet the zero actual limit. + assert_eq!(solves, if with_candidate { 2 } else { 1 }); + } + let request = ProjectionRequest::new(fixture.input()).unwrap(); + let result = workspace.qualify(&request, None, |_| false).unwrap(); + assert_native(&result, &oracle); + assert_eq!(result.report().rejection, None); + } + assert_eq!(bits(slices(&fixture.velocity)), original_bits); +} + +#[test] +fn c1b1_workspace_cap_includes_all_managed_array_capacities() { + let fixture = Fixture::nonzero(); + for method in PressureImplementation::ALL { + let pressure = ProviderWorkspace::new(&fixture.grid, CAP, method).unwrap(); + let host_bytes = 2 * fixture.grid.cell_len() * size_of::() + + Axis::ALL + .into_iter() + .map(|axis| fixture.grid.face_len(axis) * size_of::()) + .sum::(); + let workspace = ProjectionWorkspace::new(&fixture.grid, CAP, method).unwrap(); + let required = workspace.allocated_bytes(); + assert_eq!(required, pressure.allocated_bytes() + host_bytes); + assert!(required <= CAP); + assert_eq!( + ProjectionWorkspace::new(&fixture.grid, required, method) + .unwrap() + .allocated_bytes(), + required + ); + let error = ProjectionWorkspace::new(&fixture.grid, required - 1, method) + .err() + .unwrap(); + match error { + ProjectionError::BufferLimit { required, limit } + | ProjectionError::Pressure(PressureError::BufferLimit { required, limit }) => { + assert!(required > limit); + } + other => panic!("expected aggregate cap rejection, got {other:?}"), + } + assert!(matches!( + ProjectionWorkspace::new(&fixture.grid, 0, method) + .err() + .unwrap(), + ProjectionError::BufferLimit { limit: 0, .. } + )); + } +} + +#[test] +fn c1b1_actual_divergence_rejection_retains_both_pressure_calls_and_native_fallback() { + let fixture = Fixture::zero(0.0); + let mut input = fixture.input(); + input.actual_divergence_limit = 0.0; + let request = ProjectionRequest::new(input).unwrap(); + let input_before = bits(slices(&fixture.velocity)); + let mut pressure = vec![0.0; fixture.grid.cell_len()]; + pressure[1] = 1e-13; + let velocity = corrected(&fixture.input(), &pressure); + let mut divergence = vec![0.0; fixture.grid.cell_len()]; + PressureOperator::new(&fixture.grid, 1.25) + .unwrap() + .divergence(slices(&velocity), &mut divergence) + .unwrap(); + let candidate_divergence = divergence.iter().fold(0.0_f64, |a, b| a.max(b.abs())); + assert!(candidate_divergence > 0.0); + let candidate = SuppliedProjection { + input_id: request.input_id(), + representation: request.representation(), + identity: CANDIDATE_ID, + pressure: &pressure, + velocity: slices(&velocity), + }; + let pressure_before = pressure_bits(candidate.pressure); + let velocity_before = bits(candidate.velocity); + for method in PressureImplementation::ALL { + let native = direct(&fixture.input(), method); + let mut workspace = ProjectionWorkspace::new(&fixture.grid, CAP, method).unwrap(); + let mut calls = 0; + let result = workspace + .qualify(&request, Some(&candidate), |point| { + if point == ProjectionCheckpoint::AfterPressure { + calls += 1; + } + false + }) + .unwrap(); + assert_eq!(calls, 2); + assert_native(&result, &native); + assert_eq!( + result.report().selection, + ProjectionSelection::NativeFallback + ); + assert_eq!(result.report().supplied_identity, Some(CANDIDATE_ID)); + assert_eq!( + result.report().rejection, + Some(ProjectionRejection::ActualDivergence { + maximum: candidate_divergence, + limit: 0.0 + }) + ); + assert_eq!(result.report().actual_divergence_max, 0.0); + assert_eq!(result.report().pressure.selected, method.id()); + assert!(result.report().pressure.attempted.is_none()); + let discarded = result + .report() + .discarded_candidate_pressure + .as_ref() + .unwrap(); + assert_eq!( + discarded.selected, + "supplied-projection-pressure-witness-v1" + ); + assert!(discarded.attempted.is_some()); + assert_eq!(discarded.rejection, None); + assert_eq!(discarded.accepted.iterations, 0); + assert!(discarded.accepted.true_residual_l2 > 0.0); + assert!(discarded.accepted.true_residual_l2 < 1e-12); + assert!(discarded.accepted.predicted_divergence_max <= 1e-8); + assert_eq!( + diagnostics(&discarded.accepted), + diagnostics(&discarded.candidate.unwrap()) + ); + assert_eq!(pressure_bits(candidate.pressure), pressure_before); + assert_eq!(bits(candidate.velocity), velocity_before); + } + assert_eq!(bits(slices(&fixture.velocity)), input_before); +} diff --git a/src/solver_provider/composition_tests.rs b/src/solver_provider/composition_tests.rs new file mode 100644 index 00000000..2ad8936d --- /dev/null +++ b/src/solver_provider/composition_tests.rs @@ -0,0 +1,350 @@ +use super::*; +use crate::solver_provider::{ProviderRejection, SolverMetadata, TensorMetadata}; +use crate::{GridGeometry, PressureImplementation, PressureOperator, PressureReport}; +use std::cell::RefCell; + +fn grid() -> GridGeometry { + GridGeometry::new([4, 3, 2], [0.25, 0.3, 0.4], [0.0; 3]).unwrap() +} +fn settings() -> PressureSettings { + PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 1000, + } +} +fn fixture(g: &GridGeometry) -> (Vec, Vec) { + let pressure: Vec<_> = (0..g.cell_len()).map(|i| (i as f64 * 0.3).sin()).collect(); + let mut rhs = vec![0.0; g.cell_len()]; + PressureOperator::new(g, 1.25) + .unwrap() + .apply_full(&pressure, &mut rhs) + .unwrap(); + (pressure, rhs) +} +fn bits(values: &[f64]) -> Vec { + values.iter().map(|x| x.to_bits()).collect() +} +fn numerical(report: PressureReport) -> (usize, u64, u64, u64) { + ( + report.iterations, + report.true_residual_l2.to_bits(), + report.true_residual_max.to_bits(), + report.predicted_divergence_max.to_bits(), + ) +} +fn same_report(a: &ProviderReport, b: &ProviderReport) { + assert_eq!(a.selected, b.selected); + assert_eq!(a.attempted, b.attempted); + assert_eq!(a.rejection, b.rejection); + assert_eq!(a.candidate.map(numerical), b.candidate.map(numerical)); + assert_eq!(numerical(a.accepted), numerical(b.accepted)); +} + +#[derive(Debug, Clone, PartialEq)] +struct Observation { + grid: GridGeometry, + density: u64, + dt: u64, + rhs: Vec, +} +#[derive(Clone)] +struct Candidate { + values: Vec, + fail: Option, + seen: RefCell>, + predictions: usize, +} +impl Candidate { + fn new(values: Vec, fail: Option) -> Self { + Self { + values, + fail, + seen: RefCell::new(Vec::new()), + predictions: 0, + } + } + fn observe(&self, request: &PressureRequest<'_>) { + self.seen.borrow_mut().push(Observation { + grid: request.grid.clone(), + density: request.density.to_bits(), + dt: request.dt.to_bits(), + rhs: bits(request.rhs), + }); + } +} +impl PressureProvider for Candidate { + fn metadata(&self) -> SolverMetadata { + let tensor = |units| TensorMetadata { + shape_xyz: [4, 3, 2], + layout: "x-fastest-cell-centered", + scalar: "f64", + units, + }; + SolverMetadata { + id: "c1a-classical-test-not-ai", + version: "1", + stage: "pressure", + input: tensor("m^3/s^2"), + output: tensor("Pa"), + domain: "classical contract test only", + provenance: None, + } + } + fn supports(&self, request: &PressureRequest<'_>) -> Result<(), ProviderRejection> { + self.observe(request); + if let Some(ProviderRejection::Unsupported(reason)) = self.fail { + Err(ProviderRejection::Unsupported(reason)) + } else { + Ok(()) + } + } + fn predict( + &mut self, + request: &PressureRequest<'_>, + out: &mut [f64], + _: &mut dyn FnMut() -> bool, + ) -> Result<(), ProviderRejection> { + self.observe(request); + self.predictions += 1; + if let Some(error) = &self.fail { + return Err(error.clone()); + } + out[..self.values.len()].copy_from_slice(&self.values); + Ok(()) + } +} + +#[test] +fn c1a_pressure_exact_and_adversarial_candidates_match_original_dispatch() { + let g = grid(); + let (pressure, rhs) = fixture(&g); + let request = PressureRequest { + grid: &g, + density: 1.25, + dt: 0.01, + rhs: &rhs, + }; + let cases = [ + (pressure.clone(), None, None), + (vec![], None, Some(ProviderRejection::NonFiniteOutput)), + ( + vec![f64::NAN; g.cell_len()], + None, + Some(ProviderRejection::NonFiniteOutput), + ), + ( + vec![f64::INFINITY; g.cell_len()], + None, + Some(ProviderRejection::NonFiniteOutput), + ), + ( + vec![2.0; g.cell_len()], + None, + Some(ProviderRejection::NonZeroGauge), + ), + ( + vec![0.0; g.cell_len()], + None, + Some(ProviderRejection::QualityGate), + ), + ( + vec![], + Some(ProviderRejection::Unsupported("shape")), + Some(ProviderRejection::Unsupported("shape")), + ), + ( + vec![], + Some(ProviderRejection::Execution("offline")), + Some(ProviderRejection::Execution("offline")), + ), + ( + vec![], + Some(ProviderRejection::Cancelled), + Some(ProviderRejection::Cancelled), + ), + ]; + for method in PressureImplementation::ALL { + for (values, fail, rejection) in &cases { + let mut original = ProviderWorkspace::new(&g, 100000, method).unwrap(); + let mut adapted = ProviderWorkspace::new(&g, 100000, method).unwrap(); + let mut a = Candidate::new(values.clone(), fail.clone()); + let mut b = a.clone(); + let direct = original.solve(request, settings(), Some(&mut a), || false); + let mut stage = + PressureStageV1::select(ReplacementContract::PressureV1, &mut adapted).unwrap(); + let result = stage.solve(request, settings(), Some(&mut b), || false); + match (direct, result) { + (Ok(direct), Ok(result)) => { + same_report(&direct, result.report()); + assert_eq!(&result.report().rejection, rejection); + assert_eq!(bits(original.pressure()), bits(result.pressure())); + if rejection.is_none() { + assert_eq!(bits(result.pressure()), bits(&pressure)); + assert_eq!(result.report().accepted.true_residual_l2, 0.0); + assert_eq!(result.report().selected, "c1a-classical-test-not-ai"); + } else { + assert_eq!(result.report().selected, method.id()); + } + } + (Err(a), Err(b)) => assert_eq!(a, b), + _ => panic!("adapter changed original outcome"), + } + assert_eq!(*a.seen.borrow(), *b.seen.borrow()); + assert_eq!(a.predictions, b.predictions); + for observation in b.seen.into_inner() { + assert_eq!( + observation, + Observation { + grid: g.clone(), + density: 1.25f64.to_bits(), + dt: 0.01f64.to_bits(), + rhs: bits(&rhs), + } + ); + } + } + } +} + +#[test] +fn c1a_pressure_invalid_inputs_and_host_cancellation_preserve_original_errors() { + let g = grid(); + let (_, rhs) = fixture(&g); + let other = GridGeometry::new([3, 3, 2], [0.25, 0.3, 0.4], [0.0; 3]).unwrap(); + let short = vec![0.0; 2]; + let nan = vec![f64::NAN; g.cell_len()]; + let incompatible = vec![1.0; g.cell_len()]; + let overflow = vec![f64::MAX; g.cell_len()]; + let base = PressureRequest { + grid: &g, + density: 1.25, + dt: 0.01, + rhs: &rhs, + }; + let mut bad_settings = settings(); + bad_settings.relative_residual = f64::NAN; + let cases = [ + ( + PressureRequest { + grid: &other, + ..base + }, + settings(), + false, + ), + ( + PressureRequest { + rhs: &short, + ..base + }, + settings(), + false, + ), + (PressureRequest { rhs: &nan, ..base }, settings(), false), + ( + PressureRequest { + rhs: &incompatible, + ..base + }, + settings(), + false, + ), + ( + PressureRequest { + rhs: &overflow, + ..base + }, + settings(), + false, + ), + ( + PressureRequest { + density: 0.0, + ..base + }, + settings(), + false, + ), + ( + PressureRequest { + density: f64::NAN, + ..base + }, + settings(), + false, + ), + (PressureRequest { dt: 0.0, ..base }, settings(), false), + (PressureRequest { dt: -1.0, ..base }, settings(), false), + ( + PressureRequest { + dt: f64::NAN, + ..base + }, + settings(), + false, + ), + (base, bad_settings, false), + (base, settings(), true), + ]; + for (request, settings, cancelled) in cases { + let mut original = + ProviderWorkspace::new(&g, 100000, PressureImplementation::JacobiPcgV1).unwrap(); + let mut adapted = + ProviderWorkspace::new(&g, 100000, PressureImplementation::JacobiPcgV1).unwrap(); + let mut a = Candidate::new(vec![], None); + let mut b = a.clone(); + let direct = original + .solve(request, settings, Some(&mut a), || cancelled) + .unwrap_err(); + let mut stage = + PressureStageV1::select(ReplacementContract::PressureV1, &mut adapted).unwrap(); + let error = match stage.solve(request, settings, Some(&mut b), || cancelled) { + Err(error) => error, + Ok(_) => panic!("invalid input qualified"), + }; + assert_eq!(direct, error); + assert!(b.seen.borrow().is_empty()); + assert_eq!(b.predictions, 0); + } +} + +#[test] +fn c1a_unavailable_scopes_preserve_seeded_workspace_and_v1_iteration_semantics() { + let g = grid(); + let (pressure, rhs) = fixture(&g); + let request = PressureRequest { + grid: &g, + density: 1.25, + dt: 0.01, + rhs: &rhs, + }; + let mut workspace = + ProviderWorkspace::new(&g, 100000, PressureImplementation::JacobiPcgV1).unwrap(); + let mut candidate = Candidate::new(pressure.clone(), None); + let mut zero_iterations = settings(); + zero_iterations.max_iterations = 0; + let direct = workspace + .solve(request, zero_iterations, Some(&mut candidate), || false) + .unwrap(); + let seeded = bits(workspace.pressure()); + for requested in [ + ReplacementContract::SealedMacProjectionV1, + ReplacementContract::WholeSealedMacV1, + ReplacementContract::WholeParticlePreviewV1, + ] { + assert!( + matches!(PressureStageV1::select(requested, &mut workspace), Err(error) if error.requested == requested) + ); + assert_eq!(bits(workspace.pressure()), seeded); + } + let mut stage = + PressureStageV1::select(ReplacementContract::PressureV1, &mut workspace).unwrap(); + let result = stage + .solve(request, zero_iterations, Some(&mut candidate), || false) + .unwrap(); + assert_eq!(bits(result.pressure()), bits(&pressure)); + same_report(&direct, result.report()); + assert_eq!(result.into_report().selected, "c1a-classical-test-not-ai"); +} diff --git a/src/solver_provider/configured.rs b/src/solver_provider/configured.rs index 0957b491..70b66f8d 100644 --- a/src/solver_provider/configured.rs +++ b/src/solver_provider/configured.rs @@ -84,6 +84,8 @@ pub struct AcceptedPressureContextStamp { /// Only returned/published with the complete accepted transport interval. #[derive(Debug, Clone)] pub struct ConfiguredProviderReport { + /// Actual composed execution evidence; absent only for historical receipts. + pub workflow: Option>, pub binding: Option>, pub context: Option, pub dynamic_viscosity: f64, @@ -102,6 +104,7 @@ pub(crate) struct AcceptedHistoryStamp { pub all_native: bool, } pub(crate) struct AcceptedContextInput<'a> { + pub workflow: std::rc::Rc, pub run_id: String, pub generation: u64, pub interval_start: f64, @@ -207,29 +210,44 @@ impl PressureProvider for ContextAdapter<'_, '_> { } } fn supports(&self, request: &PressureRequest<'_>) -> Result<(), ProviderRejection> { - self.binding - .as_ref() - .ok_or(ProviderRejection::Unsupported( - "invalid configured provider identity", - ))? - .validate()?; - let context = self.request(request)?; - self.stamp.set(Some(AcceptedPressureContextStamp { - generation: context.context.generation(), - interval_start: context.context.interval_start(), - interval_end: context.context.interval_end(), - dt: context.context.dt(), - native_prefix_steps: context.native_prefix_steps, - prior_generation: context.context.prior().map(|p| p.generation), - prior_interval_end: context.context.prior().map(|p| p.interval_end), - prior_pressure_sha256: context.context.prior().map(|p| hash_values(p.values)), - rhs_sha256: hash_values(context.context.rhs()), - })); - self.input - .provider - .as_ref() - .ok_or(ProviderRejection::Unsupported("no configured provider"))? - .supports(&context) + let result = (|| { + self.binding + .as_ref() + .ok_or(ProviderRejection::Unsupported( + "invalid configured provider identity", + ))? + .validate()?; + let context = self.request(request)?; + self.stamp.set(Some(AcceptedPressureContextStamp { + generation: context.context.generation(), + interval_start: context.context.interval_start(), + interval_end: context.context.interval_end(), + dt: context.context.dt(), + native_prefix_steps: context.native_prefix_steps, + prior_generation: context.context.prior().map(|p| p.generation), + prior_interval_end: context.context.prior().map(|p| p.interval_end), + prior_pressure_sha256: context.context.prior().map(|p| hash_values(p.values)), + rhs_sha256: hash_values(context.context.rhs()), + })); + self.input + .provider + .as_ref() + .ok_or(ProviderRejection::Unsupported("no configured provider"))? + .supports(&context) + })(); + if let Some(p) = self.input.workflow.borrow_mut().pressure.as_mut() { + p.binding = self.binding.as_deref().cloned(); + p.support = Some(result.is_ok()); + p.rejection = result.as_ref().err().map(|r| format!("{r:?}")); + } + if result.is_err() { + crate::workflow::complete( + Some(self.input.workflow.as_ref()), + crate::workflow::NodeKind::PressureCandidate, + crate::workflow::NodeStatus::Rejected, + ); + } + result } fn predict( &mut self, @@ -238,6 +256,9 @@ impl PressureProvider for ContextAdapter<'_, '_> { cancelled: &mut dyn FnMut() -> bool, ) -> Result<(), ProviderRejection> { self.prediction_called = true; + if let Some(p) = self.input.workflow.borrow_mut().pressure.as_mut() { + p.prediction_called = true; + } let provider = self .input .provider @@ -247,6 +268,20 @@ impl PressureProvider for ContextAdapter<'_, '_> { .request(request) .and_then(|context| provider.predict(&context, pressure, cancelled)); self.input.provider = Some(provider); + crate::workflow::complete( + Some(self.input.workflow.as_ref()), + crate::workflow::NodeKind::PressureCandidate, + if result.is_ok() { + crate::workflow::NodeStatus::CandidateReturned + } else { + crate::workflow::NodeStatus::Rejected + }, + ); + if let Err(e) = &result + && let Some(p) = self.input.workflow.borrow_mut().pressure.as_mut() + { + p.rejection = Some(format!("{e:?}")); + } result } } diff --git a/src/workflow.rs b/src/workflow.rs new file mode 100644 index 00000000..a330160d --- /dev/null +++ b/src/workflow.rs @@ -0,0 +1,858 @@ +//! Bounded observations of the existing sealed MAC composition. +//! This describes the native method; it is not an executable graph or a claim +//! of continuum accuracy. Receipts are emitted by the numerical owners. +use crate::solver_provider::{ProviderReport, configured::ContextProviderIdentity}; +use crate::{GridGeometry, PressureImplementation, PressureReport, PressureSettings}; +use sha2::{Digest, Sha256}; +use std::{cell::RefCell, sync::Arc}; + +pub const DESCRIPTOR_VERSION: u32 = 1; +pub const MAX_NODES: usize = 256; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[repr(u8)] +pub enum NodeKind { + Geometry, + AcceptedState, + Interval, + Advection, + Forces, + Viscosity, + PressureRequest, + PressureCandidate, + PressureQualification, + NativeFallback, + Projection, + TracerTransport, + VolumeTransport, + Publication, +} +impl NodeKind { + pub const ALL: [Self; 14] = [ + Self::Geometry, + Self::AcceptedState, + Self::Interval, + Self::Advection, + Self::Forces, + Self::Viscosity, + Self::PressureRequest, + Self::PressureCandidate, + Self::PressureQualification, + Self::NativeFallback, + Self::Projection, + Self::TracerTransport, + Self::VolumeTransport, + Self::Publication, + ]; + pub fn label(self) -> &'static str { + match self { + Self::Geometry => "Sealed Cartesian geometry", + Self::AcceptedState => "Accepted native MAC state", + Self::Interval => "Admit actual interval", + Self::Advection => "Advect face velocity", + Self::Forces => "Apply prescribed body forces", + Self::Viscosity => "Newtonian viscosity", + Self::PressureRequest => "Assemble actual pressure request", + Self::PressureCandidate => "Configured pressure candidate", + Self::PressureQualification => "Host pressure qualification", + Self::NativeFallback => "Native pressure / fallback", + Self::Projection => "Project and qualify corrected velocity", + Self::TracerTransport => "Transport appearance tracer", + Self::VolumeTransport => "Transport represented liquid volume", + Self::Publication => "Atomic Session publication", + } + } + pub fn lane(self) -> usize { + match self { + Self::Geometry => 0, + Self::AcceptedState => 1, + Self::PressureQualification | Self::Projection => 3, + Self::Publication => 4, + _ => 2, + } + } +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum PortKind { + Geometry, + NativeState, + Interval, + FaceVelocity, + CellPressure, + CellFraction, + CellTracer, + IntegratedRhs, + Qualification, +} +impl PortKind { + pub fn units(self) -> &'static str { + match self { + Self::Geometry => "m", + Self::NativeState => "native MAC fields", + Self::Interval => "s", + Self::FaceVelocity => "m/s", + Self::CellPressure => "Pa", + Self::CellFraction | Self::CellTracer => "1", + Self::IntegratedRhs => "m3/s2", + Self::Qualification => "host gate", + } + } + pub fn association(self) -> &'static str { + match self { + Self::FaceVelocity => "staggered Cartesian faces; f32; x-fast", + Self::CellPressure => "cell centre; f64; x-fast; cell0 gauge=0", + Self::CellFraction => "cell centre; f64; x-fast", + Self::CellTracer => "cell centre; f32; x-fast; appearance only", + Self::IntegratedRhs => "cell centre; f64; x-fast; integrated full operator", + _ => "composition metadata", + } + } +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum EdgeKind { + Data, + Fallback, + TimeLoop, + IterationLoop, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct WorkflowEdge { + pub from: NodeKind, + pub to: NodeKind, + pub port: PortKind, + pub kind: EdgeKind, +} + +/// Only the already-supported sealed, constant-density method is representable. +#[derive(Debug, Clone)] +pub struct WorkflowDescriptor { + pub version: u32, + pub grid: GridGeometry, + pub density: f64, + /// None means disabled; Some(0) is the actually applied zero stage. + pub viscosity: Option, + pub implementation: PressureImplementation, + pub pressure: PressureSettings, + pub actual_divergence_limit: f64, + pub max_courant: f64, +} +impl WorkflowDescriptor { + pub fn family(&self) -> &'static str { + "sealed-constant-density-mac-v1" + } + pub fn operator(&self) -> &'static str { + "integrated-sealed-mac-pressure-v1; cell0 gauge=0" + } + pub fn nodes(&self) -> &'static [NodeKind] { + &NodeKind::ALL + } + pub fn edges(&self) -> Vec { + use EdgeKind::*; + use NodeKind::*; + use PortKind::{ + CellFraction, CellPressure, CellTracer, FaceVelocity, IntegratedRhs, NativeState, + Qualification, + }; + let velocity = if self.viscosity.is_some() { + Viscosity + } else { + Forces + }; + let mut edges = vec![ + WorkflowEdge { + from: AcceptedState, + to: Interval, + port: NativeState, + kind: Data, + }, + WorkflowEdge { + from: AcceptedState, + to: Advection, + port: FaceVelocity, + kind: Data, + }, + WorkflowEdge { + from: Advection, + to: Forces, + port: FaceVelocity, + kind: Data, + }, + WorkflowEdge { + from: velocity, + to: PressureRequest, + port: FaceVelocity, + kind: Data, + }, + WorkflowEdge { + from: PressureRequest, + to: PressureCandidate, + port: IntegratedRhs, + kind: Data, + }, + WorkflowEdge { + from: PressureRequest, + to: PressureQualification, + port: IntegratedRhs, + kind: Data, + }, + WorkflowEdge { + from: PressureCandidate, + to: PressureQualification, + port: CellPressure, + kind: Data, + }, + WorkflowEdge { + from: PressureQualification, + to: Projection, + port: CellPressure, + kind: Data, + }, + WorkflowEdge { + from: PressureQualification, + to: NativeFallback, + port: Qualification, + kind: Fallback, + }, + WorkflowEdge { + from: PressureRequest, + to: NativeFallback, + port: IntegratedRhs, + kind: Data, + }, + WorkflowEdge { + from: NativeFallback, + to: Projection, + port: CellPressure, + kind: Data, + }, + WorkflowEdge { + from: velocity, + to: Projection, + port: FaceVelocity, + kind: Data, + }, + WorkflowEdge { + from: Projection, + to: TracerTransport, + port: FaceVelocity, + kind: Data, + }, + WorkflowEdge { + from: Projection, + to: VolumeTransport, + port: FaceVelocity, + kind: Data, + }, + WorkflowEdge { + from: AcceptedState, + to: TracerTransport, + port: CellTracer, + kind: Data, + }, + WorkflowEdge { + from: AcceptedState, + to: VolumeTransport, + port: CellFraction, + kind: Data, + }, + WorkflowEdge { + from: Projection, + to: Publication, + port: NativeState, + kind: Data, + }, + WorkflowEdge { + from: TracerTransport, + to: Publication, + port: CellTracer, + kind: Data, + }, + WorkflowEdge { + from: VolumeTransport, + to: Publication, + port: CellFraction, + kind: Data, + }, + WorkflowEdge { + from: NativeFallback, + to: NativeFallback, + port: CellPressure, + kind: IterationLoop, + }, + WorkflowEdge { + from: Publication, + to: AcceptedState, + port: NativeState, + kind: TimeLoop, + }, + ]; + if self.viscosity.is_some() { + edges.push(WorkflowEdge { + from: Forces, + to: Viscosity, + port: FaceVelocity, + kind: Data, + }); + } + for to in [ + Advection, + Forces, + Viscosity, + PressureRequest, + PressureCandidate, + PressureQualification, + NativeFallback, + Projection, + TracerTransport, + VolumeTransport, + ] { + edges.push(WorkflowEdge { + from: NodeKind::Geometry, + to, + port: PortKind::Geometry, + kind: Data, + }); + edges.push(WorkflowEdge { + from: Interval, + to, + port: PortKind::Interval, + kind: Data, + }); + } + edges + } + pub fn validate(&self) -> Result<(), &'static str> { + if self.version != DESCRIPTOR_VERSION { + return Err("unsupported workflow descriptor version"); + } + if !self.density.is_finite() + || self.density <= 0.0 + || self + .viscosity + .is_some_and(|v| !v.is_finite() || v < 0.0 || (v != 0.0 && !v.is_normal())) + || [ + self.pressure.relative_residual, + self.pressure.absolute_residual, + self.pressure.divergence_limit, + self.actual_divergence_limit, + self.max_courant, + ] + .iter() + .any(|v| !v.is_finite() || *v < 0.0) + || self.max_courant <= 0.0 + || self.max_courant > 1.0 + { + return Err("invalid workflow descriptor parameters"); + } + Ok(()) + } + /// Canonical fixed ordering, exact IEEE parameter bits, no labels/UI layout. + pub fn digest(&self) -> [u8; 32] { + let mut h = Sha256::new(); + h.update(b"rheon-sealed-mac-workflow-v1\0"); + h.update(self.version.to_le_bytes()); + for n in self.grid.counts() { + h.update((n as u64).to_le_bytes()); + } + for v in self + .grid + .spacing() + .into_iter() + .chain(self.grid.origin()) + .chain([ + self.density, + self.viscosity.unwrap_or(0.0), + self.pressure.relative_residual, + self.pressure.absolute_residual, + self.pressure.divergence_limit, + self.actual_divergence_limit, + self.max_courant, + ]) + { + h.update(v.to_bits().to_le_bytes()); + } + h.update([u8::from(self.viscosity.is_some())]); + h.update(self.implementation.id().as_bytes()); + h.update((self.pressure.max_iterations as u64).to_le_bytes()); + for node in self.nodes() { + h.update([*node as u8]); + } + for edge in self.edges() { + h.update([ + edge.from as u8, + edge.to as u8, + edge.port as u8, + edge.kind as u8, + ]); + } + h.finalize().into() + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum NodeStatus { + Started, + Completed, + CandidateReturned, + Rejected, + Selected, + Accepted, +} +#[derive(Debug, Clone)] +pub struct NodeReceipt { + pub node: NodeKind, + pub status: NodeStatus, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum AttemptOutcome { + Accepted, + Cancelled, + Failed, + Refused, +} +#[derive(Debug, Clone)] +pub struct PressureFacts { + pub selected: String, + pub binding: Option, + pub prediction_called: bool, + pub support: Option, + pub rejection: Option, + pub rhs_sha256: Option<[u8; 32]>, + pub candidate: Option, + pub accepted: Option, + /// Pressure-call scope only; never presented as whole workflow time. + pub pressure_call_ns: Option, + /// Actual max(absolute, relative * ||rhs||₂), m³/s², from the host dispatcher. + pub residual_l2_limit: Option, +} +#[derive(Debug, Clone)] +pub struct WorkflowAttempt { + pub descriptor: WorkflowDescriptor, + pub descriptor_sha256: [u8; 32], + /// Exact accepted native state consumed by this attempt, not a model-input claim. + pub input_sha256: [u8; 32], + /// Actual control values, including complete source rates and force recipe. + pub request_sha256: [u8; 32], + pub force_count: usize, + pub smoke_source_present: bool, + pub volume_source_present: bool, + pub run_id: u64, + pub attempt_id: u64, + pub accepted_generation: u64, + pub attempted_generation: u64, + pub interval_start: f64, + pub requested_dt: f64, + pub actual_dt: Option, + pub publication: Option, + pub outcome: AttemptOutcome, + pub nodes: Vec, + pub pressure: Option, + pub actual_divergence_max: Option, + pub diagnostic: String, +} +impl WorkflowAttempt { + /// Compare retained actual-call identity with a reconstructed declared recipe. + /// A match binds controls; it does not qualify their physical accuracy. + pub fn matches_request(&self, inputs: crate::LiquidStepInputs<'_>) -> bool { + self.request_sha256 == request_digest(inputs) + && self.force_count == inputs.forces.len() + && self.smoke_source_present == inputs.smoke_source.is_some() + && self.volume_source_present == inputs.source.is_some() + } + pub fn validate(&self) -> Result<(), &'static str> { + self.descriptor.validate()?; + if self.descriptor_sha256 != self.descriptor.digest() { + return Err("workflow descriptor digest"); + } + if self.attempt_id == 0 + || self.accepted_generation.checked_add(1) != Some(self.attempted_generation) + || !self.interval_start.is_finite() + || self.interval_start < 0.0 + || !self.requested_dt.is_finite() + || self.requested_dt <= 0.0 + || self.actual_dt.is_some_and(|dt| { + !dt.is_finite() + || dt <= 0.0 + || dt > self.requested_dt + || !(self.interval_start + dt).is_finite() + || self.interval_start + dt <= self.interval_start + }) + || self.nodes.len() > MAX_NODES + || self.diagnostic.len() > 1000 + || self + .actual_divergence_max + .is_some_and(|v| !v.is_finite() || v < 0.0) + { + return Err("workflow attempt association"); + } + if (self.outcome == AttemptOutcome::Accepted) != self.publication.is_some() + || self + .publication + .is_some_and(|g| g != self.attempted_generation || self.actual_dt.is_none()) + || (self.publication.is_some() + && self.nodes.last().is_none_or(|n| { + n.node != NodeKind::Publication || n.status != NodeStatus::Accepted + })) + { + return Err("workflow publication association"); + } + if let Some(p) = &self.pressure + && (p.selected.len() > 1000 + || p.rejection.as_ref().is_some_and(|s| s.len() > 1000) + || p.binding.as_ref().is_some_and(|b| b.validate().is_err()) + || p.residual_l2_limit + .is_some_and(|v| !v.is_finite() || v < 0.0) + || (p.prediction_called && p.support != Some(true)) + || (p.accepted.is_some() && (p.selected.is_empty() || self.actual_dt.is_none())) + || p.accepted.is_some_and(|r| { + [ + r.true_residual_l2, + r.true_residual_max, + r.predicted_divergence_max, + ] + .iter() + .any(|v| !v.is_finite() || *v < 0.0) + })) + { + return Err("workflow pressure facts"); + } + self.validate_nodes() + } + fn validate_nodes(&self) -> Result<(), &'static str> { + use NodeKind::*; + use NodeStatus::*; + let mut expected = vec![ + (Geometry, Completed), + (AcceptedState, Completed), + (Interval, Completed), + (Advection, Completed), + (Forces, Completed), + ]; + if self.descriptor.viscosity.is_some() { + expected.push((Viscosity, Completed)); + } + expected.push((PressureRequest, Completed)); + let base = expected.len(); + if self.pressure.is_some() && self.nodes.len() < base { + return Err("workflow pressure stage association"); + } + let mut fallback = true; + if let Some(p) = &self.pressure { + if let Some(supported) = p.support { + let candidate = self.nodes.get(base).map_or(CandidateReturned, |n| n.status); + if !matches!(candidate, CandidateReturned | Rejected) + || (!supported && candidate != Rejected) + { + return Err("workflow candidate stage status"); + } + expected.push((PressureCandidate, candidate)); + fallback = p.rejection.is_some(); + expected.push(( + PressureQualification, + if fallback { Rejected } else { Accepted }, + )); + } else if p.binding.is_some() || p.prediction_called || p.rejection.is_some() { + return Err("workflow native pressure facts"); + } + } + if fallback { + expected.extend([(NativeFallback, Started), (NativeFallback, Selected)]); + } + expected.extend([ + (Projection, Completed), + (TracerTransport, Completed), + (VolumeTransport, Completed), + (Publication, Accepted), + ]); + if self.nodes.len() > expected.len() + || self + .nodes + .iter() + .zip(&expected) + .any(|(n, (node, status))| n.node != *node || n.status != *status) + || (self.outcome == AttemptOutcome::Accepted && self.nodes.len() != expected.len()) + || (self.outcome != AttemptOutcome::Accepted + && self.nodes.iter().any(|n| n.node == Publication)) + || (self.nodes.iter().any(|n| n.node == Interval) != self.actual_dt.is_some()) + || (self.nodes.iter().any(|n| n.node == Projection) + != self.actual_divergence_max.is_some()) + { + return Err("workflow execution ordering"); + } + if self.nodes.iter().any(|n| { + matches!( + n.node, + PressureRequest + | PressureCandidate + | PressureQualification + | NativeFallback + | Projection + ) + }) && self + .pressure + .as_ref() + .is_none_or(|p| p.rhs_sha256.is_none()) + { + return Err("workflow pressure request association"); + } + if let Some(p) = &self.pressure { + let qualification = self + .nodes + .iter() + .find(|n| n.node == PressureQualification) + .map(|n| n.status); + let native_selected = self + .nodes + .iter() + .any(|n| n.node == NativeFallback && n.status == Selected); + if p.candidate.is_some_and(|report| report.iterations != 0) + || p.accepted.is_some_and(|report| { + if native_selected { + report.iterations > self.descriptor.pressure.max_iterations + } else { + report.iterations != 0 + } + }) + { + return Err("workflow observed pressure iterations"); + } + let within_limits = |r: PressureReport| { + [ + r.true_residual_l2, + r.true_residual_max, + r.predicted_divergence_max, + ] + .iter() + .all(|v| v.is_finite() && *v >= 0.0) + && r.predicted_divergence_max <= self.descriptor.pressure.divergence_limit + && p.residual_l2_limit + .is_some_and(|limit| r.true_residual_l2 <= limit) + }; + if p.accepted.is_some_and(|r| !within_limits(r)) + || (qualification == Some(Accepted) + && p.candidate.is_none_or(|r| !within_limits(r))) + || self + .actual_divergence_max + .is_some_and(|v| v > self.descriptor.actual_divergence_limit) + { + return Err("workflow observed qualification limits"); + } + if (p.candidate.is_some() && qualification.is_none()) + || (qualification == Some(Accepted) && p.candidate.is_none()) + || (p.accepted.is_some() && qualification != Some(Accepted) && !native_selected) + || (p.pressure_call_ns.is_some() && p.accepted.is_none()) + || (native_selected && p.accepted.is_none()) + { + return Err("workflow pressure diagnostic stage association"); + } + } + if let Some(p) = &self.pressure + && ((p.support == Some(true) && (p.binding.is_none() || !p.prediction_called)) + || (p.support == Some(false) && (p.prediction_called || p.rejection.is_none())) + || (self + .nodes + .iter() + .any(|n| n.node == PressureCandidate && n.status == CandidateReturned) + && !p.prediction_called) + || (self.nodes.iter().any(|n| n.node == NativeFallback) + && p.selected != self.descriptor.implementation.id())) + { + return Err("workflow provider branch association"); + } + if self.outcome == AttemptOutcome::Accepted { + let p = self + .pressure + .as_ref() + .ok_or("workflow accepted pressure absent")?; + let selected = if fallback { + self.descriptor.implementation.id() + } else { + "configured-pressure-context-v1" + }; + if p.accepted.is_none() + || p.selected != selected + || p.rhs_sha256.is_none() + || p.residual_l2_limit.is_none() + || self.actual_divergence_max.is_none() + { + return Err("workflow accepted pressure association"); + } + if !fallback { + let bits = |r: PressureReport| { + [ + r.iterations as u64, + r.true_residual_l2.to_bits(), + r.true_residual_max.to_bits(), + r.predicted_divergence_max.to_bits(), + ] + }; + if p.candidate.map(bits) != p.accepted.map(bits) { + return Err("workflow candidate acceptance association"); + } + } + } + Ok(()) + } +} + +/// Shared only within one synchronous numerical attempt. No callback creates +/// receipt facts; callbacks can stop the work whose owners emit those facts. +pub(crate) type Capture = RefCell; +pub(crate) fn complete(capture: Option<&Capture>, node: NodeKind, status: NodeStatus) { + if let Some(c) = capture { + let mut c = c.borrow_mut(); + // The finite composition emits fewer than MAX_NODES summaries; no loop + // iterations or per-cell data are appended here. + assert!(c.nodes.len() < MAX_NODES); + c.nodes.push(NodeReceipt { node, status }); + } +} +pub(crate) fn pressure_completed(capture: Option<&Capture>, report: &ProviderReport) { + if let Some(c) = capture { + let mut c = c.borrow_mut(); + let p = c.pressure.get_or_insert_with(|| PressureFacts { + selected: String::new(), + binding: None, + prediction_called: false, + support: None, + rejection: None, + rhs_sha256: None, + candidate: None, + accepted: None, + pressure_call_ns: None, + residual_l2_limit: None, + }); + p.selected = report.selected.into(); + p.rejection = report.rejection.as_ref().map(|r| format!("{r:?}")); + p.candidate = report.candidate; + p.accepted = Some(report.accepted); + p.pressure_call_ns = u64::try_from(report.total.as_nanos()).ok(); + drop(c); + } +} + +pub(crate) fn accepted(capture: &Capture) -> Arc { + let mut c = capture.borrow_mut(); + c.outcome = AttemptOutcome::Accepted; + c.publication = Some(c.attempted_generation); + c.nodes.push(NodeReceipt { + node: NodeKind::Publication, + status: NodeStatus::Accepted, + }); + Arc::new(c.clone()) +} + +/// Hash only the actual accepted native fields and identity. Provider request +/// RHS custody is separately observed at the pressure seam. No reconstruction. +pub(crate) fn input_digest(state: crate::LiquidTransportView<'_>) -> [u8; 32] { + let mut h = Sha256::new(); + h.update(b"rheon-workflow-native-input-v1\0"); + h.update(state.carrier.generation.to_le_bytes()); + h.update(state.carrier.time.to_bits().to_le_bytes()); + for stamp in [state.carrier_stamp, state.liquid.stamp] { + h.update(stamp.id.to_le_bytes()); + h.update(stamp.version.to_le_bytes()); + } + h.update(state.liquid.time.to_bits().to_le_bytes()); + h.update(state.liquid.density.to_bits().to_le_bytes()); + for values in [ + state.carrier.x, + state.carrier.y, + state.carrier.z, + state.carrier.tracer, + ] { + h.update((values.len() as u64).to_le_bytes()); + for value in values { + h.update(value.to_bits().to_le_bytes()); + } + } + for values in [state.pressure, state.liquid.fraction] { + h.update((values.len() as u64).to_le_bytes()); + for value in values { + h.update(value.to_bits().to_le_bytes()); + } + } + h.finalize().into() +} + +#[cfg(test)] +mod tests; + +/// Canonical actual call controls, not a frozen-intent inference. +pub(crate) fn request_digest(inputs: crate::LiquidStepInputs<'_>) -> [u8; 32] { + let mut h = Sha256::new(); + h.update(b"rheon-workflow-call-input-v1\0"); + h.update(inputs.requested_dt.to_bits().to_le_bytes()); + h.update((inputs.forces.len() as u64).to_le_bytes()); + for force in inputs.forces { + h.update([match force.units { + crate::ForceUnits::Acceleration => 0, + crate::ForceUnits::ForceDensity => 1, + }]); + for v in force.value { + h.update(v.to_bits().to_le_bytes()); + } + h.update([u8::from(force.region.is_some())]); + if let Some(r) = force.region { + for v in r.lower.into_iter().chain(r.upper) { + h.update(v.to_bits().to_le_bytes()); + } + } + } + h.update([u8::from(inputs.smoke_source.is_some())]); + if let Some(s) = inputs.smoke_source { + for v in s + .lower + .into_iter() + .chain(s.upper) + .chain([s.tracer_rate, s.vertical_acceleration]) + { + h.update(v.to_bits().to_le_bytes()); + } + } + let inlet = inputs.inlet; + h.update(inlet.stamp().id.to_le_bytes()); + h.update(inlet.stamp().version.to_le_bytes()); + for v in inlet.fractions().into_iter().flatten().chain([ + inputs.volume.max_outward_courant, + inputs.volume.actual_divergence_limit, + ]) { + h.update(v.to_bits().to_le_bytes()); + } + h.update([u8::from(inputs.source.is_some())]); + if let Some(source) = inputs.source { + let (stamp, rates) = source.workflow_parts(); + h.update(stamp.id.to_le_bytes()); + h.update(stamp.version.to_le_bytes()); + h.update((rates.len() as u64).to_le_bytes()); + for v in rates { + h.update(v.to_bits().to_le_bytes()); + } + } + h.finalize().into() +} +pub(crate) fn pressure_requested(capture: Option<&Capture>, rhs: &[f64]) { + if let Some(trace) = capture { + let mut h = Sha256::new(); + for v in rhs { + h.update(v.to_bits().to_le_bytes()); + } + trace.borrow_mut().pressure = Some(PressureFacts { + selected: String::new(), + binding: None, + prediction_called: false, + support: None, + rejection: None, + rhs_sha256: Some(h.finalize().into()), + candidate: None, + accepted: None, + pressure_call_ns: None, + residual_l2_limit: None, + }); + complete( + Some(trace), + NodeKind::PressureRequest, + NodeStatus::Completed, + ); + } +} diff --git a/src/workflow/tests.rs b/src/workflow/tests.rs new file mode 100644 index 00000000..bcb7e66c --- /dev/null +++ b/src/workflow/tests.rs @@ -0,0 +1,479 @@ +use super::*; +use crate::solver_provider::{ + ProviderRejection, + configured::{ContextPressureProvider, ContextPressureRequest}, +}; +use crate::*; +use std::sync::Arc; + +const CAP: usize = 16 * 1024 * 1024; +fn fixture(edge: usize, run_id: u64) -> (SimulationSession, ProviderStepWorkspace) { + fixture_fraction(edge, run_id, 1.0) +} +fn fixture_fraction( + edge: usize, + run_id: u64, + fraction: f64, +) -> (SimulationSession, ProviderStepWorkspace) { + let grid = GridGeometry::new([edge as u64; 3], [1.0 / edge as f64; 3], [0.0; 3]).unwrap(); + let config = LiquidTransportConfig { + carrier: SimulationConfig { + density: 998.2, + memory_limit: CAP, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 2000, + }, + actual_divergence_limit: 1e-5, + max_courant: 1.0, + }, + represented_density: 998.2, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + }; + let workspace = + ProviderStepWorkspace::new(&grid, 998.2, CAP, PressureImplementation::JacobiPcgV1).unwrap(); + ( + SimulationSession::new( + SessionIdentity { + run_id, + source_revision: "workflow-fixture".into(), + }, + grid, + config, + PressureImplementation::JacobiPcgV1, + vec![fraction; edge.pow(3)], + CAP, + 1000, + ) + .unwrap(), + workspace, + ) +} +fn inputs(forces: &[BodyForce], dt: f64) -> LiquidStepInputs<'_> { + LiquidStepInputs { + requested_dt: dt, + smoke_source: None, + forces, + source: None, + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]).unwrap(), + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + } +} +struct FixtureProvider { + reject_support: bool, + invalid_output: bool, +} +impl ContextPressureProvider for FixtureProvider { + fn identity(&self) -> Arc { + Arc::new(ContextProviderIdentity { + id: "classical-zero-fixture".into(), + version: "1".into(), + manifest_sha256: [3; 32], + checkpoint_sha256: None, + training_run_id: None, + runtime: "native-test".into(), + source_revision: "workflow-test".into(), + }) + } + fn supports(&self, _: &ContextPressureRequest<'_>) -> Result<(), ProviderRejection> { + if self.reject_support { + Err(ProviderRejection::Unsupported("fixture support refusal")) + } else { + Ok(()) + } + } + fn predict( + &mut self, + _: &ContextPressureRequest<'_>, + output: &mut [f64], + _: &mut dyn FnMut() -> bool, + ) -> Result<(), ProviderRejection> { + output.fill(if self.invalid_output { f64::NAN } else { 0.0 }); + Ok(()) + } +} + +#[test] +fn observed_candidate_fallback_and_applied_zero_are_real_owner_facts() { + for (reject_support, invalid_output) in [(false, false), (true, false), (false, true)] { + let (mut session, mut workspace) = fixture(3, 10); + let mut viscosity = + ViscosityWorkspace::new(session.snapshot().grid().clone(), CAP).unwrap(); + let mut provider = FixtureProvider { + reject_support, + invalid_output, + }; + let mut evidence = None; + let (_, report) = session + .step_with_configured_pressure_observed( + inputs(&[], 0.03125), + &mut workspace, + Some((&mut viscosity, 0.0)), + Some(&mut provider), + None, + |_| false, + 7, + &mut evidence, + ) + .unwrap(); + let evidence = evidence.unwrap(); + evidence.validate().unwrap(); + assert_eq!(evidence.run_id, 10); + assert_eq!(evidence.attempt_id, 7); + assert_eq!(evidence.accepted_generation, 0); + assert_eq!(evidence.publication, Some(1)); + assert_eq!(evidence.descriptor.viscosity, Some(0.0)); + let p = evidence.pressure.as_ref().unwrap(); + assert_eq!(p.binding.as_ref().unwrap().id, "classical-zero-fixture"); + assert_eq!(p.support, Some(!reject_support)); + assert_eq!(p.prediction_called, !reject_support); + assert_eq!(p.rejection.is_some(), reject_support || invalid_output); + assert_eq!(p.selected, report.pressure.selected); + assert!(p.rhs_sha256.is_some()); + assert_eq!( + evidence + .nodes + .iter() + .any(|n| n.node == NodeKind::NativeFallback), + reject_support || invalid_output + ); + } +} + +#[test] +fn cancellation_before_provider_after_return_and_before_commit_never_publishes() { + let stops = [ + LiquidStepStage::Carrier(StepStage::BeforeAdvection), + LiquidStepStage::Carrier(StepStage::BeforeProjectionAcceptance), + LiquidStepStage::BeforeCommit, + ]; + for (index, stop) in stops.into_iter().enumerate() { + let (mut session, mut workspace) = fixture(3, 11); + let before = input_digest(session.snapshot().state()); + let mut provider = FixtureProvider { + reject_support: false, + invalid_output: false, + }; + let mut evidence = None; + assert!( + session + .step_with_configured_pressure_observed( + inputs(&[], 0.02), + &mut workspace, + None, + Some(&mut provider), + None, + |stage| stage == stop, + index as u64 + 1, + &mut evidence + ) + .is_err() + ); + let evidence = evidence.unwrap(); + evidence.validate().unwrap(); + assert_eq!(evidence.outcome, AttemptOutcome::Cancelled); + assert_eq!(evidence.publication, None); + assert_eq!(evidence.accepted_generation, 0); + assert_eq!(evidence.attempted_generation, 1); + assert_eq!(evidence.input_sha256, before); + assert_eq!(input_digest(session.snapshot().state()), before); + assert!( + !evidence + .nodes + .iter() + .any(|n| n.node == NodeKind::Publication) + ); + if index == 0 { + assert!(evidence.pressure.is_none()); + } else { + assert!(evidence.pressure.as_ref().unwrap().accepted.is_some()); + } + } +} + +#[test] +fn actual_shortened_interval_and_native_trajectory_match_existing_pressure_path() { + let (mut observed, mut ow) = fixture_fraction(4, 12, 0.5); + let (mut baseline, mut bw) = fixture_fraction(4, 13, 0.5); + let forces = [BodyForce { + value: [2.0, 0.0, 0.0], + units: ForceUnits::Acceleration, + region: None, + }]; + let mut descriptor = None; + for index in 1..=4 { + let mut evidence = None; + let (report, _) = observed + .step_with_configured_pressure_observed( + inputs(&forces, 1.0), + &mut ow, + None, + None, + None, + |_| false, + index, + &mut evidence, + ) + .unwrap(); + baseline + .step_with_pressure_provider(inputs(&forces, 1.0), &mut bw, None, None, |_| false) + .unwrap(); + let evidence = evidence.unwrap(); + evidence.validate().unwrap(); + assert!(report.carrier.step.dt < 1.0); + assert_eq!( + evidence.actual_dt.unwrap().to_bits(), + report.carrier.step.dt.to_bits() + ); + assert_eq!( + input_digest(observed.snapshot().state()), + input_digest(baseline.snapshot().state()) + ); + if let Some(previous) = descriptor { + assert_eq!(evidence.descriptor_sha256, previous); + } + descriptor = Some(evidence.descriptor_sha256); + } +} + +#[test] +fn descriptor_digest_changes_only_with_actual_composition_and_invalid_binding_is_rejected() { + let (mut session, mut workspace) = fixture(3, 14); + let mut evidence = None; + session + .step_with_configured_pressure_observed( + inputs(&[], 0.01), + &mut workspace, + None, + None, + None, + |_| false, + 1, + &mut evidence, + ) + .unwrap(); + let evidence = evidence.unwrap(); + let mut changed = (*evidence).clone(); + changed.descriptor.viscosity = Some(0.0); + assert_ne!(changed.descriptor.digest(), evidence.descriptor_sha256); + assert_eq!(changed.validate(), Err("workflow descriptor digest")); + let mut changed = (*evidence).clone(); + changed.publication = Some(2); + assert_eq!(changed.validate(), Err("workflow publication association")); + let mut changed = (*evidence).clone(); + changed.nodes.resize( + MAX_NODES + 1, + NodeReceipt { + node: NodeKind::Geometry, + status: NodeStatus::Completed, + }, + ); + assert_eq!(changed.validate(), Err("workflow attempt association")); +} + +#[test] +fn in_stage_cancellation_and_invalid_attempt_id_preserve_exact_terminal_facts() { + let (mut session, mut workspace) = fixture(3, 21); + let mut evidence = None; + let result = session.step_with_configured_pressure_observed( + inputs(&[], 0.01), + &mut workspace, + None, + None, + None, + |stage| stage == LiquidStepStage::Carrier(StepStage::PressureIteration), + 1, + &mut evidence, + ); + assert!(matches!( + result, + Err(SessionError::Step(LiquidStepError::Carrier( + SimulationError::Pressure(PressureError::Cancelled { .. }) + ))) + )); + let trace = evidence.unwrap(); + trace.validate().unwrap(); + assert_eq!(trace.outcome, AttemptOutcome::Cancelled); + assert!(trace.pressure.as_ref().unwrap().rhs_sha256.is_some()); + let mut viscosity = ViscosityWorkspace::new(session.snapshot().grid().clone(), CAP).unwrap(); + let mut evidence = None; + assert!( + session + .step_with_configured_pressure_observed( + inputs(&[], 0.01), + &mut workspace, + Some((&mut viscosity, 0.001002)), + None, + None, + |stage| matches!(stage, LiquidStepStage::Carrier(StepStage::Viscosity(_))), + 2, + &mut evidence + ) + .is_err() + ); + let trace = evidence.unwrap(); + trace.validate().unwrap(); + assert_eq!(trace.outcome, AttemptOutcome::Cancelled); + let mut evidence = None; + assert!( + session + .step_with_configured_pressure_observed( + inputs(&[], 0.01), + &mut workspace, + None, + None, + None, + |_| false, + 0, + &mut evidence + ) + .is_err() + ); + assert!(evidence.is_none()); + assert_eq!(session.snapshot().state().carrier.generation, 0); +} + +#[test] +fn dispatch_cancellation_retains_candidate_return_qualification_and_fallback_start_separately() { + for stop in [2, 3, 4] { + let (mut session, mut workspace) = fixture(3, 22); + let mut provider = FixtureProvider { + reject_support: false, + invalid_output: true, + }; + let mut calls = 0; + let mut evidence = None; + assert!( + session + .step_with_configured_pressure_observed( + inputs(&[], 0.01), + &mut workspace, + None, + Some(&mut provider), + None, + |stage| { + if stage == LiquidStepStage::Carrier(StepStage::PressureIteration) { + calls += 1; + calls == stop + } else { + false + } + }, + 1, + &mut evidence + ) + .is_err() + ); + let trace = evidence.unwrap(); + trace.validate().unwrap(); + assert_eq!(trace.outcome, AttemptOutcome::Cancelled); + assert!( + trace + .nodes + .iter() + .any(|n| n.node == NodeKind::PressureCandidate + && n.status == NodeStatus::CandidateReturned) + ); + assert_eq!( + trace + .nodes + .iter() + .any(|n| n.node == NodeKind::PressureQualification), + stop >= 3 + ); + assert_eq!( + trace + .nodes + .iter() + .any(|n| n.node == NodeKind::NativeFallback && n.status == NodeStatus::Started), + stop >= 4 + ); + assert!( + !trace + .nodes + .iter() + .any(|n| n.node == NodeKind::NativeFallback && n.status == NodeStatus::Selected) + ); + assert!(trace.publication.is_none()); + } +} + +#[test] +fn corrupted_prefixes_and_request_controls_are_detected() { + let (mut session, mut workspace) = fixture(3, 23); + let mut evidence = None; + session + .step_with_configured_pressure_observed( + inputs(&[], 0.01), + &mut workspace, + None, + None, + None, + |_| false, + 1, + &mut evidence, + ) + .unwrap(); + let trace = evidence.unwrap(); + let mut forged = (*trace).clone(); + forged.nodes = vec![NodeReceipt { + node: NodeKind::Publication, + status: NodeStatus::Accepted, + }]; + assert!(forged.validate().is_err()); + let mut forged = (*trace).clone(); + forged.nodes.swap(2, 3); + assert_eq!(forged.validate(), Err("workflow execution ordering")); + let mut forged = (*trace).clone(); + forged.pressure = None; + assert_eq!( + forged.validate(), + Err("workflow pressure request association") + ); + let mut forged = (*trace).clone(); + forged.outcome = AttemptOutcome::Cancelled; + forged.publication = None; + forged.actual_divergence_max = None; + forged.nodes.truncate( + forged + .nodes + .iter() + .position(|n| n.node == NodeKind::PressureRequest) + .unwrap() + + 1, + ); + assert_eq!( + forged.validate(), + Err("workflow pressure diagnostic stage association") + ); + assert!(trace.matches_request(inputs(&[], 0.01))); + let forces = [BodyForce { + value: [1.0, 0.0, 0.0], + units: ForceUnits::Acceleration, + region: None, + }]; + assert!(!trace.matches_request(inputs(&forces, 0.01))); + let rates = [0.0; 27]; + let mut source = inputs(&[], 0.01); + source.source = + Some(LiquidVolumeSource::new(VolumeStamp { id: 7, version: 0 }, &rates).unwrap()); + assert_ne!(request_digest(source), trace.request_sha256); + let mut changed = inputs(&[], 0.01); + changed.volume.actual_divergence_limit = 1e-6; + assert!(!trace.matches_request(changed)); + let edges = trace.descriptor.edges(); + assert!(edges.iter().any(|e| e.from == NodeKind::Projection + && e.to == NodeKind::VolumeTransport + && e.port == PortKind::FaceVelocity)); + assert!( + !edges + .iter() + .any(|e| e.from == NodeKind::TracerTransport && e.to == NodeKind::VolumeTransport) + ); +} diff --git a/tests/grid_coupled_reference_contract.rs b/tests/grid_coupled_reference_contract.rs new file mode 100644 index 00000000..66e8e65b --- /dev/null +++ b/tests/grid_coupled_reference_contract.rs @@ -0,0 +1,3 @@ +#[allow(dead_code)] +#[path = "../examples/grid_coupled_reference.rs"] +mod verification; diff --git a/tests/grid_cut_coupled_reference_contract.rs b/tests/grid_cut_coupled_reference_contract.rs new file mode 100644 index 00000000..37552196 --- /dev/null +++ b/tests/grid_cut_coupled_reference_contract.rs @@ -0,0 +1,3 @@ +#[allow(dead_code)] +#[path = "../examples/grid_cut_coupled_reference.rs"] +mod verification; diff --git a/tests/grid_cut_variational_reference_contract.rs b/tests/grid_cut_variational_reference_contract.rs new file mode 100644 index 00000000..8da5ae42 --- /dev/null +++ b/tests/grid_cut_variational_reference_contract.rs @@ -0,0 +1,3 @@ +#[allow(dead_code)] +#[path = "../examples/grid_cut_variational_reference.rs"] +mod verification; diff --git a/tests/grid_geometry_reference_contract.rs b/tests/grid_geometry_reference_contract.rs new file mode 100644 index 00000000..500c55d9 --- /dev/null +++ b/tests/grid_geometry_reference_contract.rs @@ -0,0 +1,3 @@ +#[allow(dead_code)] +#[path = "../examples/grid_geometry_reference.rs"] +mod verification; diff --git a/tests/grid_static_mms_reference_contract.rs b/tests/grid_static_mms_reference_contract.rs new file mode 100644 index 00000000..db4771db --- /dev/null +++ b/tests/grid_static_mms_reference_contract.rs @@ -0,0 +1,3 @@ +#[allow(dead_code)] +#[path = "../examples/grid_static_mms_reference.rs"] +mod preparation; diff --git a/tests/grid_verification_contract.rs b/tests/grid_verification_contract.rs new file mode 100644 index 00000000..766ffb16 --- /dev/null +++ b/tests/grid_verification_contract.rs @@ -0,0 +1,3 @@ +#[allow(dead_code)] +#[path = "../examples/grid_verification.rs"] +mod verification; diff --git a/tests/liquid_volume_periodic_contract.rs b/tests/liquid_volume_periodic_contract.rs new file mode 100644 index 00000000..7640b356 --- /dev/null +++ b/tests/liquid_volume_periodic_contract.rs @@ -0,0 +1,151 @@ +use rheon::{ + Axis, GridGeometry, LiquidFlowInterval, LiquidInlet, LiquidVolumeError, LiquidVolumeSettings, + LiquidVolumeSource, LiquidVolumeState, VolumeStage, VolumeStamp, +}; +fn stamp(id: u64) -> VolumeStamp { + VolumeStamp { id, version: 0 } +} +fn settings() -> LiquidVolumeSettings { + LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 0.0, + } +} +fn fields(g: &GridGeometry, u: [f32; 3]) -> [Vec; 3] { + std::array::from_fn(|d| vec![u[d]; g.face_len([Axis::X, Axis::Y, Axis::Z][d])]) +} +#[test] +fn periodic_matches_independent_multiaxis_upwind_and_retains_boundary_identity() { + let g = GridGeometry::new([2, 2, 2], [0.5; 3], [0.0; 3]).unwrap(); + let initial = vec![0.0, 0.25, 0.5, 1.0, 0.75, 0.125, 0.625, 0.875]; + let mut state = + LiquidVolumeState::new(g.clone(), 998.2, stamp(1), initial.clone(), 1 << 20).unwrap(); + let u = fields(&g, [0.25, -0.125, 0.0625]); + let dt = 0.25; + let flow = LiquidFlowInterval::new(&g, stamp(2), [&u[0], &u[1], &u[2]], 0.0, dt).unwrap(); + let r = state + .advance_periodic(flow, stamp(9), None, settings(), |_| false) + .unwrap(); + for k in 0..2 { + for j in 0..2 { + for i in 0..2 { + let p = [i, j, k]; + let idx = i + 2 * j + 4 * k; + let mut exact = initial[idx]; + for d in 0..3 { + let mut donor = p; + donor[d] = 1 - p[d]; + let q = donor[0] + 2 * donor[1] + 4 * donor[2]; + let c = dt * f64::from([0.25_f32, -0.125, 0.0625][d]).abs() / 0.5; + exact += c * (initial[q] - initial[idx]); + } + assert!((state.state().fraction[idx] - exact).abs() < 1e-14); + } + } + } + assert!(r.periodic); + assert_eq!(r.inlet, stamp(9)); + assert_eq!(r.inward_boundary_volume, 0.0); + assert_eq!(r.outward_boundary_volume, 0.0); + assert!(r.volume_balance_error.abs() < 1e-14); +} +#[test] +fn one_cell_periodic_seams_cancel_and_source_is_not_boundary_flux() { + let g = GridGeometry::new([1; 3], [1.0; 3], [0.0; 3]).unwrap(); + let mut state = LiquidVolumeState::new(g.clone(), 2.0, stamp(1), vec![0.25], 1 << 20).unwrap(); + let u = fields(&g, [-0.5, 0.25, -0.125]); + let flow = LiquidFlowInterval::new(&g, stamp(2), [&u[0], &u[1], &u[2]], 0.0, 0.25).unwrap(); + let rate = [0.5]; + let source = LiquidVolumeSource::new(stamp(3), &rate).unwrap(); + let r = state + .advance_periodic(flow, stamp(4), Some(source), settings(), |_| false) + .unwrap(); + assert_eq!(state.state().fraction, [0.375]); + assert_eq!(r.source_volume, 0.125); + assert_eq!(r.volume_balance_error, 0.0); + assert_eq!(r.inward_boundary_volume + r.outward_boundary_volume, 0.0); +} +#[test] +fn seam_mismatch_and_every_cancellation_stage_preserve_accepted_state() { + let g = GridGeometry::new([2; 3], [0.5; 3], [0.0; 3]).unwrap(); + let mut state = + LiquidVolumeState::new(g.clone(), 998.2, stamp(1), vec![0.5; 8], 1 << 20).unwrap(); + let before = state.state().fraction.to_vec(); + let mut u = fields(&g, [0.25, 0.0, 0.0]); + u[0][g.face_index(Axis::X, [2, 0, 0]).unwrap()] = 0.125; + let flow = LiquidFlowInterval::new(&g, stamp(2), [&u[0], &u[1], &u[2]], 0.0, 0.25).unwrap(); + assert!(matches!( + state.advance_periodic(flow, stamp(3), None, settings(), |_| false), + Err(LiquidVolumeError::PeriodicVelocityMismatch { axis: Axis::X, .. }) + )); + assert_eq!(state.state().fraction, before); + assert_eq!(state.state().time, 0.0); + u[0].fill(0.25); + for stage in [ + VolumeStage::BeforeFlux, + VolumeStage::FaceFluxSlice, + VolumeStage::CellUpdateSlice, + VolumeStage::BeforeCommit, + ] { + let flow = LiquidFlowInterval::new(&g, stamp(2), [&u[0], &u[1], &u[2]], 0.0, 0.25).unwrap(); + assert!( + matches!(state.advance_periodic(flow,stamp(3),None,settings(),|s|s==stage),Err(LiquidVolumeError::Cancelled{stage:s}) if s==stage) + ); + assert_eq!(state.state().fraction, before); + assert_eq!(state.state().time, 0.0); + assert_eq!(state.state().stamp, stamp(1)); + } + let flow = LiquidFlowInterval::new(&g, stamp(2), [&u[0], &u[1], &u[2]], 0.0, 10.0).unwrap(); + assert!(matches!( + state.advance_periodic(flow, stamp(3), None, settings(), |_| false), + Err(LiquidVolumeError::CourantLimit { .. }) + )); + assert_eq!(state.state().fraction, before); +} +#[test] +fn original_box_policy_remains_explicitly_nonperiodic() { + let g = GridGeometry::new([1; 3], [1.0; 3], [0.0; 3]).unwrap(); + let mut state = LiquidVolumeState::new(g.clone(), 1.0, stamp(1), vec![0.0], 1 << 20).unwrap(); + let u = fields(&g, [0.5, 0.0, 0.0]); + let flow = LiquidFlowInterval::new(&g, stamp(2), [&u[0], &u[1], &u[2]], 0.0, 0.25).unwrap(); + let inlet = LiquidInlet::new(stamp(3), [[1.0, 0.0], [0.0; 2], [0.0; 2]]).unwrap(); + let r = state + .advance(flow, inlet, None, settings(), |_| false) + .unwrap(); + assert!(!r.periodic); + assert_eq!(r.inlet, stamp(3)); + assert_eq!(r.inward_boundary_volume, 0.125); + assert_eq!(state.state().fraction, [0.125]); +} +#[test] +fn three_cell_impulse_distinguishes_each_periodic_donor_direction() { + for d in 0..3 { + for sign in [-1.0_f32, 1.0] { + let mut counts = [1; 3]; + counts[d] = 3; + let mut spacing = [1.0; 3]; + spacing[d] = 1.0 / 3.0; + let g = GridGeometry::new(counts, spacing, [0.0; 3]).unwrap(); + let mut state = + LiquidVolumeState::new(g.clone(), 1.0, stamp(1), vec![1.0, 0.0, 0.0], 1 << 20) + .unwrap(); + let mut speed = [0.0; 3]; + speed[d] = sign; + let u = fields(&g, speed); + let flow = + LiquidFlowInterval::new(&g, stamp(2), [&u[0], &u[1], &u[2]], 0.0, spacing[d] * 0.5) + .unwrap(); + state + .advance_periodic(flow, stamp(3), None, settings(), |_| false) + .unwrap(); + let exact = if sign > 0.0 { + [0.5, 0.5, 0.0] + } else { + [0.5, 0.0, 0.5] + }; + for (a, b) in state.state().fraction.iter().zip(exact) { + assert!((a - b).abs() < 1e-14); + } + } + } +} diff --git a/tests/material_partition_gate_contract.rs b/tests/material_partition_gate_contract.rs new file mode 100644 index 00000000..68fc9d9e --- /dev/null +++ b/tests/material_partition_gate_contract.rs @@ -0,0 +1,3 @@ +#[allow(dead_code)] +#[path = "../examples/material_partition_gate.rs"] +mod selection; diff --git a/tests/particle_adjoint_selection_contract.rs b/tests/particle_adjoint_selection_contract.rs new file mode 100644 index 00000000..7ce1caa0 --- /dev/null +++ b/tests/particle_adjoint_selection_contract.rs @@ -0,0 +1,3 @@ +#[allow(dead_code)] +#[path = "../examples/particle_adjoint_selection.rs"] +mod selection; diff --git a/tests/particle_planar_selection_contract.rs b/tests/particle_planar_selection_contract.rs new file mode 100644 index 00000000..cbd76b66 --- /dev/null +++ b/tests/particle_planar_selection_contract.rs @@ -0,0 +1,5 @@ +//! Run the experiment's focused numerical contracts in ordinary CI discovery. +//! The included CLI driver is intentionally unused in this test adapter. +#[allow(dead_code)] +#[path = "../examples/particle_planar_selection.rs"] +mod selection; diff --git a/tests/projection_session_contract.rs b/tests/projection_session_contract.rs new file mode 100644 index 00000000..8c427202 --- /dev/null +++ b/tests/projection_session_contract.rs @@ -0,0 +1,536 @@ +//! Actual integrated native projection substitution, not independent array calls. +use rheon::{projection_step::*, *}; +use std::sync::Arc; + +const CAP: usize = 16 * 1024 * 1024; +const FORCE: [BodyForce; 1] = [BodyForce { + value: [0.001, 0.0, 0.0], + units: ForceUnits::Acceleration, + region: None, +}]; + +fn config() -> LiquidTransportConfig { + LiquidTransportConfig { + carrier: SimulationConfig { + density: 998.2, + memory_limit: CAP, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 2000, + }, + actual_divergence_limit: 1e-5, + max_courant: 1.0, + }, + represented_density: 998.2, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + } +} + +fn identity() -> SessionIdentity { + SessionIdentity { + run_id: 101, + source_revision: "c1b2-frozen-integrated-reference".into(), + } +} + +fn inputs() -> LiquidStepInputs<'static> { + LiquidStepInputs { + requested_dt: 0.001, + smoke_source: None, + forces: &FORCE, + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]).unwrap(), + source: None, + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + } +} + +fn f32_bits(values: &[f32]) -> Vec { + values.iter().map(|v| v.to_bits()).collect() +} +fn f64_bits(values: &[f64]) -> Vec { + values.iter().map(|v| v.to_bits()).collect() +} +fn assert_native_equal(a: &SessionSnapshot<'_>, b: &SessionSnapshot<'_>) { + let x = a.state(); + let y = b.state(); + assert_eq!(a.identity(), b.identity()); + assert_eq!(a.frame(), b.frame()); + assert_eq!(a.stage(), b.stage()); + assert_eq!( + a.accepted_interval_start().map(f64::to_bits), + b.accepted_interval_start().map(f64::to_bits) + ); + for (left, right) in [ + (x.carrier.x, y.carrier.x), + (x.carrier.y, y.carrier.y), + (x.carrier.z, y.carrier.z), + (x.carrier.tracer, y.carrier.tracer), + ] { + assert_eq!(f32_bits(left), f32_bits(right)); + } + assert_eq!(f64_bits(x.pressure), f64_bits(y.pressure)); + assert_eq!(f64_bits(x.liquid.fraction), f64_bits(y.liquid.fraction)); + assert_eq!(x.carrier.time.to_bits(), y.carrier.time.to_bits()); + assert_eq!(x.carrier.generation, y.carrier.generation); + assert_eq!(x.carrier_stamp, y.carrier_stamp); + assert_eq!(x.liquid.time.to_bits(), y.liquid.time.to_bits()); + assert_eq!(x.liquid.stamp, y.liquid.stamp); + assert_eq!(x.liquid.density.to_bits(), y.liquid.density.to_bits()); + assert!(x.pressure_surface.is_none() && y.pressure_surface.is_none()); + assert!(x.pressure_columns.is_none() && y.pressure_columns.is_none()); + assert!(x.reconstructed_surface.is_none() && y.reconstructed_surface.is_none()); + assert!(!x.flat_column_mac && !y.flat_column_mac); +} +fn diagnostics(report: PressureReport) -> (usize, [u64; 3]) { + ( + report.iterations, + [ + report.true_residual_l2.to_bits(), + report.true_residual_max.to_bits(), + report.predicted_divergence_max.to_bits(), + ], + ) +} +fn assert_reports(a: LiquidStepReport, b: LiquidStepReport) { + let x = a.carrier.step; + let y = b.carrier.step; + assert_eq!(x.generation, y.generation); + assert_eq!(diagnostics(x.pressure), diagnostics(y.pressure)); + assert_eq!( + [ + x.dt, + x.time, + x.actual_divergence_max, + x.courant, + x.tracer_integral, + x.kinetic_energy + ] + .map(f64::to_bits), + [ + y.dt, + y.time, + y.actual_divergence_max, + y.courant, + y.tracer_integral, + y.kinetic_energy + ] + .map(f64::to_bits) + ); + assert_eq!(a.carrier.forces, b.carrier.forces); + // The native volume report has no wall-clock durations or workspace sizes. + assert_eq!(format!("{:?}", a.liquid), format!("{:?}", b.liquid)); + assert!(a.boundary.is_none() && b.boundary.is_none()); + assert!(a.viscosity.is_none() && b.viscosity.is_none()); +} + +#[test] +fn c1b2_one_hundred_actual_intervals_match_the_original_session_for_each_method() { + for method in PressureImplementation::ALL { + compare_one_hundred(method, method, ProjectionIntent::BuiltinNativeV1); + } +} + +#[test] +fn c1b3_one_hundred_selected_intervals_match_direct_producer_for_each_pair() { + for producer in PressureImplementation::ALL { + let fallback = other_method(producer); + compare_one_hundred( + producer, + fallback, + ProjectionIntent::ClassicalSelectionV1 { + producer, + producer_max_iterations: 2000, + }, + ); + } +} + +fn other_method(method: PressureImplementation) -> PressureImplementation { + PressureImplementation::ALL + .into_iter() + .find(|other| *other != method) + .unwrap() +} + +fn compare_one_hundred( + method: PressureImplementation, + fallback: PressureImplementation, + intent: ProjectionIntent, +) { + let grid = GridGeometry::new([16; 3], [1.0 / 16.0; 3], [0.0; 3]).unwrap(); + let mut direct = SimulationSession::new( + identity(), + grid.clone(), + config(), + method, + vec![0.5; grid.cell_len()], + CAP, + 100, + ) + .unwrap(); + let mut substituted = SimulationSession::new_with_projection( + identity(), + grid.clone(), + config(), + fallback, + vec![0.5; grid.cell_len()], + CAP, + 100, + intent, + ) + .unwrap(); + let mut native = ProviderStepWorkspace::new(&grid, 998.2, CAP, method).unwrap(); + let mut projection = match intent { + ProjectionIntent::BuiltinNativeV1 => { + ProjectionStepWorkspace::new(&grid, 998.2, CAP, fallback) + } + _ => ProjectionStepWorkspace::new_with_intent(&grid, 998.2, CAP, fallback, intent), + } + .unwrap(); + assert!(projection.allocated_bytes() <= CAP); + assert_native_equal(&direct.snapshot(), &substituted.snapshot()); + let mut previous_output = None; + for generation in 1..=100u64 { + let (expected, pressure) = direct + .step_with_pressure_provider(inputs(), &mut native, None, None, |_| false) + .unwrap(); + let accepted = substituted + .step_with_native_projection(inputs(), &mut projection, None, |_| false) + .unwrap(); + assert_eq!( + accepted.report.provider_workspace_array_bytes, + projection.allocated_bytes() + ); + assert!(Arc::ptr_eq( + &accepted.attempt, + substituted.snapshot().projection_attempt().unwrap() + )); + assert_native_equal(&direct.snapshot(), &substituted.snapshot()); + assert_reports(expected, accepted.report); + let attempt = &accepted.attempt; + assert_eq!( + substituted.snapshot().configuration().implementation, + fallback + ); + assert_eq!(attempt.intent, intent); + assert_eq!(attempt.version, intent.version()); + assert!(attempt.producer_failure.is_none()); + assert_eq!(attempt.producer.as_ref().unwrap().implementation, method); + assert_eq!( + attempt.selected_native.as_ref().unwrap().implementation, + method + ); + assert_eq!( + attempt.qualification.as_ref().unwrap().selection, + rheon::solver_provider::composition::projection::ProjectionSelection::SuppliedCandidate + ); + assert!( + attempt + .qualification + .as_ref() + .unwrap() + .native_fallback + .is_none() + ); + attempt + .validate(substituted.snapshot().configuration(), &grid) + .unwrap(); + assert_eq!(attempt.source, identity()); + assert_eq!(attempt.attempt_id, generation); + assert_eq!(attempt.accepted_generation, generation - 1); + assert_eq!(attempt.attempted_generation, Some(generation)); + assert_eq!(attempt.requested_dt.to_bits(), 0.001f64.to_bits()); + assert_eq!( + attempt.actual_dt.map(f64::to_bits), + Some(expected.carrier.step.dt.to_bits()) + ); + assert!(attempt.provisional_input_id.is_some()); + assert!(attempt.qualification.is_some()); + assert_eq!( + diagnostics(attempt.producer.as_ref().unwrap().pressure), + diagnostics(pressure.accepted) + ); + if let Some(prior) = previous_output { + assert_eq!(attempt.input_sha256, prior); + } + previous_output = Some(attempt.output_sha256.unwrap()); + } +} + +#[test] +fn c1b2_actual_shortened_interval_is_bound_and_matches_original_owner() { + for method in PressureImplementation::ALL { + compare_shortened(method, method, ProjectionIntent::BuiltinNativeV1); + } +} + +#[test] +fn c1b3_shortened_interval_binds_selected_producer_and_fallback() { + for producer in PressureImplementation::ALL { + compare_shortened( + producer, + other_method(producer), + ProjectionIntent::ClassicalSelectionV1 { + producer, + producer_max_iterations: 3000, + }, + ); + } +} + +fn compare_shortened( + method: PressureImplementation, + fallback: PressureImplementation, + intent: ProjectionIntent, +) { + let grid = GridGeometry::new([5; 3], [0.25; 3], [0.0; 3]).unwrap(); + let mut cfg = config(); + cfg.carrier.density = 2.0; + cfg.represented_density = 2.0; + cfg.carrier.max_courant = 1.0 / 128.0; + cfg.carrier.pressure = PressureSettings { + relative_residual: 1e-14, + absolute_residual: 1e-16, + divergence_limit: 1e-7, + max_iterations: 3000, + }; + let cap = 4 * 1024 * 1024; + cfg.carrier.memory_limit = cap; + let mut direct = SimulationSession::new( + identity(), + grid.clone(), + cfg, + method, + vec![1.0; grid.cell_len()], + cap, + 2, + ) + .unwrap(); + let mut substituted = SimulationSession::new_with_projection( + identity(), + grid.clone(), + cfg, + fallback, + vec![1.0; grid.cell_len()], + cap, + 2, + intent, + ) + .unwrap(); + let mut native = ProviderStepWorkspace::new(&grid, 2.0, cap, method).unwrap(); + let mut projection = match intent { + ProjectionIntent::BuiltinNativeV1 => { + ProjectionStepWorkspace::new(&grid, 2.0, cap, fallback) + } + _ => ProjectionStepWorkspace::new_with_intent(&grid, 2.0, cap, fallback, intent), + } + .unwrap(); + let forces = [BodyForce { + value: [0.125, 0.0625, 0.0625], + units: ForceUnits::Acceleration, + region: None, + }]; + let mut request = inputs(); + request.forces = &forces; + request.requested_dt = 2.0; + let (expected, _) = direct + .step_with_pressure_provider(request, &mut native, None, None, |_| false) + .unwrap(); + let accepted = substituted + .step_with_native_projection(request, &mut projection, None, |_| false) + .unwrap(); + assert!(accepted.report.carrier.step.dt < request.requested_dt); + assert_eq!( + accepted.attempt.actual_dt.map(f64::to_bits), + Some(expected.carrier.step.dt.to_bits()) + ); + assert_eq!(accepted.attempt.intent, intent); + assert_eq!( + accepted.attempt.producer.as_ref().unwrap().implementation, + method + ); + assert!(accepted.attempt.producer_failure.is_none()); + assert_eq!( + accepted + .attempt + .selected_native + .as_ref() + .unwrap() + .implementation, + method + ); + assert_reports(expected, accepted.report); + assert_native_equal(&direct.snapshot(), &substituted.snapshot()); +} + +#[test] +fn c1b2_legacy_entry_refusal_preserves_the_accepted_projection_receipt() { + let grid = GridGeometry::new([2; 3], [0.5; 3], [0.0; 3]).unwrap(); + let method = PressureImplementation::JacobiPcgV1; + let mut owner = SimulationSession::new_with_projection( + identity(), + grid.clone(), + config(), + method, + vec![0.5; grid.cell_len()], + CAP, + 4, + ProjectionIntent::BuiltinNativeV1, + ) + .unwrap(); + let mut projection = ProjectionStepWorkspace::new(&grid, 998.2, CAP, method).unwrap(); + let mut native = ProviderStepWorkspace::new(&grid, 998.2, CAP, method).unwrap(); + let first = owner + .step_with_native_projection(inputs(), &mut projection, None, |_| false) + .unwrap(); + let pressure_before = f64_bits(owner.snapshot().state().pressure); + assert!( + owner + .step_with_pressure_provider(inputs(), &mut native, None, None, |_| false) + .is_err() + ); + assert!( + owner + .step_with_configured_pressure(inputs(), &mut native, None, None, None, |_| false) + .is_err() + ); + let mut legacy = SimulationSession::new( + identity(), + grid.clone(), + config(), + method, + vec![0.5; grid.cell_len()], + CAP, + 1, + ) + .unwrap(); + let mut evidence = None; + legacy + .step_with_configured_pressure_observed( + inputs(), + &mut native, + None, + None, + None, + |_| false, + 1, + &mut evidence, + ) + .unwrap(); + assert!(evidence.is_some()); + assert!( + owner + .step_with_configured_pressure_observed( + inputs(), + &mut native, + None, + None, + None, + |_| false, + 2, + &mut evidence + ) + .is_err() + ); + assert!( + evidence.is_none(), + "a refused call must not expose an earlier G1 attempt" + ); + assert_eq!(owner.snapshot().frame(), 1); + assert_eq!(f64_bits(owner.snapshot().state().pressure), pressure_before); + let second = owner + .step_with_native_projection(inputs(), &mut projection, None, |_| false) + .unwrap(); + assert_eq!(second.attempt.accepted_generation, 1); + assert_eq!(second.attempt.attempt_id, first.attempt.attempt_id + 1); + assert!(!Arc::ptr_eq(&first.attempt, &second.attempt)); +} + +#[test] +fn c1b3_real_iteration_failure_fallback_matches_direct_fallback_for_both_pairs() { + use rheon::solver_provider::composition::projection::ProjectionSelection; + for producer in PressureImplementation::ALL { + let fallback = other_method(producer); + let intent = ProjectionIntent::ClassicalSelectionV1 { + producer, + producer_max_iterations: 1, + }; + let grid = GridGeometry::new([4; 3], [0.25; 3], [0.0; 3]).unwrap(); + let mut direct = SimulationSession::new( + identity(), + grid.clone(), + config(), + fallback, + vec![0.5; grid.cell_len()], + CAP, + 2, + ) + .unwrap(); + let mut substituted = SimulationSession::new_with_projection( + identity(), + grid.clone(), + config(), + fallback, + vec![0.5; grid.cell_len()], + CAP, + 2, + intent, + ) + .unwrap(); + let mut native = ProviderStepWorkspace::new(&grid, 998.2, CAP, fallback).unwrap(); + let mut projection = + ProjectionStepWorkspace::new_with_intent(&grid, 998.2, CAP, fallback, intent).unwrap(); + for generation in 1..=2 { + let (expected, _) = direct + .step_with_pressure_provider(inputs(), &mut native, None, None, |_| false) + .unwrap(); + let accepted = substituted + .step_with_native_projection(inputs(), &mut projection, None, |_| false) + .unwrap(); + assert_eq!(accepted.attempt.attempted_generation, Some(generation)); + assert!(accepted.attempt.producer.is_none()); + let failure = accepted + .attempt + .producer_failure + .as_ref() + .expect("frozen cap1 fixture must fail producer"); + assert_eq!(failure.implementation, producer); + assert!(matches!( + failure.failure, + ProjectionProducerFailure::IterationLimit { iterations: 1, .. } + )); + let qualification = accepted.attempt.qualification.as_ref().unwrap(); + assert_eq!(qualification.selection, ProjectionSelection::NativeBaseline); + assert!(qualification.rejection.is_none() && qualification.witness.is_none()); + assert_eq!( + qualification + .native_fallback + .as_ref() + .unwrap() + .implementation, + fallback + ); + assert_eq!( + accepted + .attempt + .selected_native + .as_ref() + .unwrap() + .implementation, + fallback + ); + accepted + .attempt + .validate(substituted.snapshot().configuration(), &grid) + .unwrap(); + assert_native_equal(&direct.snapshot(), &substituted.snapshot()); + assert_reports(expected, accepted.report); + } + } +} diff --git a/tests/recording_comparison_contract.rs b/tests/recording_comparison_contract.rs index 76a46690..dbfdb2ed 100644 --- a/tests/recording_comparison_contract.rs +++ b/tests/recording_comparison_contract.rs @@ -99,6 +99,103 @@ fn recipe(field: FieldRole) -> Recipe { fn available(a: &Selection, b: &Selection, role: FieldRole) -> FieldComparison { compare(a, b, recipe(role)).unwrap().outcome.unwrap() } + +#[test] +fn c1b2_actual_projection_fields_are_not_configured_or_carrier_comparison_evidence() { + use rheon::projection_step::{ProjectionIntent, ProjectionStepWorkspace}; + use rheon::{ + LiquidInlet, LiquidStepInputs, LiquidTransportConfig, LiquidVolumeSettings, + PressureSettings, SimulationSession, VolumeStamp, + }; + let cap = 4 * 1024 * 1024; + let grid = GridGeometry::new([2, 3, 4], [0.25, 0.5, 0.75], [-1.0, 2.0, 3.0]).unwrap(); + let method = PressureImplementation::JacobiPcgV1; + for intent in [ + ProjectionIntent::BuiltinNativeV1, + ProjectionIntent::ClassicalSelectionV1 { + producer: PressureImplementation::SymmetricGaussSeidelPcgV1, + producer_max_iterations: 2000, + }, + ] { + let mut owner = SimulationSession::new_with_projection( + SessionIdentity { + run_id: 8, + source_revision: "actual-projection-comparison-refusal".into(), + }, + grid.clone(), + LiquidTransportConfig { + carrier: SimulationConfig { + density: 1.0, + memory_limit: cap, + pressure: PressureSettings { + relative_residual: 1e-10, + absolute_residual: 1e-12, + divergence_limit: 1e-8, + max_iterations: 2000, + }, + actual_divergence_limit: 1e-5, + max_courant: 1.0, + }, + represented_density: 1.0, + volume_stamp: VolumeStamp { id: 1, version: 0 }, + carrier_id: 2, + }, + method, + vec![0.5; grid.cell_len()], + cap, + 1, + intent, + ) + .unwrap(); + let mut workspace = + ProjectionStepWorkspace::new_with_intent(&grid, 1.0, cap, method, intent).unwrap(); + let run = + projection::projection_run(&owner.snapshot(), "actual typed projection publication") + .unwrap(); + assert_eq!( + run.solver, + match intent { + ProjectionIntent::BuiltinNativeV1 => "rheon-native-projection-session-v1", + _ => "rheon-native-projection-selection-v1", + } + ); + owner + .step_with_native_projection( + LiquidStepInputs { + requested_dt: 0.01, + smoke_source: None, + forces: &[], + source: None, + inlet: LiquidInlet::new(VolumeStamp { id: 3, version: 0 }, [[0.0; 2]; 3]) + .unwrap(), + volume: LiquidVolumeSettings { + max_outward_courant: 1.0, + actual_divergence_limit: 1e-5, + }, + }, + &mut workspace, + None, + |_| false, + ) + .unwrap(); + let step = projection::projection_publication(&owner.snapshot(), 0, 1 << 20).unwrap(); + let new = Archive::new(run, &[step]); + drop(workspace); + drop(owner); + let (run, steps) = fixture(0.01, false); + let old = Archive::new(run, &steps); + assert_eq!( + native_samples(&new.select(0), FieldRole::Tracer), + Err(Unavailable::UnsupportedProfile) + ); + assert_eq!( + compare(&old.select(0), &new.select(0), recipe(FieldRole::Tracer)) + .unwrap() + .outcome, + Err(Unavailable::UnsupportedProfile) + ); + } +} fn field_mut<'a>(s: &'a mut RecordedStep, name: &str) -> &'a mut RecordedField { s.fields.iter_mut().find(|f| f.name == name).unwrap() } diff --git a/tests/saved_comparison_ui_contract.rs b/tests/saved_comparison_ui_contract.rs index 9bd1e99b..383b9d64 100644 --- a/tests/saved_comparison_ui_contract.rs +++ b/tests/saved_comparison_ui_contract.rs @@ -715,3 +715,36 @@ fn unavailable_native_fields_remain_verified_analysis_without_materialized_value assert_eq!(h.page.presentation(), Presentation::Verified); assert!(h.page.selected_pair().is_some()); } + +#[test] +fn legacy_comparison_workflows_keep_exact_sides_and_execution_evidence_unavailable() { + let root = Directory::new(); + fixture(&root.0); + let mut h = Harness::new(&root.0); + assert!( + h.page + .load_selected_workflow(Side::Reference) + .unwrap() + .is_none() + ); + h.click("open-manifest"); + h.click("compute"); + let reference = h + .page + .load_selected_workflow(Side::Reference) + .unwrap() + .unwrap(); + let candidate = h + .page + .load_selected_workflow(Side::Candidate) + .unwrap() + .unwrap(); + assert!(reference.key != candidate.key); + assert!(h.page.workflow_key(Side::Reference).as_ref() == Some(&reference.key)); + assert!(h.page.workflow_key(Side::Candidate).as_ref() == Some(&candidate.key)); + assert!(reference.key.side == Side::Reference && candidate.key.side == Side::Candidate); + assert_eq!(reference.run.identity.run_id, 41); + assert_eq!(candidate.run.identity.run_id, 42); + assert_eq!(reference.ordinal, candidate.ordinal); + assert!(reference.attempt.is_none() && candidate.attempt.is_none()); +} diff --git a/tools/test_column_interface_verifier.py b/tools/test_column_interface_verifier.py index da815024..ca9d9ae9 100644 --- a/tools/test_column_interface_verifier.py +++ b/tools/test_column_interface_verifier.py @@ -67,7 +67,9 @@ def steps(body): 'feature-contracts': ( ' name: Feature contracts (${{ matrix.mode }})\n' ' runs-on: ubuntu-24.04\n' - ' timeout-minutes: 30\n' + ' # Full ordinary desktop contracts exceeded the prior outer job budget.\n' + ' # Test commands, per-case bounds and all acceptance gates stay unchanged.\n' + ' timeout-minutes: 60\n' ' env:\n' " CARGO_BUILD_JOBS: '1'\n" ' strategy:\n' @@ -233,6 +235,17 @@ def test_split_ci_budget_rejects_removed_checks_and_early_success(self): self.assertIn(before,current) with self.assertRaises(ValueError): verify_split_ci_budget(frozen,current.replace(before,after)) + def test_feature_job_requires_exact_reviewed_outer_budget(self): + frozen=(ROOT/'evidence/column-interface-final-artifacts/trials/frozen-workflow.yml').read_text() + current=(ROOT/'.github/workflows/rust-rheon.yml').read_text() + verify_split_ci_budget(frozen,current) + feature=current.split(' feature-contracts:\n',1)[1].split(' executable-contracts:\n',1)[0] + self.assertEqual(feature.count(' timeout-minutes: 60\n'),1) + for budget in (30,59,61): + with self.subTest(budget=budget),self.assertRaisesRegex(ValueError,'runner/budget/matrix/dependencies: feature-contracts'): + verify_split_ci_budget(frozen,current.replace(' timeout-minutes: 60\n',f' timeout-minutes: {budget}\n',1)) + with self.assertRaisesRegex(ValueError,'runner/budget/matrix/dependencies: feature-contracts'): + verify_split_ci_budget(frozen,current.replace(' timeout-minutes: 60\n','',1)) def test_only_exact_reviewed_isolated_setup_and_additive_contracts_are_allowed(self): frozen=(ROOT/'evidence/column-interface-final-artifacts/trials/frozen-workflow.yml').read_text() current=(ROOT/'.github/workflows/rust-rheon.yml').read_text()