import type { DataOperation } from "./dataCapabilities.js"; import { DIAGNOSTIC_EXECUTION_BOUNDARY_LIMITS, diagnosticExecutionRequestSchema } from "./diagnosticExecutionContracts.js"; import { validateDiagnosticExecutionRequest, validateCompactDiagnosticExecutionRequest } from "./diagnosticInput.js"; import { MAX_DIAGNOSTIC_DEFINITION_EXPRESSION_NODES, MAX_DIAGNOSTIC_EXPRESSION_DEPTH, MAX_DIAGNOSTIC_EXPRESSION_NODES, type AnalysisReviewFinding } from "@actuarial-ts/core"; import * as views from "./diagnosticViewContracts.js"; const common = { nativePackage: "@actuarial-ts/data" as const, kind: "diagnostic" as const, input: "DiagnosticExecutionRequest", contract: null, parser: "parseDiagnosticExecutionRequest", schemaName: "diagnosticExecutionRequestSchema", schema: diagnosticExecutionRequestSchema, fields: ["source", "limits"], limits: DIAGNOSTIC_EXECUTION_BOUNDARY_LIMITS, work: "source-preparation" as const, checked: ["safe-finite-json-and-native-input-validation", "compiled-definition-units-populations-and-bases", "native-row-grain-filter-and-grouping-validation", "resolved-native-gate-policy", "raw-row-prepared-cell-and-expansion-budgets", "native-preparation-findings", "mandatory-cumulative-inception-zero-before-filtering", "calendar-inception-offset-compatibility", "exact-safe-development-age-arithmetic"], deferred: ["review-and-metric-gate-outcomes", "calculated-metric-values-and-rule-signals", "complete-output-evidence-size", "source-and-revision-authenticity", "actuarial-suitability", "independent-validation", "publication-readiness"], coordinates: ["sourceGroup", "group", "origin", "valuation", "developmentAge", "instanceId", "ruleId", "measureId"], originKinds: ["declared-calendar-or-ordered-axis-labels"], temporalStructures: ["native-calendar-cadences-and-anchors", "declared-ordered-coordinates-offset-and-age-unit"], source: "native-loss-exposure-and-expected-cell-records", replay: [], unitRule: "The native compiler checks formula operand units and semantic references; calculation units remain separate from presentation scaling", populationRule: "Native count/exposure populations and grouping declarations govern calculations; matching coordinate labels do not prove real population membership", financialRule: "Declared amount bases, components and limits retain native compiler compatibility checks; no additional financial adjustment is inferred", costQualification: "Preflight compiles and prepares records, then bounds dense metric positions and authored review evaluations. Bounds include expected coordinates and conservatively ignore output-group filters. They do not count all expression work or bound evidence bytes, latency or peak memory; core expression and safe-JSON limits also apply", options: [ { path: "source.policy.allowedReviewStatuses", choices: ["pass", "warning", "not-evaluated", "fail"], default: ["pass", "warning", "not-evaluated"], description: "Existing native default when omitted; allowing fail requires an explicit rationaleRef. Empty arrays are retained" }, { path: "source.policy.allowedMetricFindingSeverities", choices: ["info", "warning", "fail"], default: ["info", "warning"], description: "Existing native default when omitted; structural findings remain subject to native review rules, not this metric gate" }, { path: "source.filter", choices: ["omitted", "native-filter"], default: null, description: "Omission is unfiltered; no age, valuation, completeness cutoff or grouping policy is invented" }, { path: "source.definition.periodAxis.kind", choices: ["calendar", "ordered"], default: null, description: "Required native axis; cumulative calendar ages must align with origin inception. Ordered axes retain declared coordinates and units. No historical knowledge is inferred" }, ], }; const view = { ...common, kind: "transformation" as const, work: "statistic-calculation" as const, checked: [...common.checked, "native-review-and-metric-gate-execution", "actual-native-maturity-selection"], deferred: ["complete-output-evidence-size", "source-and-revision-authenticity", "common-population-and-financial-basis-across-output-groups", "actuarial-suitability", "independent-validation", "publication-readiness"], options: [...common.options.map((option) => ({ ...option, path: `execution.${option.path}` })), { path: "storage", choices: ["eager", "compact"], default: null, description: "Required choice; compact execution and view selection do not materialize preparation identity" }], costQualification: "Preflight performs the complete bounded diagnostic execution and native maturity selection. It can be as expensive as execution; it does not fit reserve-model estimators. Expansion/input limits are structural ceilings, not measured latency, evidence-byte or peak-memory guarantees", limitations: ["Preflight executes the complete bounded native diagnostic run and maturity selection; it does not fit a reserve model", "A blocked review or metric gate yields a null view while retaining the actual blocked run and its evidence", "Selecting common coordinates does not establish population comparability, equal data quality or historical information availability", "Native development coordinates and age unit come from the declared axis; no interpolation, annualization or calendar reinterpretation is performed"], }; function viewFindings(run: { status: string }, empty: boolean): { findings: AnalysisReviewFinding[]; requiresInput: boolean } { return { requiresInput: run.status !== "completed", findings: run.status !== "completed" ? [{ code: "DIAGNOSTIC_EXECUTION_GATE_BLOCKED", path: "$.execution.source", message: "A native execution gate blocked the requested maturity view", remedies: ["Inspect the retained native gate, review findings and explicit policy; do not silently relax it"] }] : empty ? [{ code: "DIAGNOSTIC_MATURITY_UNAVAILABLE", path: "$", message: "No native coordinates meet the declared maturity/group selection", remedies: ["Inspect available native ages and groups; no missing coordinate is interpolated or set to zero"] }] : [] }; } export function generalizedDiagnosticCapabilities(): readonly DataOperation[] { return [ { ...common, id: "diagnostics.generalized", native: "runValidatedMetricDiagnostics", entry: "runMetricDiagnosticsFromInput", validator: "validateDiagnosticExecutionRequest", output: "ValidatedMetricDiagnosticsOutcome", limitations: ["Preflight prepares eager inputs and reports native findings without executing diagnostic gates or certifying metric results", "Execution returns the original authenticated native outcome; serialization cannot recreate completed-run authority", "Missing/zero/nonpositive denominators follow the declared native formula policy and remain unavailable when ineligible; no display or gate policy fabricates a metric", "This boundary requires finite JSON. Native standalone validation remains the route for reviewing nonfinite raw JavaScript observations", "Cumulative inception zero is mandatory before filtering; origin-static whole-cohort exposure is exempt. Calendar offsets must align with inception, and ordered coordinates retain their authored meaning"], evaluate: validateDiagnosticExecutionRequest }, { ...common, id: "diagnostics.generalized-compact", native: "runValidatedMetricDiagnosticsCompact", entry: "runMetricDiagnosticsCompactFromInput", validator: "validateCompactDiagnosticExecutionRequest", output: "CompactMetricDiagnosticsOutcome", limitations: ["Preflight uses compact preparation without materializing preparation identities or running review/metric gates", "Execution retains original compact ownership and complete opaque review stores. Serialized visible summaries are not complete evidence or an authenticated receipt", "Use the existing native paging/materialization APIs explicitly; this entry does not silently expand compact evidence or claim a serialized output-size limit", "This boundary requires finite JSON; native raw-number review and declared temporal-axis qualifications still apply"], evaluate: validateCompactDiagnosticExecutionRequest }, { ...common, id: "diagnostics.definition", native: "compileDiagnosticDefinition", nativePackage: "@actuarial-ts/core", entry: "compileDiagnosticDefinitionFromInput", validator: "compileDiagnosticDefinitionFromInput", parser: "parseDiagnosticDefinitionRequest", schemaName: "diagnosticDefinitionRequestSchema", schema: views.diagnosticDefinitionRequestSchema, input: "DiagnosticDefinitionRequest", output: "CompiledDiagnosticDefinition", fields: ["definition", "limits"], work: "request-validation", limits: { maximumInputCharacters: DIAGNOSTIC_EXECUTION_BOUNDARY_LIMITS.maximumInputCharacters, maximumJsonDepth: DIAGNOSTIC_EXECUTION_BOUNDARY_LIMITS.maximumJsonDepth, maximumJsonNodes: DIAGNOSTIC_EXECUTION_BOUNDARY_LIMITS.maximumJsonNodes, maximumExpressionDepth: MAX_DIAGNOSTIC_EXPRESSION_DEPTH, maximumExpressionNodes: MAX_DIAGNOSTIC_EXPRESSION_NODES, maximumDefinitionExpressionNodes: MAX_DIAGNOSTIC_DEFINITION_EXPRESSION_NODES }, checked: ["safe-finite-json-and-input-budget", "native-definition-structure-and-expression-limits", "native-units-populations-bases-and-reference-binding", "native-period-axis-and-rule-compilation", "calendar-inception-offset-compatibility"], deferred: ["actual-source-rows-and-population-membership", "data-preparation-and-grouping", "gate-outcomes-and-metric-values", "source-authenticity", "publication-readiness"], coordinates: ["measureId", "formulaId", "instanceId", "ruleId"], options: [], source: "authored-native-diagnostic-definition", limitations: ["Uses the actual native compiler and returns its original owned definition; eligibility does not establish available or valid source records", "Compiled fingerprints identify declared semantics and formulas; they do not independently verify populations, source records or review completeness"], costQualification: "Preflight performs native compilation, expression validation and identity calculation under the listed structural/input ceilings; no record preparation, diagnostics or reserve-model fit is run", evaluate(input) { views.compileDiagnosticDefinitionFromInput(input); return { findings: [] }; } }, { ...view, id: "diagnostics.same-maturity", native: "sameMaturity", nativePackage: "@actuarial-ts/core", entry: "sameMaturityDiagnosticsFromInput", parser: "parseDiagnosticMaturityRequest", schemaName: "diagnosticMaturityRequestSchema", schema: views.diagnosticMaturityRequestSchema, input: "DiagnosticMaturityRequest", output: "DiagnosticMaturityView", fields: ["execution", "storage", "developmentAge"], options: [...view.options, { path: "developmentAge", choices: [], default: null, description: "Required nonnegative safe integer in the native declared axis; no interpolation" }, { path: "outputGroups", choices: ["omitted", "explicit-groups"], default: null, description: "Omission selects all produced groups; an explicit empty array selects none" }], evaluate(input) { const result = views.sameMaturityDiagnosticsFromInput(input); return viewFindings(result.run, result.points?.length === 0); } }, { ...view, id: "diagnostics.common-maturity", native: "commonMaturity", nativePackage: "@actuarial-ts/core", entry: "commonMaturityDiagnosticsFromInput", parser: "parseDiagnosticCommonMaturityRequest", schemaName: "diagnosticCommonMaturityRequestSchema", schema: views.diagnosticCommonMaturityRequestSchema, input: "DiagnosticCommonMaturityRequest", output: "DiagnosticCommonMaturityView", fields: ["execution", "storage", "outputGroups"], options: [...view.options, { path: "outputGroups", choices: ["explicit-groups"], default: null, description: "Required actual output groups; duplicates are normalized by the native view. Empty input or no shared age returns an unavailable maturity" }], evaluate(input) { const result = views.commonMaturityDiagnosticsFromInput(input); return viewFindings(result.run, result.view?.developmentAge === null); } }, ]; }