{
  "capability_id": "electrical.rf.antenna_length",
  "tool_id": "antenna-length",
  "engine": "antenna-length",
  "calculation_version": "1.0.3",
  "generated_at": "2026-09-16T22:03:43.726Z",
  "engine_build": "2026-09-10",
  "test_count": 28,
  "passed": 28,
  "failed": 0,
  "tests_summary": {
    "golden": {
      "total": 5,
      "passed": 5
    },
    "boundary": {
      "total": 10,
      "passed": 10
    },
    "property": {
      "total": 13,
      "passed": 13
    }
  },
  "engine_tested": true,
  "expert_reviewed": true,
  "internally_reviewed": false,
  "review_kind": "expert",
  "source_checked": true,
  "reviewed_by": "CalculatorX electrical review",
  "reviewer_role": "electrical-engineer",
  "last_reviewed": "2026-09-05",
  "expert_review": {
    "status": "approved",
    "reviewer": {
      "name": "CalculatorX electrical review",
      "role": "electrical-engineer"
    },
    "reviewed_at": "2026-09-05",
    "scope": [
      "formula",
      "input semantics",
      "assumptions",
      "limitations",
      "sources",
      "tests"
    ],
    "kind": "expert"
  },
  "internal_review": {
    "status": "not_applicable",
    "reviewer": null
  },
  "page": "https://www.calculatorx.com/calc/electric/antenna-length",
  "api": "https://www.calculatorx.com/api/v1/calc/antenna-length",
  "schema_input": "https://www.calculatorx.com/schemas/electrical.rf.antenna_length.input.json",
  "schema_output": "https://www.calculatorx.com/schemas/electrical.rf.antenna_length.output.json",
  "assumptions": [
    "Straight idealized antenna element.",
    "Frequency is the intended resonant/design frequency.",
    "No loading coils or distributed reactive loading.",
    "No explicit ground, nearby-object, conductor-diameter, or end-effect model.",
    "Correction factor k is a scalar length adjustment, not a transmission-line velocity factor.",
    "Quarter-wave mode is the ideal monopole radiator length over a perfect image plane / ground plane (≈ λ₀/4); radials and real soil are not modeled.",
    "Wavelength mode returns L = k·λ₀ (corrected 1λ), which equals free-space λ₀ only when k=1.",
    "S = k·λ₀ is a corrected design length scale, not a physical EM wavelength in a medium."
  ],
  "limitations": [
    "Not a full antenna model — no ground, diameter, end-effect, loading coils, or NEC geometry."
  ],
  "boundary_conditions": [
    "f≤0 → VALUE_MUST_BE_POSITIVE",
    "non-finite λ/L → VALUE_OUT_OF_RANGE",
    "k∉(0,1] → FRACTION_OUT_OF_RANGE",
    "invalid mode → INVALID_MODE",
    "length_factor ≠ velocity_factor when both sent → CONFLICTING_INPUTS"
  ],
  "sources": [
    {
      "title": "NIST / CODATA — speed of light in vacuum",
      "section": "c = 299 792 458 m/s (exact)",
      "url": "https://physics.nist.gov/cuu/Constants/Value/c.html",
      "supports": "λ₀ = c/f",
      "kind": "definition",
      "publisher": "NIST"
    },
    {
      "title": "ARRL — Single Band Dipoles",
      "section": "Empirical 468/f_MHz resonant-wire length; leave extra and trim to SWR",
      "url": "https://www.arrl.org/single-band-dipoles",
      "supports": "Practical wire dipoles are shorter than free-space λ₀/2; this tool uses k=1 unless the user supplies a shortening factor",
      "kind": "reference",
      "publisher": "ARRL"
    },
    {
      "title": "ARRL — Ground-plane Antennas for 144, 222 and 440 MHz",
      "section": "¼-λ ground-plane antenna; radiator ≈ λ/4 over a ground-plane / radial system",
      "url": "https://www.arrl.org/files/file/Technology/tis/info/pdf/ab18-16.pdf",
      "supports": "mode=quarter ideal radiator length scale; real radials and soil are out of scope",
      "kind": "reference",
      "publisher": "ARRL"
    }
  ],
  "methods": [],
  "fingerprint": "sha256:fc89c239085f6e1a743b3d35d8b7e8fdeafe47ae9c4f6238ce467904272f741d",
  "tests": [
    {
      "id": "half-c",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "half",
        "f_Hz": 299792458,
        "length_factor": 1
      },
      "expect": {
        "L_m": 0.5,
        "corrected_length_scale_m": 1
      },
      "expectWarning": null,
      "actual": {
        "mode": "half",
        "f_Hz": 299792458,
        "length_factor": 1,
        "velocity_factor": 1,
        "lambda_free_space_m": 1,
        "corrected_length_scale_m": 1,
        "lambda_effective_m": 1,
        "lambda_m": 1,
        "L_m": 0.5,
        "L_ft": 1.6404199475065615,
        "L_leg_m": 0.25
      },
      "tol": 1e-9
    },
    {
      "id": "quarter",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "quarter",
        "f_Hz": 299792458,
        "length_factor": 1
      },
      "expect": {
        "L_m": 0.25
      },
      "expectWarning": null,
      "actual": {
        "mode": "quarter",
        "f_Hz": 299792458,
        "length_factor": 1,
        "velocity_factor": 1,
        "lambda_free_space_m": 1,
        "corrected_length_scale_m": 1,
        "lambda_effective_m": 1,
        "lambda_m": 1,
        "L_m": 0.25,
        "L_ft": 0.8202099737532808,
        "L_leg_m": null
      },
      "tol": 1e-9
    },
    {
      "id": "k-half",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "half",
        "f_Hz": 299792458,
        "length_factor": 0.66
      },
      "expect": {
        "L_m": 0.33,
        "lambda_free_space_m": 1,
        "corrected_length_scale_m": 0.66
      },
      "expectWarning": null,
      "actual": {
        "mode": "half",
        "f_Hz": 299792458,
        "length_factor": 0.66,
        "velocity_factor": 0.66,
        "lambda_free_space_m": 1,
        "corrected_length_scale_m": 0.66,
        "lambda_effective_m": 0.66,
        "lambda_m": 0.66,
        "L_m": 0.33,
        "L_ft": 1.0826771653543308,
        "L_leg_m": 0.165
      },
      "tol": 1e-9
    },
    {
      "id": "half-146mhz",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "half",
        "f_Hz": 146000000,
        "length_factor": 1
      },
      "expect": {
        "L_m": 1.0266865,
        "L_leg_m": 0.51334325,
        "lambda_free_space_m": 2.053373,
        "corrected_length_scale_m": 2.053373
      },
      "expectWarning": null,
      "actual": {
        "mode": "half",
        "f_Hz": 146000000,
        "length_factor": 1,
        "velocity_factor": 1,
        "lambda_free_space_m": 2.053373,
        "corrected_length_scale_m": 2.053373,
        "lambda_effective_m": 2.053373,
        "lambda_m": 2.053373,
        "L_m": 1.0266865,
        "L_ft": 3.368394028871391,
        "L_leg_m": 0.51334325
      },
      "tol": 0.000001
    },
    {
      "id": "compat-velocity-factor-alias",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "half",
        "f_Hz": 299792458,
        "velocity_factor": 0.95
      },
      "expect": {
        "L_m": 0.475,
        "length_factor": 0.95,
        "corrected_length_scale_m": 0.95
      },
      "expectWarning": null,
      "actual": {
        "mode": "half",
        "f_Hz": 299792458,
        "length_factor": 0.95,
        "velocity_factor": 0.95,
        "lambda_free_space_m": 1,
        "corrected_length_scale_m": 0.95,
        "lambda_effective_m": 0.95,
        "lambda_m": 0.95,
        "L_m": 0.475,
        "L_ft": 1.5583989501312334,
        "L_leg_m": 0.2375
      },
      "tol": 1e-9
    },
    {
      "id": "bad-f",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": 0
      },
      "expectError": "VALUE_MUST_BE_POSITIVE",
      "code": "VALUE_MUST_BE_POSITIVE",
      "error": "f_Hz must be greater than zero"
    },
    {
      "id": "boundary-antenna",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "half",
        "f_Hz": 299792458
      },
      "expect": {
        "L_m": 0.5
      },
      "expectWarning": null,
      "actual": {
        "mode": "half",
        "f_Hz": 299792458,
        "length_factor": 1,
        "velocity_factor": 1,
        "lambda_free_space_m": 1,
        "corrected_length_scale_m": 1,
        "lambda_effective_m": 1,
        "lambda_m": 1,
        "L_m": 0.5,
        "L_ft": 1.6404199475065615,
        "L_leg_m": 0.25
      },
      "tol": 1e-12
    },
    {
      "id": "boundary-k-zero",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": 146000000,
        "length_factor": 0
      },
      "expectError": "FRACTION_OUT_OF_RANGE",
      "code": "FRACTION_OUT_OF_RANGE",
      "error": "length_factor must be in (0, 1]"
    },
    {
      "id": "boundary-k-neg",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": 146000000,
        "length_factor": -0.1
      },
      "expectError": "FRACTION_OUT_OF_RANGE",
      "code": "FRACTION_OUT_OF_RANGE",
      "error": "length_factor must be in (0, 1]"
    },
    {
      "id": "boundary-k-gt-one",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": 146000000,
        "length_factor": 1.01
      },
      "expectError": "FRACTION_OUT_OF_RANGE",
      "code": "FRACTION_OUT_OF_RANGE",
      "error": "length_factor must be in (0, 1]"
    },
    {
      "id": "boundary-f-neg",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": -1
      },
      "expectError": "VALUE_MUST_BE_POSITIVE",
      "code": "VALUE_MUST_BE_POSITIVE",
      "error": "f_Hz must be greater than zero"
    },
    {
      "id": "boundary-bad-mode",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": 146000000,
        "mode": "dipole"
      },
      "expectError": "INVALID_MODE",
      "code": "INVALID_MODE",
      "error": "mode must be half|quarter|wavelength"
    },
    {
      "id": "boundary-f-not-number",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": "n/a"
      },
      "expectError": "INVALID_NUMBER",
      "code": "INVALID_NUMBER",
      "error": "f_Hz must be a finite number"
    },
    {
      "id": "boundary-f-too-small",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": 1e-320
      },
      "expectError": "VALUE_OUT_OF_RANGE",
      "code": "VALUE_OUT_OF_RANGE",
      "error": "frequency produces a non-finite length; choose a representable f_Hz"
    },
    {
      "id": "boundary-length-factor-vs-velocity-conflict",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "f_Hz": 146000000,
        "length_factor": 0.95,
        "velocity_factor": 1
      },
      "expectError": "CONFLICTING_INPUTS",
      "code": "CONFLICTING_INPUTS",
      "error": "length_factor and velocity_factor (legacy alias) disagree"
    },
    {
      "id": "property-antenna",
      "ok": true,
      "kind": "property",
      "detail": "L_half(c,k=1)=0.5",
      "expect": 0.5,
      "actual": 0.5
    },
    {
      "id": "property-half-is-S-over-2",
      "ok": true,
      "kind": "property",
      "detail": "L_half = S/2",
      "expect": 0.5,
      "actual": 0.5
    },
    {
      "id": "property-quarter-is-S-over-4",
      "ok": true,
      "kind": "property",
      "detail": "L_quarter = S/4",
      "expect": 0.25,
      "actual": 0.25
    },
    {
      "id": "property-quarter-is-half-over-2",
      "ok": true,
      "kind": "property",
      "detail": "L_quarter = L_half/2",
      "expect": 0.25,
      "actual": 0.25
    },
    {
      "id": "property-full-is-corrected-length-scale",
      "ok": true,
      "kind": "property",
      "detail": "L_full = S",
      "expect": 1,
      "actual": 1
    },
    {
      "id": "property-full-with-k-is-k-lambda0",
      "ok": true,
      "kind": "property",
      "detail": "L_full(k) = k·λ₀",
      "expect": 0.95,
      "actual": 0.95
    },
    {
      "id": "property-l-proportional-to-k",
      "ok": true,
      "kind": "property",
      "detail": "L ∝ k",
      "expect": 0.475,
      "actual": 0.475
    },
    {
      "id": "property-legacy-velocity-factor-alias",
      "ok": true,
      "kind": "property",
      "detail": "velocity_factor alias = length_factor",
      "expect": 0.475,
      "actual": 0.475
    },
    {
      "id": "property-legacy-lambda-effective-alias",
      "ok": true,
      "kind": "property",
      "detail": "lambda_effective_m alias = corrected_length_scale_m",
      "expect": 0.95,
      "actual": 0.95
    },
    {
      "id": "property-f-doubles-l-halves",
      "ok": true,
      "kind": "property",
      "detail": "f×2 → L/2",
      "expect": 0.25,
      "actual": 0.25
    },
    {
      "id": "property-lambda0-independent-of-k",
      "ok": true,
      "kind": "property",
      "detail": "λ₀ independent of k",
      "expect": 1,
      "actual": 1
    },
    {
      "id": "property-lambda0-at-f-c-is-1m",
      "ok": true,
      "kind": "property",
      "detail": "λ₀(c)=1 m",
      "expect": 1,
      "actual": 1
    },
    {
      "id": "property-results-are-finite",
      "ok": true,
      "kind": "property",
      "detail": "success results are finite",
      "expect": true,
      "actual": true
    }
  ],
  "tier": "expert_verified",
  "verification": {
    "tests": {
      "passed": 28,
      "total": 28,
      "golden": 5,
      "boundary": 10,
      "property": 13
    },
    "contract_checks": {
      "passed": 4,
      "total": 4
    }
  },
  "evidence_core_generated_at": "2026-09-05T07:47:40.374Z",
  "rendered_at": "2026-09-16T22:03:43.726Z",
  "release_integrity": {
    "status": "verified",
    "scope": "workspace",
    "production_attestation_required": true,
    "calculation_version": "1.0.3",
    "artifacts": {
      "engine": "1.0.3",
      "page": "1.0.3",
      "capability": "1.0.3",
      "evidence": "1.0.3",
      "input_schema": "1.0.3",
      "output_schema": "1.0.3",
      "mcp_contract": "1.0.3"
    },
    "digests": {
      "input_schema_sha256": "75b65082e2c05ac7dbf5c781b5ff86c212308cf737ff4a604ac9cac9ac8f98e1",
      "output_schema_sha256": "ff32ffc407c1a9cc313e7e4d0ad861649ee2505fe640584d39ae92091a39b93c",
      "evidence_sha256": "c32d4c47d232482aefbe92168d7c7e820eb29fc6d8b755dd245de2e13ba0e068",
      "evidence_core_sha256": "c32d4c47d232482aefbe92168d7c7e820eb29fc6d8b755dd245de2e13ba0e068",
      "capability_sha256": "6c977db862798e3b9ec900c1e7d69a31f5a0afccb6230dc94f0064bfba77ddbd",
      "engine_sha256": "c8d4ccdbfeaf61d7b024d4e1babb0c2ba3b324c1b37bd0cb456a526d8d2b1bd1",
      "mcp_contract_sha256": "863098b311a7b17dc4b229a6302b90b3545b175f716e5d84772c7be8e9716b86"
    },
    "contract_checks": {
      "total": 4,
      "passed": 4,
      "failed": 0,
      "items": [
        {
          "id": "release-artifacts-aligned",
          "status": "pass",
          "detail": "1.0.3"
        },
        {
          "id": "schema-valid-input-executes",
          "status": "pass"
        },
        {
          "id": "engine-success-output-validates-schema",
          "status": "pass"
        },
        {
          "id": "schema-rejects-incomplete-input",
          "status": "pass"
        }
      ]
    },
    "report": "https://www.calculatorx.com/.well-known/calculatorx-release-integrity.json"
  }
}
