@geotechcli/core 0.4.109 → 0.4.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/agents/brain.d.ts.map +1 -1
  2. package/dist/agents/brain.js +31 -2
  3. package/dist/agents/brain.js.map +1 -1
  4. package/dist/agents/fem-tools.js +5 -0
  5. package/dist/agents/fem-tools.js.map +1 -1
  6. package/dist/agents/safety.d.ts +1 -0
  7. package/dist/agents/safety.d.ts.map +1 -1
  8. package/dist/agents/safety.js +62 -0
  9. package/dist/agents/safety.js.map +1 -1
  10. package/dist/fem/demo.d.ts.map +1 -1
  11. package/dist/fem/demo.js +4 -0
  12. package/dist/fem/demo.js.map +1 -1
  13. package/dist/fem/engineering-evidence.d.ts +21 -2
  14. package/dist/fem/engineering-evidence.d.ts.map +1 -1
  15. package/dist/fem/engineering-evidence.js +354 -6
  16. package/dist/fem/engineering-evidence.js.map +1 -1
  17. package/dist/fem/index.d.ts +4 -2
  18. package/dist/fem/index.d.ts.map +1 -1
  19. package/dist/fem/index.js +2 -0
  20. package/dist/fem/index.js.map +1 -1
  21. package/dist/fem/nonlinear-plane-strain-solver.d.ts +10 -0
  22. package/dist/fem/nonlinear-plane-strain-solver.d.ts.map +1 -0
  23. package/dist/fem/nonlinear-plane-strain-solver.js +358 -0
  24. package/dist/fem/nonlinear-plane-strain-solver.js.map +1 -0
  25. package/dist/fem/plane-strain-assembly.d.ts +54 -0
  26. package/dist/fem/plane-strain-assembly.d.ts.map +1 -1
  27. package/dist/fem/plane-strain-assembly.js +277 -46
  28. package/dist/fem/plane-strain-assembly.js.map +1 -1
  29. package/dist/fem/production-readiness.js +5 -5
  30. package/dist/fem/production-readiness.js.map +1 -1
  31. package/dist/fem/support-design.d.ts +124 -0
  32. package/dist/fem/support-design.d.ts.map +1 -0
  33. package/dist/fem/support-design.js +380 -0
  34. package/dist/fem/support-design.js.map +1 -0
  35. package/dist/fem/types.d.ts +68 -3
  36. package/dist/fem/types.d.ts.map +1 -1
  37. package/dist/fem/validation.d.ts.map +1 -1
  38. package/dist/fem/validation.js +346 -13
  39. package/dist/fem/validation.js.map +1 -1
  40. package/dist/ingest/document-evidence-packet.d.ts +30 -30
  41. package/dist/ingest/job-worker.d.ts.map +1 -1
  42. package/dist/ingest/job-worker.js +4 -0
  43. package/dist/ingest/job-worker.js.map +1 -1
  44. package/dist/meta/metadata.json +1 -1
  45. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fem/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fem/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/fem/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAEjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAknBpB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,oBAAoB,CA0jBvF;AAgiBD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB,CAuK3F"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/fem/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAEjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAooBpB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,oBAAoB,CAslBvF;AA63BD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB,CA8K3F"}
@@ -21,6 +21,8 @@ const FEM_WEBGL_UINT16_INDEX_LIMIT = 65_535;
21
21
  const FEM_MAX_PREVIEW_MESH_NODES = FEM_WEBGL_UINT16_INDEX_LIMIT + 1;
22
22
  const FEM_MIN_BIOT_TRANSIENT_STEPS = 3;
23
23
  const FEM_MAX_BIOT_TIME_STEP_GROWTH_RATIO = 8;
24
+ const FEM_PLANE_STRAIN_DP_ADAPTIVE_BACKEND_ID = 'builtin-plane-strain-dp-adaptive-v0';
25
+ const FEM_PLANE_STRAIN_DP_ANALYSIS_TYPE = 'static_2d_plane_strain_drucker_prager';
24
26
  function expectedMeshCounts(mesh) {
25
27
  if (mesh.elementType === 'quad4_plane_strain') {
26
28
  return {
@@ -223,6 +225,22 @@ function validateOptionalResultMetadata(findings, manifest, nodeCount, outlineNo
223
225
  ['max_mobilized_strength_ratio', manifest.envelope.maxMobilizedStrengthRatio],
224
226
  ['drainage_path', manifest.envelope.drainagePathM],
225
227
  ['consolidation_duration', manifest.envelope.consolidationDurationYears],
228
+ ['solver_load_steps', manifest.envelope.solverLoadSteps],
229
+ ['solver_iterations', manifest.envelope.solverIterations],
230
+ ['max_solver_residual_ratio', manifest.envelope.maxSolverResidualRatio],
231
+ ['max_yield_residual_ratio', manifest.envelope.maxYieldResidualRatio],
232
+ ['nonlinear_plastic_strain', manifest.envelope.nonlinearPlasticStrain],
233
+ ['plane_strain_dof_count', manifest.envelope.planeStrainDofCount],
234
+ ['plane_strain_free_dof_count', manifest.envelope.planeStrainFreeDofCount],
235
+ ['plane_strain_constrained_dof_count', manifest.envelope.planeStrainConstrainedDofCount],
236
+ ['plastic_gauss_point_count', manifest.envelope.plasticGaussPointCount],
237
+ ['max_equivalent_plastic_strain', manifest.envelope.maxEquivalentPlasticStrain],
238
+ ['max_equivalent_plastic_strain_increment', manifest.envelope.maxEquivalentPlasticStrainIncrement],
239
+ ['adaptive_attempt_count', manifest.envelope.adaptiveAttemptCount],
240
+ ['adaptive_accepted_step_count', manifest.envelope.adaptiveAcceptedStepCount],
241
+ ['adaptive_rejected_attempt_count', manifest.envelope.adaptiveRejectedAttemptCount],
242
+ ['adaptive_cutback_count', manifest.envelope.adaptiveCutbackCount],
243
+ ['adaptive_max_cutback_depth', manifest.envelope.adaptiveMaxCutbackDepth],
226
244
  ['time_step_count', manifest.envelope.timeStepCount],
227
245
  ['min_pore_pressure', manifest.envelope.minPorePressureKpa],
228
246
  ['max_pore_pressure', manifest.envelope.maxPorePressureKpa],
@@ -562,6 +580,7 @@ export function validateFemAnalysisCase(caseFile) {
562
580
  ]);
563
581
  }
564
582
  const { domain, raft, excavation, tunnel, consolidation, biot } = caseFile.geometry;
583
+ const isPlaneStrainDruckerPragerAnalysis = caseFile.analysisType === FEM_PLANE_STRAIN_DP_ANALYSIS_TYPE;
565
584
  if (caseFile.schemaVersion !== 'fem-analysis-case.v0') {
566
585
  findings.push(finding('blocker', 'schema.unsupported', 'Only fem-analysis-case.v0 is supported.'));
567
586
  }
@@ -586,7 +605,9 @@ export function validateFemAnalysisCase(caseFile) {
586
605
  if (caseFile.objective === 'foundation_settlement' && caseFile.analysisType !== 'static_3d_small_strain') {
587
606
  findings.push(finding('blocker', 'analysis.unsupported', `Unsupported analysis type: ${caseFile.analysisType}.`));
588
607
  }
589
- if (caseFile.objective === 'excavation_deformation' && caseFile.analysisType !== 'static_3d_staged_elastic') {
608
+ if (caseFile.objective === 'excavation_deformation' &&
609
+ caseFile.analysisType !== 'static_3d_staged_elastic' &&
610
+ !isPlaneStrainDruckerPragerAnalysis) {
590
611
  findings.push(finding('blocker', 'analysis.unsupported', `Unsupported analysis type: ${caseFile.analysisType}.`));
591
612
  }
592
613
  if (caseFile.objective === 'tunnel_volume_loss_settlement' && caseFile.analysisType !== 'empirical_3d_settlement_surface') {
@@ -696,7 +717,9 @@ export function validateFemAnalysisCase(caseFile) {
696
717
  if (previousDepth !== excavation.finalDepthM) {
697
718
  findings.push(finding('review', 'stages.final-depth-review', 'Last excavation stage does not exactly match the final depth; staging requires review.'));
698
719
  }
699
- findings.push(finding('review', 'excavation.design-excluded', 'Excavation preview excludes retaining wall design, basal heave, seepage, consolidation, and nonlinear soil response.'));
720
+ findings.push(isPlaneStrainDruckerPragerAnalysis
721
+ ? finding('review', 'excavation.plane-strain-dp-preview', 'Excavation preview uses experimental plane-strain Drucker-Prager plasticity and still excludes retaining wall design, basal heave, seepage, consolidation, and production design acceptance.')
722
+ : finding('review', 'excavation.design-excluded', 'Excavation preview excludes retaining wall design, basal heave, seepage, consolidation, and nonlinear soil response.'));
700
723
  }
701
724
  }
702
725
  if (caseFile.objective === 'tunnel_volume_loss_settlement') {
@@ -886,6 +909,16 @@ export function validateFemAnalysisCase(caseFile) {
886
909
  pushFiniteNumberFinding(findings, material.hydraulicConductivityMPerS, `${prefix}.hydraulic-conductivity`, 'Hydraulic conductivity', { positive: true });
887
910
  }
888
911
  }
912
+ if (isPlaneStrainDruckerPragerAnalysis) {
913
+ if (material.model !== 'mohr_coulomb') {
914
+ findings.push(finding('blocker', `${prefix}.plane-strain-dp-model-required`, 'Plane-strain Drucker-Prager previews require mohr_coulomb material strength parameters for Drucker-Prager mapping.'));
915
+ }
916
+ const frictionAngleDeg = material.frictionAngleDeg;
917
+ if (!isFiniteNumber(frictionAngleDeg) || frictionAngleDeg <= 0 || frictionAngleDeg >= 50) {
918
+ findings.push(finding('blocker', `${prefix}.plane-strain-dp-friction-angle-invalid`, 'Plane-strain Drucker-Prager previews require a finite Mohr-Coulomb friction angle between 0 and 50 degrees.'));
919
+ }
920
+ pushFiniteNumberFinding(findings, material.cohesionKpa, `${prefix}.plane-strain-dp-cohesion`, 'Plane-strain Drucker-Prager cohesion', { nonNegative: true });
921
+ }
889
922
  if (caseFile.objective === 'seepage_groundwater_coupling') {
890
923
  if (material.model !== 'linear_elastic') {
891
924
  findings.push(finding('blocker', `${prefix}.biot-model-required`, 'Biot u-p preview requires a linear_elastic material with hydraulic coupling parameters.'));
@@ -973,10 +1006,13 @@ export function validateFemAnalysisCase(caseFile) {
973
1006
  if (caseFile.mesh.elementType !== 'hex8' && caseFile.mesh.elementType !== 'quad4_plane_strain') {
974
1007
  findings.push(finding('blocker', 'mesh.element-type-invalid', `Unsupported mesh element type: ${String(caseFile.mesh.elementType)}.`));
975
1008
  }
976
- if (caseFile.objective === 'seepage_groundwater_coupling' && caseFile.mesh.elementType !== 'quad4_plane_strain') {
977
- findings.push(finding('blocker', 'mesh.element-type-biot-required', 'Biot u-p seepage previews require quad4_plane_strain mesh elements.'));
1009
+ const requiresQuad4PlaneStrainMesh = caseFile.objective === 'seepage_groundwater_coupling' || isPlaneStrainDruckerPragerAnalysis;
1010
+ if (requiresQuad4PlaneStrainMesh && caseFile.mesh.elementType !== 'quad4_plane_strain') {
1011
+ findings.push(finding('blocker', isPlaneStrainDruckerPragerAnalysis ? 'mesh.element-type-plane-strain-dp-required' : 'mesh.element-type-biot-required', isPlaneStrainDruckerPragerAnalysis
1012
+ ? 'Plane-strain Drucker-Prager previews require quad4_plane_strain mesh elements.'
1013
+ : 'Biot u-p seepage previews require quad4_plane_strain mesh elements.'));
978
1014
  }
979
- if (caseFile.objective !== 'seepage_groundwater_coupling' && caseFile.mesh.elementType !== 'hex8') {
1015
+ if (!requiresQuad4PlaneStrainMesh && caseFile.mesh.elementType !== 'hex8') {
980
1016
  findings.push(finding('blocker', 'mesh.element-type-hex8-required', 'Non-Biot FEM preview cases require hex8 mesh elements.'));
981
1017
  }
982
1018
  if (!Number.isInteger(divisionsX) ||
@@ -1141,7 +1177,7 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1141
1177
  const fallback = { forceBalanceTolerance: 1e-3, residualTolerance: 1e-6 };
1142
1178
  const report = manifest.solverConvergence;
1143
1179
  if (!isRecord(report)) {
1144
- findings.push(finding('blocker', 'result.solver-convergence.missing', 'Nonlinear column solver manifests must include explicit convergence policy and load-step residual history.'));
1180
+ findings.push(finding('blocker', 'result.solver-convergence.missing', 'Nonlinear solver manifests must include explicit convergence policy and load-step residual history.'));
1145
1181
  return fallback;
1146
1182
  }
1147
1183
  if (report.schemaVersion !== 'fem-solver-convergence-report.v1') {
@@ -1151,7 +1187,7 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1151
1187
  findings.push(finding('blocker', 'result.solver-convergence.status-invalid', 'Solver convergence status must be converged or nonconverged.'));
1152
1188
  }
1153
1189
  if (report.status === 'nonconverged') {
1154
- findings.push(finding('blocker', 'result.solver-convergence.nonconverged', 'Nonlinear column solver did not satisfy its configured convergence policy.'));
1190
+ findings.push(finding('blocker', 'result.solver-convergence.nonconverged', 'Nonlinear solver did not satisfy its configured convergence policy.'));
1155
1191
  }
1156
1192
  const policy = report.policy;
1157
1193
  let forceBalanceTolerance = fallback.forceBalanceTolerance;
@@ -1181,12 +1217,13 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1181
1217
  findings.push(finding('blocker', 'result.solver-convergence.load-steps.invalid', 'Solver convergence loadSteps must be an array.'));
1182
1218
  return { forceBalanceTolerance, residualTolerance };
1183
1219
  }
1184
- if (report.loadSteps.length !== expectedLoadSteps) {
1185
- findings.push(finding('blocker', 'result.solver-convergence.load-steps.count-mismatch', 'Solver convergence load steps must match consolidation stages.'));
1220
+ if (expectedLoadSteps != null && report.loadSteps.length !== expectedLoadSteps) {
1221
+ findings.push(finding('blocker', 'result.solver-convergence.load-steps.count-mismatch', 'Solver convergence load steps must match the expected accepted load-step count.'));
1186
1222
  }
1187
1223
  const validTerminationReasons = new Set([
1188
1224
  'converged',
1189
1225
  'max_iterations',
1226
+ 'linear_solver_nonconverged',
1190
1227
  'force_residual_exceeded',
1191
1228
  'yield_residual_exceeded',
1192
1229
  'material_nonconvergence',
@@ -1205,6 +1242,24 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1205
1242
  if (step.stageId != null && !isNonEmptyString(step.stageId)) {
1206
1243
  findings.push(finding('blocker', `${prefix}.stage-id.invalid`, 'Solver convergence stageId must be a non-empty string when present.'));
1207
1244
  }
1245
+ if (step.loadFactor != null) {
1246
+ const loadFactorOk = pushFiniteNumberFinding(findings, step.loadFactor, `${prefix}.load-factor`, 'Solver convergence load factor', { positive: true });
1247
+ if (loadFactorOk && step.loadFactor > 1 + 1e-9) {
1248
+ findings.push(finding('blocker', `${prefix}.load-factor.range-invalid`, 'Solver convergence load factor must not exceed 1.0.'));
1249
+ }
1250
+ }
1251
+ if (step.requestedLoadFactor != null) {
1252
+ const requestedOk = pushFiniteNumberFinding(findings, step.requestedLoadFactor, `${prefix}.requested-load-factor`, 'Solver convergence requested load factor', { positive: true });
1253
+ if (requestedOk && step.requestedLoadFactor > 1 + 1e-9) {
1254
+ findings.push(finding('blocker', `${prefix}.requested-load-factor.range-invalid`, 'Solver convergence requested load factor must not exceed 1.0.'));
1255
+ }
1256
+ }
1257
+ if (step.cutbackDepth != null && (!Number.isInteger(step.cutbackDepth) || step.cutbackDepth < 0)) {
1258
+ findings.push(finding('blocker', `${prefix}.cutback-depth.invalid`, 'Solver convergence cutback depth must be a non-negative integer when present.'));
1259
+ }
1260
+ if (step.adaptiveCutback != null && typeof step.adaptiveCutback !== 'boolean') {
1261
+ findings.push(finding('blocker', `${prefix}.adaptive-cutback.invalid`, 'Solver convergence adaptiveCutback must be boolean when present.'));
1262
+ }
1208
1263
  if (!Number.isInteger(step.iterations) || step.iterations < 0) {
1209
1264
  findings.push(finding('blocker', `${prefix}.iterations.invalid`, 'Solver convergence iterations must be a non-negative integer.'));
1210
1265
  }
@@ -1266,6 +1321,196 @@ function validateNonlinearSolverConvergenceReport(findings, manifest, expectedLo
1266
1321
  }
1267
1322
  return { forceBalanceTolerance, residualTolerance };
1268
1323
  }
1324
+ function validatePlaneStrainDpAdaptiveAcceptance(findings, manifest, solverTolerances) {
1325
+ const { envelope } = manifest;
1326
+ const adaptive = manifest.adaptiveLoadStepping;
1327
+ if (!isRecord(adaptive)) {
1328
+ findings.push(finding('blocker', 'result.dp-adaptive.missing', 'Plane-strain Drucker-Prager manifests must include adaptive load-stepping metadata.'));
1329
+ return;
1330
+ }
1331
+ if (adaptive.schemaVersion !== 'fem-plane-strain-dp-adaptive-load-stepping.v1') {
1332
+ findings.push(finding('blocker', 'result.dp-adaptive.schema.unsupported', 'Unsupported plane-strain Drucker-Prager adaptive load-stepping schema.'));
1333
+ }
1334
+ if (adaptive.enabled !== true) {
1335
+ findings.push(finding('blocker', 'result.dp-adaptive.enabled-required', 'Plane-strain Drucker-Prager adaptive load stepping must be enabled for this backend.'));
1336
+ }
1337
+ if (adaptive.strategy !== 'cutback-bisection') {
1338
+ findings.push(finding('blocker', 'result.dp-adaptive.strategy.invalid', 'Plane-strain Drucker-Prager adaptive load stepping must use cutback-bisection strategy.'));
1339
+ }
1340
+ const requestedStepCountOk = pushFiniteNumberFinding(findings, adaptive.requestedStepCount, 'result.dp-adaptive.requested-step-count', 'DP adaptive requested step count', { positive: true });
1341
+ const attemptedStepCountOk = pushFiniteNumberFinding(findings, adaptive.attemptedStepCount, 'result.dp-adaptive.attempted-step-count', 'DP adaptive attempted step count', { positive: true });
1342
+ const acceptedStepCountOk = pushFiniteNumberFinding(findings, adaptive.acceptedStepCount, 'result.dp-adaptive.accepted-step-count', 'DP adaptive accepted step count', { positive: true });
1343
+ const cutbackCountOk = pushFiniteNumberFinding(findings, adaptive.cutbackCount, 'result.dp-adaptive.cutback-count', 'DP adaptive cutback count', { nonNegative: true });
1344
+ const maxCutbackDepthOk = pushFiniteNumberFinding(findings, adaptive.maxCutbackDepth, 'result.dp-adaptive.max-cutback-depth', 'DP adaptive max cutback depth', { nonNegative: true });
1345
+ pushFiniteNumberFinding(findings, adaptive.minLoadFactorIncrement, 'result.dp-adaptive.min-load-factor-increment', 'DP adaptive minimum load-factor increment', { positive: true });
1346
+ for (const [ok, value, code, label] of [
1347
+ [requestedStepCountOk, adaptive.requestedStepCount, 'requested-step-count', 'requested step count'],
1348
+ [attemptedStepCountOk, adaptive.attemptedStepCount, 'attempted-step-count', 'attempted step count'],
1349
+ [acceptedStepCountOk, adaptive.acceptedStepCount, 'accepted-step-count', 'accepted step count'],
1350
+ [cutbackCountOk, adaptive.cutbackCount, 'cutback-count', 'cutback count'],
1351
+ [maxCutbackDepthOk, adaptive.maxCutbackDepth, 'max-cutback-depth', 'max cutback depth'],
1352
+ ]) {
1353
+ if (ok && !Number.isInteger(value)) {
1354
+ findings.push(finding('blocker', `result.dp-adaptive.${code}.integer`, `DP adaptive ${label} must be an integer.`));
1355
+ }
1356
+ }
1357
+ if (!Array.isArray(adaptive.requestedLoadFactors) || adaptive.requestedLoadFactors.length === 0) {
1358
+ findings.push(finding('blocker', 'result.dp-adaptive.requested-load-factors.invalid', 'DP adaptive requestedLoadFactors must be a non-empty array.'));
1359
+ }
1360
+ else {
1361
+ if (requestedStepCountOk && adaptive.requestedLoadFactors.length !== adaptive.requestedStepCount) {
1362
+ findings.push(finding('blocker', 'result.dp-adaptive.requested-load-factors.count-mismatch', 'DP adaptive requested load factors must match requestedStepCount.'));
1363
+ }
1364
+ for (const [index, loadFactor] of adaptive.requestedLoadFactors.entries()) {
1365
+ const ok = pushFiniteNumberFinding(findings, loadFactor, `result.dp-adaptive.requestedLoadFactors.${index}`, 'DP adaptive requested load factor', { positive: true });
1366
+ if (ok && loadFactor > 1 + 1e-9) {
1367
+ findings.push(finding('blocker', `result.dp-adaptive.requestedLoadFactors.${index}.range-invalid`, 'DP adaptive requested load factors must not exceed 1.0.'));
1368
+ }
1369
+ }
1370
+ }
1371
+ if (!Array.isArray(adaptive.acceptedLoadFactors) || adaptive.acceptedLoadFactors.length === 0) {
1372
+ findings.push(finding('blocker', 'result.dp-adaptive.accepted-load-factors.invalid', 'DP adaptive acceptedLoadFactors must be a non-empty array.'));
1373
+ }
1374
+ else {
1375
+ if (acceptedStepCountOk && adaptive.acceptedLoadFactors.length !== adaptive.acceptedStepCount) {
1376
+ findings.push(finding('blocker', 'result.dp-adaptive.accepted-load-factors.count-mismatch', 'DP adaptive accepted load factors must match acceptedStepCount.'));
1377
+ }
1378
+ let previous = 0;
1379
+ for (const [index, loadFactor] of adaptive.acceptedLoadFactors.entries()) {
1380
+ const ok = pushFiniteNumberFinding(findings, loadFactor, `result.dp-adaptive.acceptedLoadFactors.${index}`, 'DP adaptive accepted load factor', { positive: true });
1381
+ if (ok) {
1382
+ if (loadFactor <= previous + 1e-12) {
1383
+ findings.push(finding('blocker', `result.dp-adaptive.acceptedLoadFactors.${index}.not-increasing`, 'DP adaptive accepted load factors must be strictly increasing.'));
1384
+ }
1385
+ if (loadFactor > 1 + 1e-9) {
1386
+ findings.push(finding('blocker', `result.dp-adaptive.acceptedLoadFactors.${index}.range-invalid`, 'DP adaptive accepted load factors must not exceed 1.0.'));
1387
+ }
1388
+ previous = loadFactor;
1389
+ }
1390
+ }
1391
+ const finalLoadFactor = adaptive.acceptedLoadFactors.at(-1);
1392
+ if (isFiniteNumber(finalLoadFactor) && Math.abs(finalLoadFactor - 1) > 1e-9) {
1393
+ findings.push(finding('blocker', 'result.dp-adaptive.accepted-load-factors.final-load-mismatch', 'DP adaptive accepted load factors must reach full load factor 1.0.'));
1394
+ }
1395
+ }
1396
+ if (!Array.isArray(adaptive.attempts) || adaptive.attempts.length === 0) {
1397
+ findings.push(finding('blocker', 'result.dp-adaptive.attempts.invalid', 'DP adaptive attempts must be a non-empty array.'));
1398
+ }
1399
+ else {
1400
+ if (attemptedStepCountOk && adaptive.attempts.length !== adaptive.attemptedStepCount) {
1401
+ findings.push(finding('blocker', 'result.dp-adaptive.attempts.count-mismatch', 'DP adaptive attempts must match attemptedStepCount.'));
1402
+ }
1403
+ const acceptedAttempts = adaptive.attempts.filter((attempt) => isRecord(attempt) && attempt.accepted === true);
1404
+ const rejectedAttempts = adaptive.attempts.filter((attempt) => isRecord(attempt) && attempt.accepted === false);
1405
+ if (acceptedStepCountOk && acceptedAttempts.length !== adaptive.acceptedStepCount) {
1406
+ findings.push(finding('blocker', 'result.dp-adaptive.attempts.accepted-count-mismatch', 'DP adaptive accepted attempt count must match acceptedStepCount.'));
1407
+ }
1408
+ if (isFiniteNumber(envelope.adaptiveRejectedAttemptCount) && rejectedAttempts.length !== envelope.adaptiveRejectedAttemptCount) {
1409
+ findings.push(finding('blocker', 'result.dp-adaptive.attempts.rejected-count-mismatch', 'DP adaptive rejected attempt count must match the envelope.'));
1410
+ }
1411
+ for (const [index, attempt] of adaptive.attempts.entries()) {
1412
+ const prefix = `result.dp-adaptive.attempts.${index}`;
1413
+ if (!isRecord(attempt)) {
1414
+ findings.push(finding('blocker', `${prefix}.shape-invalid`, 'DP adaptive attempt must be an object.'));
1415
+ continue;
1416
+ }
1417
+ if (!Number.isInteger(attempt.attempt) || attempt.attempt !== index + 1) {
1418
+ findings.push(finding('blocker', `${prefix}.attempt.sequence-invalid`, 'DP adaptive attempts must be sequentially numbered.'));
1419
+ }
1420
+ pushFiniteNumberFinding(findings, attempt.startLoadFactor, `${prefix}.start-load-factor`, 'DP adaptive attempt start load factor', { nonNegative: true });
1421
+ pushFiniteNumberFinding(findings, attempt.targetLoadFactor, `${prefix}.target-load-factor`, 'DP adaptive attempt target load factor', { positive: true });
1422
+ pushFiniteNumberFinding(findings, attempt.requestedLoadFactor, `${prefix}.requested-load-factor`, 'DP adaptive attempt requested load factor', { positive: true });
1423
+ if (!Number.isInteger(attempt.cutbackDepth) || attempt.cutbackDepth < 0) {
1424
+ findings.push(finding('blocker', `${prefix}.cutback-depth.invalid`, 'DP adaptive attempt cutbackDepth must be a non-negative integer.'));
1425
+ }
1426
+ if (typeof attempt.accepted !== 'boolean') {
1427
+ findings.push(finding('blocker', `${prefix}.accepted.invalid`, 'DP adaptive attempt accepted must be boolean.'));
1428
+ }
1429
+ if (typeof attempt.rollbackApplied !== 'boolean') {
1430
+ findings.push(finding('blocker', `${prefix}.rollback-applied.invalid`, 'DP adaptive attempt rollbackApplied must be boolean.'));
1431
+ }
1432
+ if (!isNonEmptyString(attempt.committedStateSignatureBefore) || !isNonEmptyString(attempt.committedStateSignatureAfter)) {
1433
+ findings.push(finding('blocker', `${prefix}.state-signature.missing`, 'DP adaptive attempts must include committed state signatures before and after.'));
1434
+ }
1435
+ if (attempt.accepted === false) {
1436
+ if (attempt.rollbackApplied !== true) {
1437
+ findings.push(finding('blocker', `${prefix}.rollback-required`, 'Rejected DP adaptive attempts must apply rollback.'));
1438
+ }
1439
+ if (isNonEmptyString(attempt.committedStateSignatureBefore) &&
1440
+ isNonEmptyString(attempt.committedStateSignatureAfter) &&
1441
+ attempt.committedStateSignatureAfter !== attempt.committedStateSignatureBefore) {
1442
+ findings.push(finding('blocker', `${prefix}.rollback-state-mutated`, 'Rejected DP adaptive attempts must preserve the committed state signature.'));
1443
+ }
1444
+ }
1445
+ if (attempt.accepted === true && attempt.terminationReason !== 'converged') {
1446
+ findings.push(finding('blocker', `${prefix}.accepted-not-converged`, 'Accepted DP adaptive attempts must terminate with converged.'));
1447
+ }
1448
+ }
1449
+ }
1450
+ if (!Array.isArray(adaptive.blockerCodes)) {
1451
+ findings.push(finding('blocker', 'result.dp-adaptive.blocker-codes.invalid', 'DP adaptive blockerCodes must be an array.'));
1452
+ }
1453
+ else if (adaptive.blockerCodes.length > 0) {
1454
+ findings.push(finding('blocker', 'result.dp-adaptive.blocker-codes-not-empty', 'Accepted DP adaptive metadata must not include blocker codes.'));
1455
+ }
1456
+ const solverLoadStepsOk = pushFiniteNumberFinding(findings, envelope.solverLoadSteps, 'result.envelope.dp.solver-load-steps', 'DP envelope solver load steps', { positive: true });
1457
+ const solverIterationsOk = pushFiniteNumberFinding(findings, envelope.solverIterations, 'result.envelope.dp.solver-iterations', 'DP envelope solver iterations', { nonNegative: true });
1458
+ const solverResidualOk = pushFiniteNumberFinding(findings, envelope.maxSolverResidualRatio, 'result.envelope.dp.max-solver-residual-ratio', 'DP envelope max solver residual ratio', { nonNegative: true });
1459
+ const yieldResidualOk = pushFiniteNumberFinding(findings, envelope.maxYieldResidualRatio, 'result.envelope.dp.max-yield-residual-ratio', 'DP envelope max yield residual ratio', { nonNegative: true });
1460
+ pushFiniteNumberFinding(findings, envelope.nonlinearPlasticStrain, 'result.envelope.dp.nonlinear-plastic-strain', 'DP envelope nonlinear plastic strain', { nonNegative: true });
1461
+ const dofCountOk = pushFiniteNumberFinding(findings, envelope.planeStrainDofCount, 'result.envelope.dp.dof-count', 'DP envelope DOF count', { positive: true });
1462
+ const freeDofCountOk = pushFiniteNumberFinding(findings, envelope.planeStrainFreeDofCount, 'result.envelope.dp.free-dof-count', 'DP envelope free DOF count', { positive: true });
1463
+ const constrainedDofCountOk = pushFiniteNumberFinding(findings, envelope.planeStrainConstrainedDofCount, 'result.envelope.dp.constrained-dof-count', 'DP envelope constrained DOF count', { positive: true });
1464
+ const plasticGaussPointCountOk = pushFiniteNumberFinding(findings, envelope.plasticGaussPointCount, 'result.envelope.dp.plastic-gauss-point-count', 'DP envelope plastic Gauss-point count', { nonNegative: true });
1465
+ pushFiniteNumberFinding(findings, envelope.maxEquivalentPlasticStrain, 'result.envelope.dp.max-equivalent-plastic-strain', 'DP envelope max equivalent plastic strain', { nonNegative: true });
1466
+ pushFiniteNumberFinding(findings, envelope.maxEquivalentPlasticStrainIncrement, 'result.envelope.dp.max-equivalent-plastic-strain-increment', 'DP envelope max equivalent plastic strain increment', { nonNegative: true });
1467
+ const adaptiveAttemptCountOk = pushFiniteNumberFinding(findings, envelope.adaptiveAttemptCount, 'result.envelope.dp.adaptive-attempt-count', 'DP envelope adaptive attempt count', { positive: true });
1468
+ const adaptiveAcceptedStepCountOk = pushFiniteNumberFinding(findings, envelope.adaptiveAcceptedStepCount, 'result.envelope.dp.adaptive-accepted-step-count', 'DP envelope adaptive accepted step count', { positive: true });
1469
+ const adaptiveRejectedAttemptCountOk = pushFiniteNumberFinding(findings, envelope.adaptiveRejectedAttemptCount, 'result.envelope.dp.adaptive-rejected-attempt-count', 'DP envelope adaptive rejected attempt count', { nonNegative: true });
1470
+ const adaptiveCutbackCountOk = pushFiniteNumberFinding(findings, envelope.adaptiveCutbackCount, 'result.envelope.dp.adaptive-cutback-count', 'DP envelope adaptive cutback count', { nonNegative: true });
1471
+ const adaptiveMaxCutbackDepthOk = pushFiniteNumberFinding(findings, envelope.adaptiveMaxCutbackDepth, 'result.envelope.dp.adaptive-max-cutback-depth', 'DP envelope adaptive max cutback depth', { nonNegative: true });
1472
+ for (const [ok, value, code, label] of [
1473
+ [solverLoadStepsOk, envelope.solverLoadSteps, 'solver-load-steps', 'solver load steps'],
1474
+ [solverIterationsOk, envelope.solverIterations, 'solver-iterations', 'solver iterations'],
1475
+ [dofCountOk, envelope.planeStrainDofCount, 'dof-count', 'DOF count'],
1476
+ [freeDofCountOk, envelope.planeStrainFreeDofCount, 'free-dof-count', 'free DOF count'],
1477
+ [constrainedDofCountOk, envelope.planeStrainConstrainedDofCount, 'constrained-dof-count', 'constrained DOF count'],
1478
+ [plasticGaussPointCountOk, envelope.plasticGaussPointCount, 'plastic-gauss-point-count', 'plastic Gauss-point count'],
1479
+ [adaptiveAttemptCountOk, envelope.adaptiveAttemptCount, 'adaptive-attempt-count', 'adaptive attempt count'],
1480
+ [adaptiveAcceptedStepCountOk, envelope.adaptiveAcceptedStepCount, 'adaptive-accepted-step-count', 'adaptive accepted step count'],
1481
+ [adaptiveRejectedAttemptCountOk, envelope.adaptiveRejectedAttemptCount, 'adaptive-rejected-attempt-count', 'adaptive rejected attempt count'],
1482
+ [adaptiveCutbackCountOk, envelope.adaptiveCutbackCount, 'adaptive-cutback-count', 'adaptive cutback count'],
1483
+ [adaptiveMaxCutbackDepthOk, envelope.adaptiveMaxCutbackDepth, 'adaptive-max-cutback-depth', 'adaptive max cutback depth'],
1484
+ ]) {
1485
+ if (ok && !Number.isInteger(value)) {
1486
+ findings.push(finding('blocker', `result.envelope.dp.${code}.integer`, `DP envelope ${label} must be an integer.`));
1487
+ }
1488
+ }
1489
+ if (solverLoadStepsOk && acceptedStepCountOk && envelope.solverLoadSteps !== adaptive.acceptedStepCount) {
1490
+ findings.push(finding('blocker', 'result.envelope.dp.solver-load-steps-adaptive-mismatch', 'DP envelope solver load steps must match adaptive acceptedStepCount.'));
1491
+ }
1492
+ if (adaptiveAttemptCountOk && attemptedStepCountOk && envelope.adaptiveAttemptCount !== adaptive.attemptedStepCount) {
1493
+ findings.push(finding('blocker', 'result.envelope.dp.adaptive-attempt-count-mismatch', 'DP envelope adaptive attempt count must match adaptive metadata.'));
1494
+ }
1495
+ if (adaptiveAcceptedStepCountOk && acceptedStepCountOk && envelope.adaptiveAcceptedStepCount !== adaptive.acceptedStepCount) {
1496
+ findings.push(finding('blocker', 'result.envelope.dp.adaptive-accepted-step-count-mismatch', 'DP envelope adaptive accepted step count must match adaptive metadata.'));
1497
+ }
1498
+ if (adaptiveCutbackCountOk && cutbackCountOk && envelope.adaptiveCutbackCount !== adaptive.cutbackCount) {
1499
+ findings.push(finding('blocker', 'result.envelope.dp.adaptive-cutback-count-mismatch', 'DP envelope adaptive cutback count must match adaptive metadata.'));
1500
+ }
1501
+ if (adaptiveMaxCutbackDepthOk && maxCutbackDepthOk && envelope.adaptiveMaxCutbackDepth !== adaptive.maxCutbackDepth) {
1502
+ findings.push(finding('blocker', 'result.envelope.dp.adaptive-max-cutback-depth-mismatch', 'DP envelope adaptive max cutback depth must match adaptive metadata.'));
1503
+ }
1504
+ if (dofCountOk && freeDofCountOk && constrainedDofCountOk && envelope.planeStrainFreeDofCount + envelope.planeStrainConstrainedDofCount !== envelope.planeStrainDofCount) {
1505
+ findings.push(finding('blocker', 'result.envelope.dp.dof-count-mismatch', 'DP free and constrained DOF counts must sum to the total DOF count.'));
1506
+ }
1507
+ if (solverResidualOk && envelope.maxSolverResidualRatio > solverTolerances.forceBalanceTolerance) {
1508
+ findings.push(finding('blocker', 'result.envelope.dp.solver-residual-too-large', 'DP solver residual exceeds the force-balance tolerance.'));
1509
+ }
1510
+ if (yieldResidualOk && envelope.maxYieldResidualRatio > solverTolerances.residualTolerance) {
1511
+ findings.push(finding('blocker', 'result.envelope.dp.yield-residual-too-large', 'DP yield residual exceeds the material return-map tolerance.'));
1512
+ }
1513
+ }
1269
1514
  function validateResultEnvelopeSemantics(findings, manifest) {
1270
1515
  const { envelope, analysisCase } = manifest;
1271
1516
  const maxSettlementOk = pushFiniteNumberFinding(findings, envelope.maxSettlementMm, 'result.envelope.max-settlement', 'Envelope max settlement', { nonNegative: true });
@@ -1278,7 +1523,7 @@ function validateResultEnvelopeSemantics(findings, manifest) {
1278
1523
  }
1279
1524
  const expectedBackendByObjective = new Map([
1280
1525
  ['foundation_settlement', ['builtin-elastic3d-demo']],
1281
- ['excavation_deformation', ['builtin-staged-excavation-demo']],
1526
+ ['excavation_deformation', ['builtin-staged-excavation-demo', FEM_PLANE_STRAIN_DP_ADAPTIVE_BACKEND_ID]],
1282
1527
  ['tunnel_volume_loss_settlement', ['builtin-tunnel-volume-loss-demo']],
1283
1528
  ['staged_settlement_consolidation', ['builtin-staged-consolidation-1d', 'builtin-nonlinear-column-v0']],
1284
1529
  ['seepage_groundwater_coupling', ['builtin-biot-up-plane-strain-v0']],
@@ -1287,6 +1532,26 @@ function validateResultEnvelopeSemantics(findings, manifest) {
1287
1532
  if (expectedBackends && !expectedBackends.includes(manifest.backend.id)) {
1288
1533
  findings.push(finding('blocker', 'result.backend.objective-mismatch', 'Result backend must match the embedded FEM objective.'));
1289
1534
  }
1535
+ if (analysisCase.objective !== 'seepage_groundwater_coupling') {
1536
+ if (manifest.pressureAudit != null) {
1537
+ findings.push(finding('blocker', 'result.pressure-audit.unexpected', 'Pressure audit is only valid for Biot u-p seepage result manifests.'));
1538
+ }
1539
+ if (manifest.biotTransientAcceptance != null) {
1540
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.unexpected', 'Biot transient acceptance metadata is only valid for Biot u-p seepage result manifests.'));
1541
+ }
1542
+ }
1543
+ const isPlaneStrainDpAdaptiveManifest = manifest.backend.id === FEM_PLANE_STRAIN_DP_ADAPTIVE_BACKEND_ID;
1544
+ if (!isPlaneStrainDpAdaptiveManifest && manifest.adaptiveLoadStepping != null) {
1545
+ findings.push(finding('blocker', 'result.dp-adaptive.unexpected', 'Drucker-Prager adaptive metadata is only valid for plane-strain DP adaptive result manifests.'));
1546
+ }
1547
+ if (isPlaneStrainDpAdaptiveManifest) {
1548
+ if (analysisCase.analysisType !== FEM_PLANE_STRAIN_DP_ANALYSIS_TYPE) {
1549
+ findings.push(finding('blocker', 'result.dp-adaptive.analysis-type-mismatch', 'Plane-strain DP adaptive manifests require static_2d_plane_strain_drucker_prager analysis cases.'));
1550
+ }
1551
+ if (analysisCase.mesh.elementType !== 'quad4_plane_strain') {
1552
+ findings.push(finding('blocker', 'result.dp-adaptive.mesh-type-mismatch', 'Plane-strain DP adaptive manifests require quad4_plane_strain mesh cases.'));
1553
+ }
1554
+ }
1290
1555
  if (analysisCase.objective === 'foundation_settlement') {
1291
1556
  const raft = analysisCase.geometry.raft;
1292
1557
  if (!raft)
@@ -1336,6 +1601,13 @@ function validateResultEnvelopeSemantics(findings, manifest) {
1336
1601
  if (maxSettlementOk && maxSurfaceOk) {
1337
1602
  pushApproximateMatchFinding(findings, envelope.maxSettlementMm, maxSurfaceSettlementMm, 'result.envelope.excavation-max-settlement-mismatch', 'Excavation max settlement', 0.001);
1338
1603
  }
1604
+ if (isPlaneStrainDpAdaptiveManifest) {
1605
+ const expectedDpLoadSteps = Number.isInteger(envelope.solverLoadSteps) && envelope.solverLoadSteps > 0
1606
+ ? envelope.solverLoadSteps
1607
+ : undefined;
1608
+ const solverTolerances = validateNonlinearSolverConvergenceReport(findings, manifest, expectedDpLoadSteps);
1609
+ validatePlaneStrainDpAdaptiveAcceptance(findings, manifest, solverTolerances);
1610
+ }
1339
1611
  return;
1340
1612
  }
1341
1613
  if (analysisCase.objective === 'tunnel_volume_loss_settlement') {
@@ -1506,9 +1778,63 @@ function validateResultEnvelopeSemantics(findings, manifest) {
1506
1778
  pushApproximateMatchFinding(findings, pressureAudit.freePorePressureResidualL1M3PerS, envelope.freePorePressureResidualL1M3PerS, 'result.pressure-audit.free-residual-envelope-mismatch', 'Pressure-audit free residual', 1e-12);
1507
1779
  pushApproximateMatchFinding(findings, pressureAudit.prescribedPorePressureResidualL1M3PerS, envelope.prescribedPorePressureResidualL1M3PerS, 'result.pressure-audit.prescribed-residual-envelope-mismatch', 'Pressure-audit prescribed residual', 1e-12);
1508
1780
  }
1509
- }
1510
- else if (manifest.pressureAudit != null) {
1511
- findings.push(finding('blocker', 'result.pressure-audit.unexpected', 'Pressure audit is only valid for Biot u-p seepage result manifests.'));
1781
+ const transientAcceptance = manifest.biotTransientAcceptance;
1782
+ if (!transientAcceptance) {
1783
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.missing', 'Biot result manifests must include transient acceptance metadata.'));
1784
+ }
1785
+ else {
1786
+ if (transientAcceptance.schemaVersion !== 'fem-plane-strain-biot-transient-acceptance.v1') {
1787
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.schema.unsupported', 'Unsupported Biot transient acceptance schema.'));
1788
+ }
1789
+ if (transientAcceptance.accepted !== true) {
1790
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.not-accepted', 'Biot transient acceptance must be accepted before publishing a preview manifest.'));
1791
+ }
1792
+ if (transientAcceptance.dissipationCheckMode !== 'drained-dissipation' &&
1793
+ transientAcceptance.dissipationCheckMode !== 'prescribed-gradient-relaxation') {
1794
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.mode.invalid', 'Biot transient acceptance mode is invalid.'));
1795
+ }
1796
+ const acceptedStepCountOk = pushFiniteNumberFinding(findings, transientAcceptance.acceptedStepCount, 'result.biot-transient-acceptance.accepted-step-count', 'Biot transient accepted step count', { positive: true });
1797
+ const requiredStepCountOk = pushFiniteNumberFinding(findings, transientAcceptance.requiredStepCount, 'result.biot-transient-acceptance.required-step-count', 'Biot transient required step count', { positive: true });
1798
+ const maxResidualOk = pushFiniteNumberFinding(findings, transientAcceptance.maxResidualNormRatio, 'result.biot-transient-acceptance.max-residual-ratio', 'Biot transient maximum residual ratio', { nonNegative: true });
1799
+ const maxMassBalanceOk = pushFiniteNumberFinding(findings, transientAcceptance.maxMassBalanceErrorRatio, 'result.biot-transient-acceptance.max-mass-balance-ratio', 'Biot transient maximum mass-balance ratio', { nonNegative: true });
1800
+ pushFiniteNumberFinding(findings, transientAcceptance.maxPressureOvershootKpa, 'result.biot-transient-acceptance.max-pressure-overshoot', 'Biot transient maximum pressure overshoot', { nonNegative: true });
1801
+ const finalDissipationOk = pushFiniteNumberFinding(findings, transientAcceptance.finalPorePressureDissipationRatio, 'result.biot-transient-acceptance.final-dissipation-ratio', 'Biot transient final pore-pressure dissipation ratio', { nonNegative: true });
1802
+ if (acceptedStepCountOk && timeStepCountOk && transientAcceptance.acceptedStepCount !== envelope.timeStepCount) {
1803
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.accepted-step-count-mismatch', 'Biot accepted step count must match the envelope time-step count.'));
1804
+ }
1805
+ if (requiredStepCountOk && transientAcceptance.requiredStepCount < FEM_MIN_BIOT_TRANSIENT_STEPS) {
1806
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.required-step-count-too-small', 'Biot required transient step count is below the preview policy.'));
1807
+ }
1808
+ if (acceptedStepCountOk && requiredStepCountOk && transientAcceptance.acceptedStepCount < transientAcceptance.requiredStepCount) {
1809
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.accepted-step-count-too-small', 'Biot accepted step count is below the required transient step count.'));
1810
+ }
1811
+ if (maxResidualOk && transientAcceptance.maxResidualNormRatio > 1e-3) {
1812
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.max-residual-too-large', 'Biot transient maximum residual ratio exceeds the preview tolerance.'));
1813
+ }
1814
+ if (maxMassBalanceOk && transientAcceptance.maxMassBalanceErrorRatio > 1e-3) {
1815
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.max-mass-balance-too-large', 'Biot transient maximum mass-balance ratio exceeds the preview tolerance.'));
1816
+ }
1817
+ if (finalDissipationOk && dissipationRatioOk) {
1818
+ pushApproximateMatchFinding(findings, transientAcceptance.finalPorePressureDissipationRatio, envelope.porePressureDissipationRatio, 'result.biot-transient-acceptance.final-dissipation-envelope-mismatch', 'Biot transient final dissipation ratio', 1e-12);
1819
+ }
1820
+ if (transientAcceptance.dissipationCheckMode === 'drained-dissipation' &&
1821
+ transientAcceptance.monotonicAverageFreePressureDissipationRequired !== true) {
1822
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.drained-monotonic-required', 'Drained-dissipation Biot acceptance must require monotonic average free pore-pressure dissipation.'));
1823
+ }
1824
+ if (transientAcceptance.monotonicAverageFreePressureDissipationRequired &&
1825
+ transientAcceptance.monotonicAverageFreePressureDissipation !== true) {
1826
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.average-free-pressure-not-monotonic', 'Required average free pore-pressure dissipation was not monotonic.'));
1827
+ }
1828
+ if (transientAcceptance.monotonicMaxPressureEnvelope !== true) {
1829
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.max-pressure-not-monotonic', 'Biot maximum pore-pressure envelope must be monotonic non-increasing.'));
1830
+ }
1831
+ if (!Array.isArray(transientAcceptance.blockerCodes)) {
1832
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.blocker-codes.invalid', 'Biot transient acceptance blocker codes must be an array.'));
1833
+ }
1834
+ else if (transientAcceptance.accepted && transientAcceptance.blockerCodes.length > 0) {
1835
+ findings.push(finding('blocker', 'result.biot-transient-acceptance.blocker-codes-not-empty', 'Accepted Biot transient metadata must not include blocker codes.'));
1836
+ }
1837
+ }
1512
1838
  }
1513
1839
  }
1514
1840
  export function validateFemResultManifest(manifest) {
@@ -1545,6 +1871,7 @@ export function validateFemResultManifest(manifest) {
1545
1871
  'builtin-staged-consolidation-1d',
1546
1872
  'builtin-nonlinear-column-v0',
1547
1873
  'builtin-biot-up-plane-strain-v0',
1874
+ FEM_PLANE_STRAIN_DP_ADAPTIVE_BACKEND_ID,
1548
1875
  ]);
1549
1876
  if (!validBackendIds.has(manifest.backend.id)) {
1550
1877
  findings.push(finding('blocker', 'result.backend.id-invalid', `Unsupported FEM result backend: ${String(manifest.backend.id)}.`));
@@ -1558,6 +1885,12 @@ export function validateFemResultManifest(manifest) {
1558
1885
  if (!isNonEmptyString(manifest.backend.version)) {
1559
1886
  findings.push(finding('blocker', 'result.backend.version.missing', 'Result backend version must be a non-empty string.'));
1560
1887
  }
1888
+ if (manifest.productionReady === true) {
1889
+ findings.push(finding('blocker', 'result.production-ready.overclaim', 'FEM result manifests must not claim productionReady true in strong-beta preview mode.'));
1890
+ }
1891
+ if (manifest.backend.productionReady === true) {
1892
+ findings.push(finding('blocker', 'result.backend.production-ready.overclaim', 'FEM result backends must not claim productionReady true in strong-beta preview mode.'));
1893
+ }
1561
1894
  for (const [key, value] of Object.entries(manifest.envelope)) {
1562
1895
  if (!Number.isFinite(value)) {
1563
1896
  findings.push(finding('blocker', `result.envelope.${key}.non-finite`, `Envelope value ${key} must be finite.`));