From c8447c66c4359ee4613830d9a829f19201904a20 Mon Sep 17 00:00:00 2001 From: fy59 Date: Thu, 3 Sep 2026 07:09:29 +0200 Subject: [PATCH] feat: require measured calibration target border --- docs/architecture/calibration_tooling.md | 1 + docs/roadmap/roadmap.md | 2 ++ prompt/02_CURRENT_FROZEN_STATE.md | 1 + prompt/12_CALIBRATION.md | 3 +++ tools/calibration_evidence_solver/README.md | 8 +++++--- .../calibration_evidence_solver | Bin 168232 -> 168232 bytes .../calibration_evidence_solver.cpp | 12 +++++++----- 7 files changed, 19 insertions(+), 8 deletions(-) diff --git a/docs/architecture/calibration_tooling.md b/docs/architecture/calibration_tooling.md index 9a5b771..7ffaf86 100644 --- a/docs/architecture/calibration_tooling.md +++ b/docs/architecture/calibration_tooling.md @@ -59,6 +59,7 @@ Tooling continues to validate the frozen Science v1 requirements, including: - exact ChArUco 9 x 7 / DICT_5X5_100 target identity; - 30.000 mm squares and 21.000 mm markers; - ten physical square measurements and instrument resolution; +- measured free white border of at least 30 mm, supplied explicitly by the session; - immutable target, optical-state, solver and evidence digests; - accepted and rejected view evidence; - field-region, distance and angle diversity; diff --git a/docs/roadmap/roadmap.md b/docs/roadmap/roadmap.md index b8b701a..633d456 100644 --- a/docs/roadmap/roadmap.md +++ b/docs/roadmap/roadmap.md @@ -519,6 +519,8 @@ Calibration Evidence Solver v1 implements the external OpenCV 5.x evidence path Calibration Solver Preflight v1. It remains outside the Lardon3D runtime and Project DB and its deterministic synthetic CPU1 self-test is validated. +The solver session contract now also requires explicit measured `white_border >= 30 mm` evidence. This closes the previous gap between the physical target requirement and the future coordinator input; no default border width is inferred. + A bounded Tooling correction aligned planarity handling with Calibration Science v1: Science v1 defines a categorical physical planarity attestation, not a numeric flatness threshold. Tooling therefore rejects invented finite `target_flatness_mm` values. `L3DCALB1` v1 and Calibration diff --git a/prompt/02_CURRENT_FROZEN_STATE.md b/prompt/02_CURRENT_FROZEN_STATE.md index 2b4acf4..643f61d 100644 --- a/prompt/02_CURRENT_FROZEN_STATE.md +++ b/prompt/02_CURRENT_FROZEN_STATE.md @@ -27,6 +27,7 @@ User-facing TUI/control language PASS External SSD controller VALIDATED Calibration Solver Preflight v1 PASS Calibration Evidence Solver v1 IMPLEMENTED/VALIDATED +Calibration solver white-border evidence PASS/FROZEN Calibration Tooling planarity alignment PASS/FROZEN ``` diff --git a/prompt/12_CALIBRATION.md b/prompt/12_CALIBRATION.md index bca3e05..adaa302 100644 --- a/prompt/12_CALIBRATION.md +++ b/prompt/12_CALIBRATION.md @@ -8,6 +8,7 @@ CALIBRATION_TOOLING_V1=PASS/FROZEN CALIBRATION_TOOLING_PLANARITY_ALIGNMENT=PASS/FROZEN CALIBRATION_BOOTSTRAP_V1=PASS/FROZEN CALIBRATION_EVIDENCE_SOLVER_V1=IMPLEMENTED/VALIDATED +CALIBRATION_SOLVER_WHITE_BORDER_V1=PASS/FROZEN CALIBRATION_WORKFLOW=IN_PROGRESS CURRENT_CALIBRATION_NEXT=WORKFLOW_COORDINATOR ``` @@ -22,6 +23,8 @@ A bounded corrective review established that Calibration Science v1 defines targ The external `tools/calibration_evidence_solver/` implementation is present and validated by its deterministic synthetic CPU1 self-test. It remains external to the Lardon3D runtime and Project DB. +Its session v1 now requires an explicit measured `white_border` of at least 30 mm. No default border width may be invented by the solver or the future coordinator. + ## CURRENT Historical S21 and A6000 Engine Bay campaigns: diff --git a/tools/calibration_evidence_solver/README.md b/tools/calibration_evidence_solver/README.md index c0646f8..e01e68d 100644 --- a/tools/calibration_evidence_solver/README.md +++ b/tools/calibration_evidence_solver/README.md @@ -22,6 +22,7 @@ Un fichier texte ASCII, sans commentaire ni espace dans les chemins, contient : L3DCAL_SESSION_V1 target DICT_5X5_100 9 7 30 21 measurement <10-real-square-mm-values> +white_border planarity PASS decoder optical_state @@ -37,9 +38,10 @@ Il y a entre 1 et 4096 lignes `image`, chaque source SHA est unique, et chaque image a exactement une preuve pré-solve, clipping et coordinate. Les dix mesures réelles doivent être à 0.30 mm de 30.000 mm et leur étendue ne doit pas dépasser 0.20 mm; l'instrument doit annoncer une résolution de 0.1 mm ou -meilleure. `planarity` est une attestation PASS hachée : Science v1 impose une -planche rigide plane mais ne fixe pas de seuil numérique que l'outil pourrait -inventer. `optical_state` est un jeton atomique complet du manifeste d'état +meilleure. `white_border` archive la bordure blanche physique libre mesurée et +doit être d'au moins 30 mm; aucune valeur par défaut n'est inventée. +`planarity` est une attestation PASS hachée : Science v1 impose une planche +rigide plane mais ne fixe pas de seuil numérique que l'outil pourrait inventer. `optical_state` est un jeton atomique complet du manifeste d'état optique; aucune valeur inconnue n'est acceptée par convention. Les `coordinate_point` consomment exactement les `N` comparaisons annoncées. diff --git a/tools/calibration_evidence_solver/calibration_evidence_solver b/tools/calibration_evidence_solver/calibration_evidence_solver index ecd30064a6cc81c69a0c9d459ce1f6e494f002ae..9f53744674d299634965124a943b568f3927aa35 100755 GIT binary patch delta 48546 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 MT3Ns|r1pmY1NFX3dH?_b delta 47592 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 generator_hash{}, planarity_hash{}; - double resolution_mm = -1, planarity_pass = 0; + double resolution_mm = -1, planarity_pass = 0, white_border_mm = -1; std::array measurements{}; bool target = false, measurement = false, planarity = false; - bool decoder_set = false, optical_state = false; + bool white_border = false, decoder_set = false, optical_state = false; std::string optical_state_fields; }; @@ -140,6 +140,7 @@ bool read_session(const std::string& path,std::vector* views,std::array>m)||!finite(m)){*why="measurement values";return false;} } evidence->measurement=true; + } else if(tag=="white_border") { if(evidence->white_border || !(s>>evidence->white_border_mm) || !finite(evidence->white_border_mm) || evidence->white_border_mm < 30.0) {*why="white border evidence";return false;} evidence->white_border=true; } else if(tag=="planarity") { std::string result,h; if(evidence->planarity || !(s>>result>>h) || !hex(h,&evidence->planarity_hash) || (result!="PASS"&&result!="FAIL")) {*why="planarity evidence";return false;} evidence->planarity=true; evidence->planarity_pass=result=="PASS"; } else if(tag=="decoder") { if(evidence->decoder_set || !(s>>evidence->decoder>>evidence->decoder_version) || evidence->decoder.size()>128 || evidence->decoder_version.size()>128 || !json_token(evidence->decoder) || !json_token(evidence->decoder_version)) {*why="decoder identity/version";return false;} evidence->decoder_set=true; } else if(tag=="optical_state") { std::string h; if(evidence->optical_state || !(s>>h>>evidence->optical_state_fields) || !hex(h,optical) || evidence->optical_state_fields.size()>1024 || !json_token(evidence->optical_state_fields) || evidence->optical_state_fields=="UNKNOWN") {*why="optical-state evidence";return false;} evidence->optical_state=true; have=true; @@ -150,7 +151,7 @@ bool read_session(const std::string& path,std::vector* views,std::arraya{};double meters=0;int band=-1;if(!(s>>h>>meters>>band)||!hex(h,&a)||!finite(meters)||meters<=0||band<0||band>2){*why="distance evidence";return false;}View*v=find_view(views,a);if(!v||v->measured_distance>0){*why="distance source";return false;}v->measured_distance=meters;v->declared_distance_band=band; } else {*why="unknown session record";return false;} } - if(!have||!evidence->target||!evidence->measurement||!evidence->planarity||!evidence->planarity_pass||!evidence->decoder_set||!evidence->optical_state||views->empty()||views->size()>kMaxViews){*why="required session evidence";return false;} + if(!have||!evidence->target||!evidence->measurement||!evidence->white_border||!evidence->planarity||!evidence->planarity_pass||!evidence->decoder_set||!evidence->optical_state||views->empty()||views->size()>kMaxViews){*why="required session evidence";return false;} double lo=std::numeric_limits::infinity(),hi=-lo;for(double m:evidence->measurements){lo=std::min(lo,m);hi=std::max(hi,m);if(std::abs(m-30.0)>.30){*why="target measurement tolerance";return false;}}if(hi-lo>.20){*why="target measurement range";return false;} std::sort(views->begin(),views->end(),[](const View&a,const View&b){return a.hashsize();++i) { @@ -335,7 +336,7 @@ bool synthetic_test() { double delta=0;for(auto ray:std::array{{{0,0},{-.7,-.7},{.7,-.7},{-.7,.7},{.7,.7}}}){auto eval=[](const Params&p,cv::Point2d q){double r2=q.x*q.x+q.y*q.y,rad=1+p.k1*r2+p.k2*r2*r2;return cv::Point2d(p.fx*(q.x*rad+2*p.p1*q.x*q.y+p.p2*(r2+2*q.x*q.x))+p.cx,p.fy*(q.y*rad+p.p1*(r2+2*q.y*q.y)+2*p.p2*q.x*q.y)+p.cy);};delta=std::max(delta,cv::norm(eval(a.p,ray)-eval(f.p,ray)));} double iq=0,oq=0;for(const auto&x:v){iq=std::max(iq,x.image_conversion_max);oq=std::max(oq,x.object_conversion_max);} double rr=0,rm=0;size_t rh=0,rc=0;if(!residuals(&v,all,a,&rr,&rm,&rh,&rc,&why))return false; - SessionEvidence evidence; evidence.target=true;evidence.measurement=true;evidence.planarity=true;evidence.planarity_pass=1;evidence.decoder_set=true;evidence.optical_state=true;evidence.target_id="synthetic";evidence.instrument="synthetic";evidence.decoder="synthetic_decoder";evidence.decoder_version="1";evidence.optical_state_fields="synthetic_only";evidence.resolution_mm=.1;evidence.measurements.fill(30.0); + SessionEvidence evidence; evidence.target=true;evidence.measurement=true;evidence.white_border=true;evidence.planarity=true;evidence.planarity_pass=1;evidence.decoder_set=true;evidence.optical_state=true;evidence.target_id="synthetic";evidence.instrument="synthetic";evidence.decoder="synthetic_decoder";evidence.decoder_version="1";evidence.optical_state_fields="synthetic_only";evidence.resolution_mm=.1;evidence.white_border_mm=30.0;evidence.measurements.fill(30.0); Solve runs[3]={a,b,c};std::array optical{};std::string bundle_why; const std::filesystem::path left=std::filesystem::temp_directory_path()/"l3dcal_byte_identity_left"; const std::filesystem::path right=std::filesystem::temp_directory_path()/"l3dcal_byte_identity_right";std::error_code ec;std::filesystem::remove_all(left.string()+".bundle",ec);std::filesystem::remove_all(right.string()+".bundle",ec); @@ -355,6 +356,7 @@ bool manifest_negative_tests() { x<<"L3DCAL_SESSION_V1\n" <<"target board "<