{"schema_version":1,"run_date":"2026-09-29","environment":"CPU; Python 3.10.20; float64 where stated","source_repository":"private; raw states retained locally","records":{"cantilever":{"model":"foundation untwisted rod, no contact","boundary":"nodes 0 and 1 clamped; zero gravity; lateral tip point load","config":{"length_m":1.0,"EA_n":1000.0,"B_n_m2":0.5,"loads_n":[0.005,0.01],"nodes":[7,10,13],"gravity_m_per_s2":0.0,"reference_length":"fixed node 1 to tip","node_mass_kg":0.01,"damping_n_s_per_m":0.2,"dt_s":0.0001,"max_steps":100000,"convergence_tolerance":1e-5,"fixed_nodes":[0,1],"point_load_node":"tip"},"runs":[{"nodes":7,"load_n":0.005,"raw_npz_sha256":"e03ee8aba4e19129079d18b285c8fc2225f1d20d72a7f7025d8041e6fe40020a","converged_step":9082,"tip_error_m":0.0006165160333986288,"accepted":true},{"nodes":10,"load_n":0.005,"raw_npz_sha256":"b0f71359e5de319f65a5acd42e636f04dca0150ae513dc645707e119d0f06464","converged_step":16633,"tip_error_m":0.00045499216535626946,"accepted":true},{"nodes":13,"load_n":0.005,"raw_npz_sha256":"cefb3b1fd5b8b68807ab92896aad0df94009e8522d0aabb3e8921a3dd8ec45e8","converged_step":22778,"tip_error_m":0.00035743305062344195,"accepted":true},{"nodes":7,"load_n":0.01,"raw_npz_sha256":"13c3bf5b4607d39b1630b4d93e3faf2d70a04ba19b4622c50478a181a0cee44e","converged_step":9602,"tip_error_m":0.001233660053811749,"accepted":true},{"nodes":10,"load_n":0.01,"raw_npz_sha256":"3391205cc1f70f14f0aa21e33e531f4975d9ba831e232fe764660867ad34df9b","converged_step":18178,"tip_error_m":0.0009120571911464094,"accepted":true},{"nodes":13,"load_n":0.01,"raw_npz_sha256":"1572c9e60a46066a39aee4b063d085c88b622123c22b5e0a6a4a99613ea58a3e","converged_step":25040,"tip_error_m":0.0007179591518298523,"accepted":true}],"acceptance":"solver converged; finite values; tip deflection <2% of effective length; final free-node speed and force residual below 1e-5","exporter":"tools/export_cantilever_evidence.py"},"straight_contact":{"model":"v4 analytic rigid straight tube, frictionless normal PI contact","boundary":"two fixed base nodes; prescribed tip displacement 90 mm; pulse seed 42","nodes":250,"requested_steps":20,"completed_steps":20,"raw_npz_sha256":"276825e3b6a0b700a42e15ba830333b97d5b705704b6ad64dad53d44418256c5","accepted_frame_indices":[4,7,9,11,13,15,17,19,21,23,25,27,29,31,35,38,41,43,45,47],"gates":{"free_speed_max_m_per_s":0.001,"newton_residual_max_n":1e-6,"protection_error_max_m":0.0005},"observed":{"max_free_speed_m_per_s":0.0009521492685025031,"newton_residual_n":4.380503858343008e-8,"max_protection_error_m":6.135672667755845e-5},"exporter":"tools/export_straight_contact_process.py","config":{"total_length_m":1.5,"num_nodes":250,"tube_radius_m":0.06,"safe_distance_m":0.01,"Kp":3000.0,"Ki":100.0,"dt_s":0.05,"pulse_seed":42,"pulse_nodes":[108,109,162,190],"pulse_magnitudes_n":[0.026405681633777295,0.04251929689477836,0.03853990121162906,0.0663382494424301],"pulse_duration_s":0.02,"ramp_mode":"adaptive","tip_total_displacement_m":0.09}},"curved_pair":{"model":"v4 analytic curved tube versus OBJ mesh, frictionless normal PI contact","boundary":"300 nodes; two fixed base nodes; prescribed tip displacement 120 mm; seed 7; CPU C++ backend","requested_steps":20,"completed_steps":20,"simulation_parameters":{"num_nodes":300,"num_load_steps":20,"tube_radius_m":0.06,"safe_distance_m":0.01,"protection_radius_m":0.05,"Kp":3500.0,"Ki":100.0,"dt_s":0.005,"tip_total_displacement_m":0.12,"pulse_seed":7,"backend":"cpp","device":"cpu","prebalance":true,"centerline":{"shape":"90-degree circular arc in the xz plane","length_m":1.5,"samples":800}},"raw_npz_sha256":{"analytic":"b8c0b0d1c9705546322c630e830c3d3fabed670673a94b01d48dbb6cc20820e8","mesh":"8df3da5b61cd83688abd794505cc751eb72cd4f5295dab69cf955054f1bb2f71"},"geometry_sha256":{"obj":"3f4e29c74c7d240cfc36231a63021a8f619cef22ee3fd4bca046679caac6266c","centerline_csv":"33856a6b632739e1b5b6a7872072e04b4778f893b71dbccfa224832c5d01ed61"},"accepted_frame_indices":{"analytic":[7,9,11,13,15,17,20,23,25,27,29,31,37,39,41,43,45,47,49,51],"mesh":[7,9,11,13,15,17,20,23,25,27,29,31,37,40,42,44,46,48,50,52]},"gates":{"max_free_node_speed_m_per_s":0.001,"newton_residual_n":1e-6,"max_protection_error_m":0.0005},"max_corresponding_node_difference_m":0.00014139273613040384,"exporter":"tools/export_curved_process.py","note":"regenerated raw NPZ hashes supersede absent originals; published final WebPs reproduced bitwise","reproduce_commands":{"analytic":"PYTHONPATH=src python rod_soft_contact_PI_dynamic_quasi_static_3d_v4.py --backend cpp --device cpu --contact-type curved-tube --num-nodes 300 --tube-radius 0.06 --safe-distance 0.01 --Kp 3500 --Ki 100 --dt 0.005 --tip-total-displacement 0.12 --num-load-steps 20 --pulse-seed 7 --prebalance --skip-animation --no-show --output-prefix portfolio_evidence/runs/curved_analytic","mesh":"PYTHONPATH=src python rod_soft_contact_PI_dynamic_quasi_static_3d_v4.py --backend cpp --device cpu --contact-type mesh --mesh-obj assets/geometry/arc90_L1p5m_xz_wallR60mm_protectionR50mm_64sides_axial256.obj --centerline-csv assets/geometry/arc90_L1p5m_xz_centerline_800.csv --num-nodes 300 --tube-radius 0.06 --safe-distance 0.01 --Kp 3500 --Ki 100 --dt 0.005 --tip-total-displacement 0.12 --num-load-steps 20 --pulse-seed 7 --prebalance --skip-animation --no-show --output-prefix portfolio_evidence/runs/curved_mesh"}},"free_insert":{"model":"standalone three-dimensional free-end straight-tube insertion with tangential friction","boundary":"leading end fully free; two rear prescribed actuator nodes; 360 mm advancement","comparison":{"adaptive_ki_caveat":"80/160 accepted paths changed effective Ki at different imposed displacements, so their difference does not isolate load-step size","comparison_type":"80/160 loading-path sensitivity at matched imposed displacement; not time or spatial-grid convergence","force_definition":"negative sum of axial reactions at both prescribed actuator nodes","mu0_mu1_identical_effective_ki_history":true,"mu0_mu1_max_node_position_difference_mm_at_final":0.023940942349104936,"mu0_mu1_push_difference_n_at_final":3.767953398896618,"mu0_mu1_tip_difference_mm_at_final":-0.0008502098228779786,"mu1_80_160_max_abs_push_curve_difference_n":0.8081181141990603,"mu1_80_160_max_abs_tip_curve_difference_mm":0.689032271124046,"mu1_80_160_max_node_position_difference_mm_at_final":21.388617205624968,"mu1_80_160_push_difference_n_at_final":-0.08967589181977553,"mu1_80_160_tip_difference_mm_at_final":0.6556385840790768},"runs":{"mu0_80":{"nodes":250,"mu":0.0,"requested_steps":80,"completed_steps":80,"accepted_frames":81,"config_sha256":"71209d9bdfc94978fb517c512e424f708477339341a02c8e45211e83fad0bcc3","raw_npz_sha256":"ec29db02548526d3d775611ab91c2313f1d1d1929160574aff1b337a01c1b81d","effective_ki_changes":[{"displacement_mm":0.0,"effective_ki":100.0,"step":0},{"displacement_mm":76.5,"effective_ki":50.0,"step":17},{"displacement_mm":175.5,"effective_ki":25.0,"step":39}],"max_newton_residual_n":4.2923979739258094e-8,"max_free_speed_m_per_s":0.0009951327934479403,"max_protection_error_m":0.0001999999999999988,"physical_and_solver_config":{"total_length":1.5,"total_insertion":0.36,"diameter":0.001,"young_modulus":200000000000.0,"density":7850.0,"tube_radius":0.06,"safe_distance":0.01,"contact_kp":3000.0,"contact_ki":100.0,"contact_active_weight":0.01,"contact_smooth_length":2e-5,"friction_kt_line":1118600.0,"dt":0.05,"damping_ratio":1.0,"ramp_steps":25,"max_newton_iters":200,"residual_tol":1e-7,"settle_speed_tol":0.001,"settle_residual_tol":1e-6,"ki_reduction_factor":0.5,"ki_min_scale":0.125,"retry_subdivisions":[1,2,4,8,16,32,64,128]}},"mu1_160":{"nodes":250,"mu":1.0,"requested_steps":160,"completed_steps":160,"accepted_frames":161,"config_sha256":"c7cd27edd6536d82b7bbf8b68dada04490971f31af7010195791f0eae80841ae","raw_npz_sha256":"3fa68733bbab06634611dc2382e5b5fa28bd02489d08955304eed94584ae81f6","effective_ki_changes":[{"displacement_mm":0.0,"effective_ki":100.0,"step":0},{"displacement_mm":38.25,"effective_ki":50.0,"step":17},{"displacement_mm":87.75,"effective_ki":25.0,"step":39},{"displacement_mm":200.24999999999997,"effective_ki":12.5,"step":89}],"max_newton_residual_n":9.540257440891615e-8,"max_free_speed_m_per_s":0.0009951327934479403,"max_protection_error_m":0.0001999999999999988,"physical_and_solver_config":{"total_length":1.5,"total_insertion":0.36,"diameter":0.001,"young_modulus":200000000000.0,"density":7850.0,"tube_radius":0.06,"safe_distance":0.01,"contact_kp":3000.0,"contact_ki":100.0,"contact_active_weight":0.01,"contact_smooth_length":2e-5,"friction_kt_line":1118600.0,"dt":0.05,"damping_ratio":1.0,"ramp_steps":25,"max_newton_iters":200,"residual_tol":1e-7,"settle_speed_tol":0.001,"settle_residual_tol":1e-6,"ki_reduction_factor":0.5,"ki_min_scale":0.125,"retry_subdivisions":[1,2,4,8,16,32,64,128]}},"mu1_80":{"nodes":250,"mu":1.0,"requested_steps":80,"completed_steps":80,"accepted_frames":81,"config_sha256":"f459269baefc929d76804760d2a0c5499b0cfa36062a510dc464a0f4902ba540","raw_npz_sha256":"6ece1e44595ba0f8d65975a455499711c7978c44a51423f92dbad2975dc11fe0","effective_ki_changes":[{"displacement_mm":0.0,"effective_ki":100.0,"step":0},{"displacement_mm":76.5,"effective_ki":50.0,"step":17},{"displacement_mm":175.5,"effective_ki":25.0,"step":39}],"max_newton_residual_n":4.673305140435693e-8,"max_free_speed_m_per_s":0.0009951327934479403,"max_protection_error_m":0.0001999999999999988,"physical_and_solver_config":{"total_length":1.5,"total_insertion":0.36,"diameter":0.001,"young_modulus":200000000000.0,"density":7850.0,"tube_radius":0.06,"safe_distance":0.01,"contact_kp":3000.0,"contact_ki":100.0,"contact_active_weight":0.01,"contact_smooth_length":2e-5,"friction_kt_line":1118600.0,"dt":0.05,"damping_ratio":1.0,"ramp_steps":25,"max_newton_iters":200,"residual_tol":1e-7,"settle_speed_tol":0.001,"settle_residual_tol":1e-6,"ki_reduction_factor":0.5,"ki_min_scale":0.125,"retry_subdivisions":[1,2,4,8,16,32,64,128]}}},"exporter":"tools/export_free_insert_evidence.py","main_chart":{"media":"free_insert_main.png","content":"mu=0 and mu=1 completed 80-step free-tip advance and negative summed axial reactions of the two prescribed actuator nodes versus imposed displacement","source_runs":["mu0_80","mu1_80"],"export_manifest":"portfolio_evidence/runs/free_insert_main_export/free_insert_manifest.json"}},"derivatives":{"model":"v4 C++ local DER bending versus PyTorch autograd","random_count":1000,"seed":20260825,"metric":"max absolute entry error; scaled by max(1, maximum oracle entry magnitude); relative by oracle max magnitude if nonzero (blank otherwise), per local case","random_scaled_gradient_max":8.61528062741997e-15,"random_scaled_hessian_max":1.4247476115079208e-14,"guarded_count":3,"raw_csv_sha256":"3b3f0d04b35647fb4f001a32efaa2aceb267e15fbc150dd3246634b2b75e7740","exporter":"tools/export_bending_derivatives.py","reproduce_command":"PYTHONPATH=src:. python tools/export_bending_derivatives.py --output-dir evidence/derivatives --random-count 1000"},"backend_step":{"model":"v4 bent rod, same input/tolerances, C++/Eigen versus Python/PyTorch; unrelated to free-end friction","nodes":80,"config":{"length_m":1.5,"dt_s":0.01,"newton_iters_limit":20,"warmup":2,"repeat":10},"thread_environment":{"OMP_NUM_THREADS":"1","MKL_NUM_THREADS":"1","OPENBLAS_NUM_THREADS":"1"},"raw_timings_sha256":"b642cdd7b0c079fa29790035746c041b121dcfa4dfc7ec64ac2cf38cfd14d1f6","median_wall_s":{"cpp":0.0007379085145657882,"python":0.12968165999336634},"max_absolute_output_differences":{"contact_force":0.0,"integrals":0.0,"positions":6.938893903907228e-18,"velocities":6.938893903907228e-16},"both_converged":true,"exporters":["src/softrobot/backends/cpp/benchmark_der_core.py","tools/plot_v4_single_step_evidence.py"],"reproduce_command":"OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 PYTHONPATH=src python -m softrobot.backends.cpp.benchmark_der_core --case bent --nodes 80 --length 1.5 --dt 0.01 --warmup 2 --repeat 10 --backend both"}},"media_sha256":{"hero-curved-guidewire.webp":"2bb05d1f49c55507ed6b352b2f8fc3f1b5e610f11966bdcf96e3ef1f912c9d65","contact-models.webp":"8f1eceb2d587e7dcbcc452d9e0c6b63b0cba4a857633ffecbe6d35b1c62d5369","straight-contact-final.webp":"ad581f100a92ec6b10e8ade959675321d99e2dadae5dffe9f800b6e95a077ff9","straight-contact-process.gif":"e9aad7985b13d7b913a73f957748a8ec932055a9313c60c1295e2db2c06326ae","curved-paired-process.gif":"b6f2c93fb436c35745c514e862e8a242ed05ed8dbff8f835214ffe1f34c57e80","centerline-discrepancy.png":"4a06b32a1ee74274e94854b8e1cda16ab8ab574612789d7ff710fe195b116ead","cantilever_shapes_and_tip_error.png":"8efa66b69948e23901e779f554db2d0c4a7b39d994ee712692eb161e0e70dc82","free_insert_main.png":"e32d3e192cc3d9252c318655d529176faa4360c6413d50b9d16e33f1ebdd75eb","free_insert_curves.png":"2ea79caec276fe0ff3cef80b77409b1461e80f94c7149c445d8cbbf32556da17","free_insert_configurations.png":"626ce6d9c0e6868f35bfb34acef147d346cbe02410a24ddc56c4f0ccbe37381f","free_insert_load_step_difference.png":"320f5956bb267d632d90a277d79e05f532ab86c433b597f59b6aff29ee729e91","free_insert_pair.gif":"32c903e7bc3144cc0283634be1424dafe9f8b90f09c6ec8114790249ba2fe402","bending_derivative_errors.png":"bec991840e55dd0d8644b78245993697511176742802648c6806e7daf7cf2bda","v4_bent_single_step_80n.png":"1c9a7f35d9bfaee1bc34aa5b89e510aaf3c4f44d806503f5cbc7cfcc9c0b3ea3","overlay-120mm.webp":"bdcca0598ff2ac582f6b539c8db29a7e161dc321a00043310af14d8ab605c93b"},"campaign_status":{"two_dimensional_sine_vessel":"in progress; no completed public campaign or convergence claim"},"publication_rule":"Only complete, accepted states enter figures; step-zero pulse transients excluded from contact process animations."}