{
  "export_records": [
    {
      "canonical": "spectralbridge.drone_production.BulkProductionResult",
      "export": "spectralbridge.BulkProductionResult",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneCampaignConfig",
      "export": "spectralbridge.DroneCampaignConfig",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneCampaignIncompleteError",
      "export": "spectralbridge.DroneCampaignIncompleteError",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneCampaignResult",
      "export": "spectralbridge.DroneCampaignResult",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneCollectionInventory",
      "export": "spectralbridge.DroneCollectionInventory",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneFlightStatus",
      "export": "spectralbridge.DroneFlightStatus",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneSource",
      "export": "spectralbridge.DroneSource",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneYearSource",
      "export": "spectralbridge.DroneYearSource",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.RemoteDronePackage",
      "export": "spectralbridge.RemoteDronePackage",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.__version__",
      "export": "spectralbridge.__version__",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.brightness.apply_brightness_correction",
      "export": "spectralbridge.apply_brightness_correction",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.brdf_topo.TopoFitMode",
      "export": "spectralbridge.brdf_topo.TopoFitMode",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.brdf_topo.apply_brdf_topo_core",
      "export": "spectralbridge.brdf_topo.apply_brdf_topo_core",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.brdf_topo.apply_brdf_topo_correction",
      "export": "spectralbridge.brdf_topo.apply_brdf_topo_correction",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.brdf_topo.build_and_write_correction_json",
      "export": "spectralbridge.brdf_topo.build_and_write_correction_json",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.brdf_topo.build_correction_parameters_dict",
      "export": "spectralbridge.brdf_topo.build_correction_parameters_dict",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.brightness.apply_brightness_correction",
      "export": "spectralbridge.brightness.apply_brightness_correction",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.build_drone_translation_coefficient_registry",
      "export": "spectralbridge.build_drone_translation_coefficient_registry",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.harmonized.build_harmonized_dataset",
      "export": "spectralbridge.build_harmonized_dataset",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.AnalysisProfile",
      "export": "spectralbridge.bulk.AnalysisProfile",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.results.BULK_RESULTS_SCHEMA_VERSION",
      "export": "spectralbridge.bulk.BULK_RESULTS_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BULK_SCHEMA_VERSION",
      "export": "spectralbridge.bulk.BULK_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkAnalysisPaths",
      "export": "spectralbridge.bulk.BulkAnalysisPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkInputKind",
      "export": "spectralbridge.bulk.BulkInputKind",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkInputMode",
      "export": "spectralbridge.bulk.BulkInputMode",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.results.BulkResultsConfig",
      "export": "spectralbridge.bulk.BulkResultsConfig",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.results.BulkResultsPaths",
      "export": "spectralbridge.bulk.BulkResultsPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkSource",
      "export": "spectralbridge.bulk.BulkSource",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.ExclusionRecord",
      "export": "spectralbridge.bulk.ExclusionRecord",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.identity.FlightlineIdentity",
      "export": "spectralbridge.bulk.FlightlineIdentity",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.identity.FlightlineIdentityParser",
      "export": "spectralbridge.bulk.FlightlineIdentityParser",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.FlightlineRecord",
      "export": "spectralbridge.bulk.FlightlineRecord",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.ProductDescriptor",
      "export": "spectralbridge.bulk.ProductDescriptor",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.ProductRegistry",
      "export": "spectralbridge.bulk.ProductRegistry",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.SourceFileRecord",
      "export": "spectralbridge.bulk.SourceFileRecord",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPlotConfig",
      "export": "spectralbridge.bulk.SpectralLibraryPlotConfig",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.TabularProductDescriptor",
      "export": "spectralbridge.bulk.TabularProductDescriptor",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.TranslationPair",
      "export": "spectralbridge.bulk.TranslationPair",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPlotConfig",
      "export": "spectralbridge.bulk.analyses.SpectralLibraryPlotConfig",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.common.PairSpec",
      "export": "spectralbridge.bulk.analyses.common.PairSpec",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.common.available_pair_specs",
      "export": "spectralbridge.bulk.analyses.common.available_pair_specs",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.common.band_map",
      "export": "spectralbridge.bulk.analyses.common.band_map",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.common.pair_literals",
      "export": "spectralbridge.bulk.analyses.common.pair_literals",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.common.sql_literal",
      "export": "spectralbridge.bulk.analyses.common.sql_literal",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.common.valid_pair_cte",
      "export": "spectralbridge.bulk.analyses.common.valid_pair_cte",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.dataset_census.DatasetCensusPaths",
      "export": "spectralbridge.bulk.analyses.dataset_census.DatasetCensusPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.dataset_census.REQUIRED_INPUT_TABLES",
      "export": "spectralbridge.bulk.analyses.dataset_census.REQUIRED_INPUT_TABLES",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.dataset_census.run_dataset_census",
      "export": "spectralbridge.bulk.analyses.dataset_census.run_dataset_census",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library",
      "export": "spectralbridge.bulk.analyses.inspect_spectral_library",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
      "export": "spectralbridge.bulk.analyses.inspect_spectral_library_preflight",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.leave_one_site_out.LeaveOneSiteOutPaths",
      "export": "spectralbridge.bulk.analyses.leave_one_site_out.LeaveOneSiteOutPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.leave_one_site_out.REQUIRED_INPUT_TABLES",
      "export": "spectralbridge.bulk.analyses.leave_one_site_out.REQUIRED_INPUT_TABLES",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.leave_one_site_out.REQUIRED_PROVENANCE_COLUMNS",
      "export": "spectralbridge.bulk.analyses.leave_one_site_out.REQUIRED_PROVENANCE_COLUMNS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.leave_one_site_out.run_leave_one_site_out",
      "export": "spectralbridge.bulk.analyses.leave_one_site_out.run_leave_one_site_out",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.dataset_census.run_dataset_census",
      "export": "spectralbridge.bulk.analyses.run_dataset_census",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.leave_one_site_out.run_leave_one_site_out",
      "export": "spectralbridge.bulk.analyses.run_leave_one_site_out",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.sensor_translation.run_sensor_translation",
      "export": "spectralbridge.bulk.analyses.run_sensor_translation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
      "export": "spectralbridge.bulk.analyses.run_spectral_library_analysis",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.sensor_translation.REQUIRED_INPUT_TABLES",
      "export": "spectralbridge.bulk.analyses.sensor_translation.REQUIRED_INPUT_TABLES",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.sensor_translation.REQUIRED_PROVENANCE_COLUMNS",
      "export": "spectralbridge.bulk.analyses.sensor_translation.REQUIRED_PROVENANCE_COLUMNS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.sensor_translation.SensorTranslationPaths",
      "export": "spectralbridge.bulk.analyses.sensor_translation.SensorTranslationPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.sensor_translation.run_sensor_translation",
      "export": "spectralbridge.bulk.analyses.sensor_translation.run_sensor_translation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.DEFAULT_QUANTILES",
      "export": "spectralbridge.bulk.analyses.spectral_library.DEFAULT_QUANTILES",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.SPECTRAL_LIBRARY_SCHEMA_VERSION",
      "export": "spectralbridge.bulk.analyses.spectral_library.SPECTRAL_LIBRARY_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.SpectralBand",
      "export": "spectralbridge.bulk.analyses.spectral_library.SpectralBand",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPaths",
      "export": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPlotConfig",
      "export": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPlotConfig",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.SpectralLibrarySchema",
      "export": "spectralbridge.bulk.analyses.spectral_library.SpectralLibrarySchema",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library",
      "export": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
      "export": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.iter_group_spectra",
      "export": "spectralbridge.bulk.analyses.spectral_library.iter_group_spectra",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
      "export": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.trace_alpha",
      "export": "spectralbridge.bulk.analyses.spectral_library.trace_alpha",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.streaming_translation.run_streaming_translation_analyses",
      "export": "spectralbridge.bulk.analyses.streaming_translation.run_streaming_translation_analyses",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.catalog.build_bulk_catalog",
      "export": "spectralbridge.bulk.build_bulk_catalog",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.harmonized.build_harmonized_dataset",
      "export": "spectralbridge.bulk.build_harmonized_dataset",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.catalog.canonical_identity_from_product",
      "export": "spectralbridge.bulk.canonical_identity_from_product",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.catalog.build_bulk_catalog",
      "export": "spectralbridge.bulk.catalog.build_bulk_catalog",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.catalog.canonical_identity_from_product",
      "export": "spectralbridge.bulk.catalog.canonical_identity_from_product",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.catalog.catalog_signature_records",
      "export": "spectralbridge.bulk.catalog.catalog_signature_records",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.catalog.discover_bulk_sources",
      "export": "spectralbridge.bulk.catalog.discover_bulk_sources",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.dataset.configure_duckdb",
      "export": "spectralbridge.bulk.dataset.configure_duckdb",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.dataset.copy_table_atomic",
      "export": "spectralbridge.bulk.dataset.copy_table_atomic",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.dataset.create_bulk_database",
      "export": "spectralbridge.bulk.dataset.create_bulk_database",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.dataset.finalize_bulk_database",
      "export": "spectralbridge.bulk.dataset.finalize_bulk_database",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.dataset.observation_columns",
      "export": "spectralbridge.bulk.dataset.observation_columns",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.dataset.quote_identifier",
      "export": "spectralbridge.bulk.dataset.quote_identifier",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.dataset.quote_path",
      "export": "spectralbridge.bulk.dataset.quote_path",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.catalog.discover_bulk_sources",
      "export": "spectralbridge.bulk.discover_bulk_sources",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.exclusions.KNOWN_REASON_CODES",
      "export": "spectralbridge.bulk.exclusions.KNOWN_REASON_CODES",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.exclusions.build_exclusion_records",
      "export": "spectralbridge.bulk.exclusions.build_exclusion_records",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.flightline_outputs.EXTRACTION_SCHEMA_VERSION",
      "export": "spectralbridge.bulk.flightline_outputs.EXTRACTION_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.flightline_outputs.discover_completed_flightlines",
      "export": "spectralbridge.bulk.flightline_outputs.discover_completed_flightlines",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.flightline_outputs.extract_flightline_cache",
      "export": "spectralbridge.bulk.flightline_outputs.extract_flightline_cache",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.flightline_outputs.find_canonical_flightline_directories",
      "export": "spectralbridge.bulk.flightline_outputs.find_canonical_flightline_directories",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.harmonized.build_harmonized_dataset",
      "export": "spectralbridge.bulk.harmonized.build_harmonized_dataset",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.identity.DEFAULT_IDENTITY_PARSERS",
      "export": "spectralbridge.bulk.identity.DEFAULT_IDENTITY_PARSERS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.identity.FlightlineIdentity",
      "export": "spectralbridge.bulk.identity.FlightlineIdentity",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.identity.FlightlineIdentityParser",
      "export": "spectralbridge.bulk.identity.FlightlineIdentityParser",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.identity.ManifestIdentityParser",
      "export": "spectralbridge.bulk.identity.ManifestIdentityParser",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.identity.NEONDirectoryIdentityParser",
      "export": "spectralbridge.bulk.identity.NEONDirectoryIdentityParser",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.identity.resolve_flightline_identity",
      "export": "spectralbridge.bulk.identity.resolve_flightline_identity",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library",
      "export": "spectralbridge.bulk.inspect_spectral_library",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
      "export": "spectralbridge.bulk.inspect_spectral_library_preflight",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.BULK_SCHEMA_VERSION",
      "export": "spectralbridge.bulk.models.BULK_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkAnalysisPaths",
      "export": "spectralbridge.bulk.models.BulkAnalysisPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkInputKind",
      "export": "spectralbridge.bulk.models.BulkInputKind",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkInputMode",
      "export": "spectralbridge.bulk.models.BulkInputMode",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkSource",
      "export": "spectralbridge.bulk.models.BulkSource",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.ExclusionRecord",
      "export": "spectralbridge.bulk.models.ExclusionRecord",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.FlightlineRecord",
      "export": "spectralbridge.bulk.models.FlightlineRecord",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.SourceFileRecord",
      "export": "spectralbridge.bulk.models.SourceFileRecord",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.provenance.canonical_json",
      "export": "spectralbridge.bulk.provenance.canonical_json",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.provenance.relative_paths",
      "export": "spectralbridge.bulk.provenance.relative_paths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.provenance.signature_sha256",
      "export": "spectralbridge.bulk.provenance.signature_sha256",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.provenance.write_json_atomic",
      "export": "spectralbridge.bulk.provenance.write_json_atomic",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.provenance.write_text_atomic",
      "export": "spectralbridge.bulk.provenance.write_text_atomic",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.ANALYSIS_PROFILES",
      "export": "spectralbridge.bulk.registry.ANALYSIS_PROFILES",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.registry.AnalysisProfile",
      "export": "spectralbridge.bulk.registry.AnalysisProfile",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
      "export": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.registry.ProductDescriptor",
      "export": "spectralbridge.bulk.registry.ProductDescriptor",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.ProductRegistry",
      "export": "spectralbridge.bulk.registry.ProductRegistry",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.TRANSLATION_PROFILE",
      "export": "spectralbridge.bulk.registry.TRANSLATION_PROFILE",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.registry.TabularProductDescriptor",
      "export": "spectralbridge.bulk.registry.TabularProductDescriptor",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.TranslationPair",
      "export": "spectralbridge.bulk.registry.TranslationPair",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.registry.resolve_analysis_profile",
      "export": "spectralbridge.bulk.registry.resolve_analysis_profile",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.reporting.BULK_PUBLICATION_FIGURE_NAMES",
      "export": "spectralbridge.bulk.reporting.BULK_PUBLICATION_FIGURE_NAMES",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.reporting.BULK_PUBLICATION_PANEL_COUNT",
      "export": "spectralbridge.bulk.reporting.BULK_PUBLICATION_PANEL_COUNT",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.reporting.render_bulk_pdf_report",
      "export": "spectralbridge.bulk.reporting.render_bulk_pdf_report",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.reporting.render_bulk_publication_figures",
      "export": "spectralbridge.bulk.reporting.render_bulk_publication_figures",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.reporting.render_bulk_summary_dashboard",
      "export": "spectralbridge.bulk.reporting.render_bulk_summary_dashboard",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.results.BULK_RESULTS_SCHEMA_VERSION",
      "export": "spectralbridge.bulk.results.BULK_RESULTS_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.results.BulkResultsConfig",
      "export": "spectralbridge.bulk.results.BulkResultsConfig",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.results.BulkResultsPaths",
      "export": "spectralbridge.bulk.results.BulkResultsPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.results.summarize_bulk_results",
      "export": "spectralbridge.bulk.results.summarize_bulk_results",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.dataset_census.run_dataset_census",
      "export": "spectralbridge.bulk.run_dataset_census",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.leave_one_site_out.run_leave_one_site_out",
      "export": "spectralbridge.bulk.run_leave_one_site_out",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.sensor_translation.run_sensor_translation",
      "export": "spectralbridge.bulk.run_sensor_translation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
      "export": "spectralbridge.bulk.run_spectral_library_analysis",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.streaming.BivariateStatistics",
      "export": "spectralbridge.bulk.streaming.BivariateStatistics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.streaming.PairBand",
      "export": "spectralbridge.bulk.streaming.PairBand",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.streaming.STATISTICS_SCHEMA_VERSION",
      "export": "spectralbridge.bulk.streaming.STATISTICS_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.streaming.compute_flightline_statistics",
      "export": "spectralbridge.bulk.streaming.compute_flightline_statistics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.streaming.iter_aligned_pair_chunks",
      "export": "spectralbridge.bulk.streaming.iter_aligned_pair_chunks",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.streaming.pair_bands",
      "export": "spectralbridge.bulk.streaming.pair_bands",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.streaming.write_diagnostic_sample",
      "export": "spectralbridge.bulk.streaming.write_diagnostic_sample",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.streaming.write_statistics",
      "export": "spectralbridge.bulk.streaming.write_statistics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.results.summarize_bulk_results",
      "export": "spectralbridge.bulk.summarize_bulk_results",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.bulk_cli.main",
      "export": "spectralbridge.cli.bulk_cli.main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.download_main",
      "export": "spectralbridge.cli.download_main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.drone_production_cli.main",
      "export": "spectralbridge.cli.drone_production_cli.main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.pipeline_cli.main",
      "export": "spectralbridge.cli.pipeline_cli.main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.pipeline_main",
      "export": "spectralbridge.cli.pipeline_main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.qa_cli.main",
      "export": "spectralbridge.cli.qa_cli.main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.qa_main",
      "export": "spectralbridge.cli.qa_main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.qa_summary_cli.main",
      "export": "spectralbridge.cli.qa_summary_cli.main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.cli.stage_qa_cli.main",
      "export": "spectralbridge.cli.stage_qa_cli.main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge._cli_compat.warn_if_legacy_command",
      "export": "spectralbridge.cli.warn_if_legacy_command",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.apply_brdf_correct",
      "export": "spectralbridge.corrections.apply_brdf_correct",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.apply_glint_correct",
      "export": "spectralbridge.corrections.apply_glint_correct",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.apply_topo_correct",
      "export": "spectralbridge.corrections.apply_topo_correct",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.calc_cosine_i",
      "export": "spectralbridge.corrections.calc_cosine_i",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.calc_geom_kernel",
      "export": "spectralbridge.corrections.calc_geom_kernel",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.calc_volume_kernel",
      "export": "spectralbridge.corrections.calc_volume_kernel",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.fit_and_save_brdf_model",
      "export": "spectralbridge.corrections.fit_and_save_brdf_model",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.fit_scs_c_coefficients",
      "export": "spectralbridge.corrections.fit_scs_c_coefficients",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.corrections.load_brdf_model",
      "export": "spectralbridge.corrections.load_brdf_model",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.deprecated.hytools",
      "export": "spectralbridge.deprecated.hytools",
      "kind": "module"
    },
    {
      "canonical": "spectralbridge.deprecated.hytools.apply_brightness_offset_to_envi",
      "export": "spectralbridge.deprecated.hytools.apply_brightness_offset_to_envi",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.deprecated.hytools.apply_corrections",
      "export": "spectralbridge.deprecated.hytools.apply_corrections",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.deprecated.hytools.apply_offset_to_envi",
      "export": "spectralbridge.deprecated.hytools.apply_offset_to_envi",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.deprecated.hytools.export_coeffs",
      "export": "spectralbridge.deprecated.hytools.export_coeffs",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.deprecated.hytools.generate_config_json",
      "export": "spectralbridge.deprecated.hytools.generate_config_json",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.deprecated.hytools.generate_correction_configs_for_directory",
      "export": "spectralbridge.deprecated.hytools.generate_correction_configs_for_directory",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.deprecated.hytools.topo_and_brdf_correction",
      "export": "spectralbridge.deprecated.hytools.topo_and_brdf_correction",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.BulkProductionResult",
      "export": "spectralbridge.drone_production.BulkProductionResult",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.BulkReadinessValidation",
      "export": "spectralbridge.drone_production.BulkReadinessValidation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneCampaignConfig",
      "export": "spectralbridge.drone_production.DroneCampaignConfig",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneCampaignIncompleteError",
      "export": "spectralbridge.drone_production.DroneCampaignIncompleteError",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneCampaignResult",
      "export": "spectralbridge.drone_production.DroneCampaignResult",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneCollectionInventory",
      "export": "spectralbridge.drone_production.DroneCollectionInventory",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneFlightStatus",
      "export": "spectralbridge.drone_production.DroneFlightStatus",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneSource",
      "export": "spectralbridge.drone_production.DroneSource",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_production.DroneYearSource",
      "export": "spectralbridge.drone_production.DroneYearSource",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.RemoteDronePackage",
      "export": "spectralbridge.drone_production.RemoteDronePackage",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.StagedDroneInput",
      "export": "spectralbridge.drone_production.StagedDroneInput",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.inspect_drone_collection",
      "export": "spectralbridge.drone_production.inspect_drone_collection",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.package_drone_bulk_results",
      "export": "spectralbridge.drone_production.package_drone_bulk_results",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.run_drone_bulk_production",
      "export": "spectralbridge.drone_production.run_drone_bulk_production",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.run_drone_campaign",
      "export": "spectralbridge.drone_production.run_drone_campaign",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.stage_drone_collection",
      "export": "spectralbridge.drone_production.stage_drone_collection",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.stage_drone_package",
      "export": "spectralbridge.drone_production.stage_drone_package",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.validate_bulk_ready_flightline",
      "export": "spectralbridge.drone_production.validate_bulk_ready_flightline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.verify_uploaded_results",
      "export": "spectralbridge.drone_production.verify_uploaded_results",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_qa.DRONE_TRANSLATION_PUBLICATION_PANEL_COUNT",
      "export": "spectralbridge.drone_qa.DRONE_TRANSLATION_PUBLICATION_PANEL_COUNT",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_qa.render_common_support_comparison",
      "export": "spectralbridge.drone_qa.render_common_support_comparison",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_qa.render_drone_translation_publication",
      "export": "spectralbridge.drone_qa.render_drone_translation_publication",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_qa.render_drone_translation_qa",
      "export": "spectralbridge.drone_qa.render_drone_translation_qa",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.DroneTranslationBand",
      "export": "spectralbridge.drone_translation.DroneTranslationBand",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.DroneTranslationPlan",
      "export": "spectralbridge.drone_translation.DroneTranslationPlan",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.SUPPORTED_WEIGHTINGS",
      "export": "spectralbridge.drone_translation.SUPPORTED_WEIGHTINGS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation.TRANSLATION_EQUATION",
      "export": "spectralbridge.drone_translation.TRANSLATION_EQUATION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation.apply_drone_translation",
      "export": "spectralbridge.drone_translation.apply_drone_translation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.coefficient_rows_for_parquet",
      "export": "spectralbridge.drone_translation.coefficient_rows_for_parquet",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.enrich_translated_spectral_library",
      "export": "spectralbridge.drone_translation.enrich_translated_spectral_library",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.ensure_matched_source_product",
      "export": "spectralbridge.drone_translation.ensure_matched_source_product",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.load_drone_translation_plans",
      "export": "spectralbridge.drone_translation.load_drone_translation_plans",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.matched_source_output_stem",
      "export": "spectralbridge.drone_translation.matched_source_output_stem",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation.translated_output_stem",
      "export": "spectralbridge.drone_translation.translated_output_stem",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.COEFFICIENT_STATUSES",
      "export": "spectralbridge.drone_translation_registry.COEFFICIENT_STATUSES",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.DRONE_TRANSLATION_COEFFICIENT_RESOURCE",
      "export": "spectralbridge.drone_translation_registry.DRONE_TRANSLATION_COEFFICIENT_RESOURCE",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.DRONE_TRANSLATION_COEFFICIENT_SET_VERSION",
      "export": "spectralbridge.drone_translation_registry.DRONE_TRANSLATION_COEFFICIENT_SET_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.DRONE_TRANSLATION_REGISTRY_SCHEMA_VERSION",
      "export": "spectralbridge.drone_translation_registry.DRONE_TRANSLATION_REGISTRY_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.EXPECTED_TARGET_BANDS",
      "export": "spectralbridge.drone_translation_registry.EXPECTED_TARGET_BANDS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.L5_TM_B3_CAUTION",
      "export": "spectralbridge.drone_translation_registry.L5_TM_B3_CAUTION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.PRODUCTION_TRANSLATION_WEIGHTING",
      "export": "spectralbridge.drone_translation_registry.PRODUCTION_TRANSLATION_WEIGHTING",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.build_drone_translation_coefficient_registry",
      "export": "spectralbridge.drone_translation_registry.build_drone_translation_coefficient_registry",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.get_drone_translation_coefficient",
      "export": "spectralbridge.drone_translation_registry.get_drone_translation_coefficient",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.load_drone_translation_coefficients",
      "export": "spectralbridge.drone_translation_registry.load_drone_translation_coefficients",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.packaged_drone_translation_coefficients_path",
      "export": "spectralbridge.drone_translation_registry.packaged_drone_translation_coefficients_path",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.validate_drone_translation_coefficients",
      "export": "spectralbridge.drone_translation_registry.validate_drone_translation_coefficients",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.envi.band_axis_from_header",
      "export": "spectralbridge.envi.band_axis_from_header",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.envi.hdr_to_dict",
      "export": "spectralbridge.envi.hdr_to_dict",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.envi.memmap_bsq",
      "export": "spectralbridge.envi.memmap_bsq",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.envi.read_envi_cube",
      "export": "spectralbridge.envi.read_envi_cube",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.envi.to_unitless_reflectance",
      "export": "spectralbridge.envi.to_unitless_reflectance",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.envi.wavelength_array",
      "export": "spectralbridge.envi.wavelength_array",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.get_drone_translation_coefficient",
      "export": "spectralbridge.get_drone_translation_coefficient",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.pipeline.go_forth_and_multiply",
      "export": "spectralbridge.go_forth_and_multiply",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.header_utils.wavelengths_from_hdr",
      "export": "spectralbridge.header_utils.wavelengths_from_hdr",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.inspect_drone_collection",
      "export": "spectralbridge.inspect_drone_collection",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
      "export": "spectralbridge.inspect_spectral_library_preflight",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.is_pre_2021",
      "export": "spectralbridge.io.is_pre_2021",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.is_pre_2021",
      "export": "spectralbridge.io.neon.is_pre_2021",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.peek_neon_raster_shape",
      "export": "spectralbridge.io.neon.peek_neon_raster_shape",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.peek_neon_sample_count",
      "export": "spectralbridge.io.neon.peek_neon_sample_count",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.read_neon_cube",
      "export": "spectralbridge.io.neon.read_neon_cube",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.read_neon_reflectance_unitless",
      "export": "spectralbridge.io.neon.read_neon_reflectance_unitless",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon_schema.NeonResolved",
      "export": "spectralbridge.io.neon_schema.NeonResolved",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon_schema.canonical_vectors",
      "export": "spectralbridge.io.neon_schema.canonical_vectors",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon_schema.detect_legacy",
      "export": "spectralbridge.io.neon_schema.detect_legacy",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon_schema.resolve",
      "export": "spectralbridge.io.neon_schema.resolve",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.peek_neon_raster_shape",
      "export": "spectralbridge.io.peek_neon_raster_shape",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.peek_neon_sample_count",
      "export": "spectralbridge.io.peek_neon_sample_count",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.io.neon.read_neon_cube",
      "export": "spectralbridge.io.read_neon_cube",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.landsat_validation.LANDSAT_COLLECTION",
      "export": "spectralbridge.landsat_validation.LANDSAT_COLLECTION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.landsat_validation.LANDSAT_SURFACE_REFLECTANCE_OFFSET",
      "export": "spectralbridge.landsat_validation.LANDSAT_SURFACE_REFLECTANCE_OFFSET",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.landsat_validation.LANDSAT_SURFACE_REFLECTANCE_SCALE",
      "export": "spectralbridge.landsat_validation.LANDSAT_SURFACE_REFLECTANCE_SCALE",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.landsat_validation.LandsatObservation",
      "export": "spectralbridge.landsat_validation.LandsatObservation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.landsat_validation.PLANETARY_COMPUTER_STAC",
      "export": "spectralbridge.landsat_validation.PLANETARY_COMPUTER_STAC",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.landsat_validation.acquire_landsat_observation",
      "export": "spectralbridge.landsat_validation.acquire_landsat_observation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.landsat_validation.compare_landsat_common_support",
      "export": "spectralbridge.landsat_validation.compare_landsat_common_support",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.landsat_validation.load_supplied_landsat_observation",
      "export": "spectralbridge.landsat_validation.load_supplied_landsat_observation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.landsat_validation.raster_acquisition_datetime",
      "export": "spectralbridge.landsat_validation.raster_acquisition_datetime",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.landsat_validation.raster_bounds_wgs84",
      "export": "spectralbridge.landsat_validation.raster_bounds_wgs84",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.candidate_ambiguity",
      "export": "spectralbridge.library_analysis.candidate_ambiguity",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.compare_representations",
      "export": "spectralbridge.library_analysis.compare_representations",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.constrained_unmixing",
      "export": "spectralbridge.library_analysis.constrained_unmixing",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.evaluate_feature_budget",
      "export": "spectralbridge.library_analysis.evaluate_feature_budget",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.evaluate_identifiability",
      "export": "spectralbridge.library_analysis.evaluate_identifiability",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.evaluate_library_size",
      "export": "spectralbridge.library_analysis.evaluate_library_size",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.fit_mesma",
      "export": "spectralbridge.library_analysis.fit_mesma",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.fit_ridge_fractions",
      "export": "spectralbridge.library_analysis.fit_ridge_fractions",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.fraction_diagnostics",
      "export": "spectralbridge.library_analysis.fraction_diagnostics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.generate_mixtures",
      "export": "spectralbridge.library_analysis.generate_mixtures",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.researcher_information.project_simplex",
      "export": "spectralbridge.library_analysis.project_simplex",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.library_analysis.spectral_separability",
      "export": "spectralbridge.library_analysis.spectral_separability",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.brightness_config.load_brightness_coefficients",
      "export": "spectralbridge.load_brightness_coefficients",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_translation_registry.load_drone_translation_coefficients",
      "export": "spectralbridge.load_drone_translation_coefficients",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.sensor_panel_plots.make_micasense_vs_landsat_panels",
      "export": "spectralbridge.make_micasense_vs_landsat_panels",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.sensor_panel_plots.make_sensor_vs_neon_panels",
      "export": "spectralbridge.make_sensor_vs_neon_panels",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_export.build_parquet_from_envi",
      "export": "spectralbridge.parquet_export.build_parquet_from_envi",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_export.ensure_parquet_for_envi",
      "export": "spectralbridge.parquet_export.ensure_parquet_for_envi",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_export.ensure_parquet_from_envi",
      "export": "spectralbridge.parquet_export.ensure_parquet_from_envi",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_export.parquet_exists_and_valid",
      "export": "spectralbridge.parquet_export.parquet_exists_and_valid",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_export.pq_read_table",
      "export": "spectralbridge.parquet_export.pq_read_table",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_export.pq_write_table",
      "export": "spectralbridge.parquet_export.pq_write_table",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_export.read_envi_in_chunks",
      "export": "spectralbridge.parquet_export.read_envi_in_chunks",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_export.repair_lonlat_in_place",
      "export": "spectralbridge.parquet_export.repair_lonlat_in_place",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_validation.collect_issues",
      "export": "spectralbridge.parquet_validation.collect_issues",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_validation.is_ok_columns",
      "export": "spectralbridge.parquet_validation.is_ok_columns",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_validation.main",
      "export": "spectralbridge.parquet_validation.main",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.parquet_validation.parse_args",
      "export": "spectralbridge.parquet_validation.parse_args",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.paths.FlightlinePaths",
      "export": "spectralbridge.paths.FlightlinePaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.paths.SensorProductPaths",
      "export": "spectralbridge.paths.SensorProductPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.paths.normalize_brdf_model_path",
      "export": "spectralbridge.paths.normalize_brdf_model_path",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.paths.scene_prefix_from_dir",
      "export": "spectralbridge.paths.scene_prefix_from_dir",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.paths.site_from_prefix",
      "export": "spectralbridge.paths.site_from_prefix",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.BULK_SCHEMA_VERSION",
      "export": "spectralbridge.pipelines.bulk.BULK_SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkAnalysisPaths",
      "export": "spectralbridge.pipelines.bulk.BulkAnalysisPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkInputKind",
      "export": "spectralbridge.pipelines.bulk.BulkInputKind",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkInputMode",
      "export": "spectralbridge.pipelines.bulk.BulkInputMode",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.BulkSource",
      "export": "spectralbridge.pipelines.bulk.BulkSource",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.bulk.models.FlightlineRecord",
      "export": "spectralbridge.pipelines.bulk.FlightlineRecord",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.models.SourceFileRecord",
      "export": "spectralbridge.pipelines.bulk.SourceFileRecord",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.catalog.discover_bulk_sources",
      "export": "spectralbridge.pipelines.bulk.discover_bulk_sources",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
      "export": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.DRONE_TARGET_BANDS",
      "export": "spectralbridge.pipelines.drone.DRONE_TARGET_BANDS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.DronePipelineIncompleteError",
      "export": "spectralbridge.pipelines.drone.DronePipelineIncompleteError",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.build_drone_config",
      "export": "spectralbridge.pipelines.drone.build_drone_config",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.build_drone_output_paths",
      "export": "spectralbridge.pipelines.drone.build_drone_output_paths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.clean_name",
      "export": "spectralbridge.pipelines.drone.clean_name",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.collect_drone_spatial_diagnostics",
      "export": "spectralbridge.pipelines.drone.collect_drone_spatial_diagnostics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.convert_drone_tiff_to_h5",
      "export": "spectralbridge.pipelines.drone.convert_drone_tiff_to_h5",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.derive_drone_flight_stem",
      "export": "spectralbridge.pipelines.drone.derive_drone_flight_stem",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.diagnose_drone_h5_solar_geometry",
      "export": "spectralbridge.pipelines.drone.diagnose_drone_h5_solar_geometry",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.export_h5_to_envi",
      "export": "spectralbridge.pipelines.drone.export_h5_to_envi",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.load_drone_manifest",
      "export": "spectralbridge.pipelines.drone.load_drone_manifest",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.lookup_flight_datetime",
      "export": "spectralbridge.pipelines.drone.lookup_flight_datetime",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.required_drone_outputs",
      "export": "spectralbridge.pipelines.drone.required_drone_outputs",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.resolve_band_map",
      "export": "spectralbridge.pipelines.drone.resolve_band_map",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.run_drone_pipeline",
      "export": "spectralbridge.pipelines.drone.run_drone_pipeline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.save_drone_overlay_debug_plot",
      "export": "spectralbridge.pipelines.drone.save_drone_overlay_debug_plot",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.summarize_drone_h5_solar_geometry",
      "export": "spectralbridge.pipelines.drone.summarize_drone_h5_solar_geometry",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.validate_drone_h5_metadata",
      "export": "spectralbridge.pipelines.drone.validate_drone_h5_metadata",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.pipeline",
      "export": "spectralbridge.pipelines.pipeline",
      "kind": "module"
    },
    {
      "canonical": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
      "export": "spectralbridge.pipelines.run_bulk_pipeline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.download.run_download",
      "export": "spectralbridge.pipelines.run_download",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.run_drone_pipeline",
      "export": "spectralbridge.pipelines.run_drone_pipeline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.pipeline.run_pipeline",
      "export": "spectralbridge.pipelines.run_pipeline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.polygons.build_polygon_pixel_index",
      "export": "spectralbridge.polygons.build_polygon_pixel_index",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.polygons.create_dummy_polygon",
      "export": "spectralbridge.polygons.create_dummy_polygon",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.polygons.extract_polygon_parquets_for_flightline",
      "export": "spectralbridge.polygons.extract_polygon_parquets_for_flightline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.polygons.filter_polygons_by_overlap",
      "export": "spectralbridge.polygons.filter_polygons_by_overlap",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.polygons.merge_polygon_parquets_for_flightline",
      "export": "spectralbridge.polygons.merge_polygon_parquets_for_flightline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.polygons.run_polygon_pipeline_for_flightline",
      "export": "spectralbridge.polygons.run_polygon_pipeline_for_flightline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.polygons.validate_coordinate_match",
      "export": "spectralbridge.polygons.validate_coordinate_match",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.polygons.visualize_polygons_on_envi",
      "export": "spectralbridge.polygons.visualize_polygons_on_envi",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.pipeline.process_one_flightline",
      "export": "spectralbridge.process_one_flightline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.schema.QAStatus",
      "export": "spectralbridge.qa.QAStatus",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.thresholds.QAThresholds",
      "export": "spectralbridge.qa.QAThresholds",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.schema.StageQAReport",
      "export": "spectralbridge.qa.StageQAReport",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.reporting.assemble_combined_report",
      "export": "spectralbridge.qa.assemble_combined_report",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.brightness.brightness_correction_metrics",
      "export": "spectralbridge.qa.brightness.brightness_correction_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.brightness.brightness_correction_metrics",
      "export": "spectralbridge.qa.brightness_correction_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.chunk_invariance_metrics",
      "export": "spectralbridge.qa.chunk_invariance_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.network.cycle_consistency_metrics",
      "export": "spectralbridge.qa.cycle_consistency_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.stages.emit_stage_qa",
      "export": "spectralbridge.qa.emit_stage_qa",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.network.grouped_residual_metrics",
      "export": "spectralbridge.qa.grouped_residual_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.linear_diagnostic",
      "export": "spectralbridge.qa.linear_diagnostic",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.chunk_invariance_metrics",
      "export": "spectralbridge.qa.metrics.chunk_invariance_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.linear_diagnostic",
      "export": "spectralbridge.qa.metrics.linear_diagnostic",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.reflectance_summary",
      "export": "spectralbridge.qa.metrics.reflectance_summary",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.residual_metrics",
      "export": "spectralbridge.qa.metrics.residual_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.seam_score",
      "export": "spectralbridge.qa.metrics.seam_score",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.spectral_response_support",
      "export": "spectralbridge.qa.metrics.spectral_response_support",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.network.cycle_consistency_metrics",
      "export": "spectralbridge.qa.network.cycle_consistency_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.network.grouped_residual_metrics",
      "export": "spectralbridge.qa.network.grouped_residual_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.network.path_consistency_metrics",
      "export": "spectralbridge.qa.network.path_consistency_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.network.translation_edge_metrics",
      "export": "spectralbridge.qa.network.translation_edge_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.network.path_consistency_metrics",
      "export": "spectralbridge.qa.path_consistency_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.paths.CombinedQAPaths",
      "export": "spectralbridge.qa.paths.CombinedQAPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.paths.StageQAPaths",
      "export": "spectralbridge.qa.paths.StageQAPaths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.paths.normalize_stage_id",
      "export": "spectralbridge.qa.paths.normalize_stage_id",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.format_location_label",
      "export": "spectralbridge.qa.plots.format_location_label",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.qa_plot_contract",
      "export": "spectralbridge.qa.plots.qa_plot_contract",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.render_artifact_inventory",
      "export": "spectralbridge.qa.plots.render_artifact_inventory",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.render_brightness_diagnostics",
      "export": "spectralbridge.qa.plots.render_brightness_diagnostics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.render_correction_overview",
      "export": "spectralbridge.qa.plots.render_correction_overview",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.render_correction_parameters",
      "export": "spectralbridge.qa.plots.render_correction_parameters",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.render_envi_overview",
      "export": "spectralbridge.qa.plots.render_envi_overview",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.render_parquet_overview",
      "export": "spectralbridge.qa.plots.render_parquet_overview",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.plots.spatial_plot_context",
      "export": "spectralbridge.qa.plots.spatial_plot_context",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.reflectance_summary",
      "export": "spectralbridge.qa.reflectance_summary",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.reporting.assemble_combined_report",
      "export": "spectralbridge.qa.reporting.assemble_combined_report",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.reporting.render_stage_html",
      "export": "spectralbridge.qa.reporting.render_stage_html",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.residual_metrics",
      "export": "spectralbridge.qa.residual_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.runner.run_completed_flightline_qa",
      "export": "spectralbridge.qa.run_completed_flightline_qa",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.runner.run_completed_flightline_qa",
      "export": "spectralbridge.qa.runner.run_completed_flightline_qa",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.schema.QACheck",
      "export": "spectralbridge.qa.schema.QACheck",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.schema.QAStatus",
      "export": "spectralbridge.qa.schema.QAStatus",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.schema.SCHEMA_VERSION",
      "export": "spectralbridge.qa.schema.SCHEMA_VERSION",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.qa.schema.StageQAReport",
      "export": "spectralbridge.qa.schema.StageQAReport",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.schema.overall_status",
      "export": "spectralbridge.qa.schema.overall_status",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.seam_score",
      "export": "spectralbridge.qa.seam_score",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.metrics.spectral_response_support",
      "export": "spectralbridge.qa.spectral_response_support",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.stages.emit_stage_qa",
      "export": "spectralbridge.qa.stages.emit_stage_qa",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.thresholds.KNOWN_BAD_WAVELENGTH_RANGES_NM",
      "export": "spectralbridge.qa.thresholds.KNOWN_BAD_WAVELENGTH_RANGES_NM",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.qa.thresholds.QAThresholds",
      "export": "spectralbridge.qa.thresholds.QAThresholds",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.thresholds.classify_high_bad",
      "export": "spectralbridge.qa.thresholds.classify_high_bad",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.thresholds.classify_low_bad",
      "export": "spectralbridge.qa.thresholds.classify_low_bad",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa.network.translation_edge_metrics",
      "export": "spectralbridge.qa.translation_edge_metrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_metrics.ConvolutionReport",
      "export": "spectralbridge.qa_metrics.ConvolutionReport",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_metrics.CorrectionReport",
      "export": "spectralbridge.qa_metrics.CorrectionReport",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_metrics.HeaderReport",
      "export": "spectralbridge.qa_metrics.HeaderReport",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_metrics.MaskReport",
      "export": "spectralbridge.qa_metrics.MaskReport",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_metrics.Provenance",
      "export": "spectralbridge.qa_metrics.Provenance",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_metrics.QAMetrics",
      "export": "spectralbridge.qa_metrics.QAMetrics",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_metrics.write_json",
      "export": "spectralbridge.qa_metrics.write_json",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_plots.render_drone_panel",
      "export": "spectralbridge.qa_plots.render_drone_panel",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_plots.render_flightline_panel",
      "export": "spectralbridge.qa_plots.render_flightline_panel",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_style.DEFAULT_QA_STYLE",
      "export": "spectralbridge.qa_style.DEFAULT_QA_STYLE",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.qa_style.QAPlotStyle",
      "export": "spectralbridge.qa_style.QAPlotStyle",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_style.SENSOR_COLORS",
      "export": "spectralbridge.qa_style.SENSOR_COLORS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.qa_style.STATUS_COLORS",
      "export": "spectralbridge.qa_style.STATUS_COLORS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.qa_style.WEIGHTING_COLORS",
      "export": "spectralbridge.qa_style.WEIGHTING_COLORS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.qa_style.WEIGHTING_MARKERS",
      "export": "spectralbridge.qa_style.WEIGHTING_MARKERS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.qa_style.apply_qa_axis_style",
      "export": "spectralbridge.qa_style.apply_qa_axis_style",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_style.sensor_display_label",
      "export": "spectralbridge.qa_style.sensor_display_label",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.qa_style.wavelength_pair_label",
      "export": "spectralbridge.qa_style.wavelength_pair_label",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge._ray_utils.init_ray",
      "export": "spectralbridge.ray_utils.init_ray",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge._ray_utils.ray_map",
      "export": "spectralbridge.ray_utils.ray_map",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.GocmdRemoteBackend",
      "export": "spectralbridge.remote.GocmdRemoteBackend",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.RemoteAuthenticationError",
      "export": "spectralbridge.remote.RemoteAuthenticationError",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.RemoteCollectionBackend",
      "export": "spectralbridge.remote.RemoteCollectionBackend",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.RemoteCommandError",
      "export": "spectralbridge.remote.RemoteCommandError",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.RemoteEntry",
      "export": "spectralbridge.remote.RemoteEntry",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.RemoteError",
      "export": "spectralbridge.remote.RemoteError",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.normalize_remote_path",
      "export": "spectralbridge.remote.normalize_remote_path",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.parse_gocmd_listing",
      "export": "spectralbridge.remote.parse_gocmd_listing",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.remote_join",
      "export": "spectralbridge.remote.remote_join",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.remote_parent",
      "export": "spectralbridge.remote.remote_parent",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.remote.remote_relative_path",
      "export": "spectralbridge.remote.remote_relative_path",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
      "export": "spectralbridge.run_bulk_pipeline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.run_drone_bulk_production",
      "export": "spectralbridge.run_drone_bulk_production",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.run_drone_campaign",
      "export": "spectralbridge.run_drone_campaign",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.pipelines.drone.run_drone_pipeline",
      "export": "spectralbridge.run_drone_pipeline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
      "export": "spectralbridge.run_spectral_library_analysis",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.sensor_pairs.MICASENSE_LANDSAT_PAIRS",
      "export": "spectralbridge.sensor_pairs.MICASENSE_LANDSAT_PAIRS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.sensor_pairs.SPECTRAL_IDENTITY_ORDER",
      "export": "spectralbridge.sensor_pairs.SPECTRAL_IDENTITY_ORDER",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.sensor_pairs.SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
      "export": "spectralbridge.sensor_pairs.SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.sensor_pairs.SensorBandIdentity",
      "export": "spectralbridge.sensor_pairs.SensorBandIdentity",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.sensor_pairs.sensor_band_identity",
      "export": "spectralbridge.sensor_pairs.sensor_band_identity",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.sensor_pairs.wavelength_matched_band_pairs",
      "export": "spectralbridge.sensor_pairs.wavelength_matched_band_pairs",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.sensor_pairs.MICASENSE_LANDSAT_PAIRS",
      "export": "spectralbridge.sensor_panel_plots.MICASENSE_LANDSAT_PAIRS",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.sensor_pairs.SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
      "export": "spectralbridge.sensor_panel_plots.SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
      "kind": "constant_or_type_alias"
    },
    {
      "canonical": "spectralbridge.sensor_panel_plots.make_micasense_vs_landsat_panels",
      "export": "spectralbridge.sensor_panel_plots.make_micasense_vs_landsat_panels",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.sensor_panel_plots.make_sensor_vs_neon_panels",
      "export": "spectralbridge.sensor_panel_plots.make_sensor_vs_neon_panels",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.stage_drone_collection",
      "export": "spectralbridge.stage_drone_collection",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.bulk.results.summarize_bulk_results",
      "export": "spectralbridge.summarize_bulk_results",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.utils.qa_summary.build_drone_qa_summary",
      "export": "spectralbridge.utils.build_drone_qa_summary",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.utils.paths.get_package_data_path",
      "export": "spectralbridge.utils.get_package_data_path",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.utils.naming.get_flight_paths",
      "export": "spectralbridge.utils.naming.get_flight_paths",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.utils.naming.get_flightline_products",
      "export": "spectralbridge.utils.naming.get_flightline_products",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.utils.qa_summary.build_drone_qa_summary",
      "export": "spectralbridge.utils.qa_summary.build_drone_qa_summary",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.utils.qa_summary.render_drone_qa_report",
      "export": "spectralbridge.utils.qa_summary.render_drone_qa_report",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.utils_checks.is_valid_envi_pair",
      "export": "spectralbridge.utils_checks.is_valid_envi_pair",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.utils_checks.is_valid_json",
      "export": "spectralbridge.utils_checks.is_valid_json",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.drone_production.validate_bulk_ready_flightline",
      "export": "spectralbridge.validate_bulk_ready_flightline",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.validation.ValidationCase",
      "export": "spectralbridge.validation.ValidationCase",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.validation.ValidationObservation",
      "export": "spectralbridge.validation.ValidationObservation",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.validation.ValidationResult",
      "export": "spectralbridge.validation.ValidationResult",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.validation.load_campaign",
      "export": "spectralbridge.validation.load_campaign",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.validation.run_campaign",
      "export": "spectralbridge.validation.run_campaign",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.validation.run_case",
      "export": "spectralbridge.validation.run_case",
      "kind": "callable"
    },
    {
      "canonical": "spectralbridge.validation.write_campaign",
      "export": "spectralbridge.validation.write_campaign",
      "kind": "callable"
    }
  ],
  "modules": [
    {
      "area": "utilities",
      "constants": [
        {
          "annotation": null,
          "name": "__version__",
          "value": "'2.3.0rc1'"
        }
      ],
      "declared_exports": [
        "BulkProductionResult",
        "DroneCampaignConfig",
        "DroneCampaignIncompleteError",
        "DroneCampaignResult",
        "DroneCollectionInventory",
        "DroneFlightStatus",
        "DroneSource",
        "DroneYearSource",
        "RemoteDronePackage",
        "__version__",
        "apply_brightness_correction",
        "build_drone_translation_coefficient_registry",
        "build_harmonized_dataset",
        "get_drone_translation_coefficient",
        "go_forth_and_multiply",
        "inspect_drone_collection",
        "inspect_spectral_library_preflight",
        "load_brightness_coefficients",
        "load_drone_translation_coefficients",
        "make_micasense_vs_landsat_panels",
        "make_sensor_vs_neon_panels",
        "process_one_flightline",
        "run_bulk_pipeline",
        "run_drone_bulk_production",
        "run_drone_campaign",
        "run_drone_pipeline",
        "run_spectral_library_analysis",
        "stage_drone_collection",
        "summarize_bulk_results",
        "validate_bulk_ready_flightline"
      ],
      "docstring": "SpectralBridge public package surface.",
      "export_expressions": [
        "__all__ = ['__version__']",
        "__all__ = sorted(set(__all__ + (['apply_brightness_correction', 'build_harmonized_dataset', 'build_drone_translation_coefficient_registry', 'get_drone_translation_coefficient', 'go_forth_and_multiply', 'process_one_flightline', 'run_bulk_pipeline', 'run_drone_pipeline', 'run_drone_campaign', 'run_drone_bulk_production', 'inspect_drone_collection', 'stage_drone_collection', 'validate_bulk_ready_flightline', 'BulkProductionResult', 'DroneCampaignConfig', 'DroneCampaignIncompleteError', 'DroneCampaignResult', 'DroneCollectionInventory', 'DroneFlightStatus', 'DroneSource', 'DroneYearSource', 'RemoteDronePackage', 'run_spectral_library_analysis', 'summarize_bulk_results', 'inspect_spectral_library_preflight', 'load_drone_translation_coefficients', load_brightness_coefficients.__name__] + list(_PLOT_EXPORTS))))",
        "_PLOT_EXPORTS = (make_micasense_vs_landsat_panels.__name__, make_sensor_vs_neon_panels.__name__)",
        "_PLOT_EXPORTS: tuple[str, ...] = ()"
      ],
      "imports": {
        "BulkProductionResult": "spectralbridge.drone_production.BulkProductionResult",
        "DroneCampaignConfig": "spectralbridge.drone_production.DroneCampaignConfig",
        "DroneCampaignIncompleteError": "spectralbridge.drone_production.DroneCampaignIncompleteError",
        "DroneCampaignResult": "spectralbridge.drone_production.DroneCampaignResult",
        "DroneCollectionInventory": "spectralbridge.drone_production.DroneCollectionInventory",
        "DroneFlightStatus": "spectralbridge.drone_production.DroneFlightStatus",
        "DroneSource": "spectralbridge.drone_production.DroneSource",
        "DroneYearSource": "spectralbridge.drone_production.DroneYearSource",
        "RemoteDronePackage": "spectralbridge.drone_production.RemoteDronePackage",
        "_apply_brightness_correction": "spectralbridge.brightness.apply_brightness_correction",
        "_builder": "spectralbridge.bulk.harmonized.build_harmonized_dataset",
        "_inspect_spectral_library_preflight": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
        "_run_bulk_pipeline": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
        "_run_drone_pipeline": "spectralbridge.pipelines.drone.run_drone_pipeline",
        "_run_spectral_library_analysis": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
        "_summarize_bulk_results": "spectralbridge.bulk.results.summarize_bulk_results",
        "annotations": "__future__.annotations",
        "apply_brightness_correction": "spectralbridge.brightness.apply_brightness_correction",
        "build_drone_translation_coefficient_registry": "spectralbridge.drone_translation_registry.build_drone_translation_coefficient_registry",
        "build_harmonized_dataset": "spectralbridge.bulk.harmonized.build_harmonized_dataset",
        "get_drone_translation_coefficient": "spectralbridge.drone_translation_registry.get_drone_translation_coefficient",
        "go_forth_and_multiply": "spectralbridge.pipelines.pipeline.go_forth_and_multiply",
        "import_module": "importlib.import_module",
        "inspect_drone_collection": "spectralbridge.drone_production.inspect_drone_collection",
        "inspect_spectral_library_preflight": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
        "load_brightness_coefficients": "spectralbridge.brightness_config.load_brightness_coefficients",
        "load_drone_translation_coefficients": "spectralbridge.drone_translation_registry.load_drone_translation_coefficients",
        "make_micasense_vs_landsat_panels": "spectralbridge.sensor_panel_plots.make_micasense_vs_landsat_panels",
        "make_sensor_vs_neon_panels": "spectralbridge.sensor_panel_plots.make_sensor_vs_neon_panels",
        "process_one_flightline": "spectralbridge.pipelines.pipeline.process_one_flightline",
        "run_bulk_pipeline": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
        "run_drone_bulk_production": "spectralbridge.drone_production.run_drone_bulk_production",
        "run_drone_campaign": "spectralbridge.drone_production.run_drone_campaign",
        "run_drone_pipeline": "spectralbridge.pipelines.drone.run_drone_pipeline",
        "run_spectral_library_analysis": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
        "stage_drone_collection": "spectralbridge.drone_production.stage_drone_collection",
        "summarize_bulk_results": "spectralbridge.bulk.results.summarize_bulk_results",
        "validate_bulk_ready_flightline": "spectralbridge.drone_production.validate_bulk_ready_flightline"
      },
      "module": "spectralbridge",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 68,
          "methods": [],
          "name": "__getattr__",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.__getattr__",
          "signature": "__getattr__(name: str)",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/__init__.py",
      "sha256": "e2b659adca27ed6e2c04f35cbe910ac924d59e8a0f71ec575d6e8daac8d9bfb6"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge._cli_compat",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.cli.warn_if_legacy_command"
          ],
          "kind": "function",
          "line": 10,
          "methods": [],
          "name": "warn_if_legacy_command",
          "parameters": [
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv0"
            }
          ],
          "path": "spectralbridge._cli_compat.warn_if_legacy_command",
          "signature": "warn_if_legacy_command(argv0: str | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/_cli_compat.py",
      "sha256": "4063fc87328d402e92a8321744cc6694307db0e9398557b9eca48c6167b6b9ff"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "Helpers for dependency import checks.",
      "export_expressions": [],
      "imports": {
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge._optional",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/figure_panels.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 5,
          "methods": [],
          "name": "_missing",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "extra"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "package"
            }
          ],
          "path": "spectralbridge._optional._missing",
          "signature": "_missing(extra: str, package: str) -> RuntimeError",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 14,
          "methods": [],
          "name": "require_geopandas",
          "parameters": [],
          "path": "spectralbridge._optional.require_geopandas",
          "signature": "require_geopandas()",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 22,
          "methods": [],
          "name": "require_rasterio",
          "parameters": [],
          "path": "spectralbridge._optional.require_rasterio",
          "signature": "require_rasterio()",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 30,
          "methods": [],
          "name": "require_spectral",
          "parameters": [],
          "path": "spectralbridge._optional.require_spectral",
          "signature": "require_spectral()",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 38,
          "methods": [],
          "name": "require_ray",
          "parameters": [],
          "path": "spectralbridge._optional.require_ray",
          "signature": "require_ray()",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 46,
          "methods": [],
          "name": "require_h5py",
          "parameters": [],
          "path": "spectralbridge._optional.require_h5py",
          "signature": "require_h5py()",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 54,
          "methods": [],
          "name": "require_matplotlib_pyplot",
          "parameters": [],
          "path": "spectralbridge._optional.require_matplotlib_pyplot",
          "signature": "require_matplotlib_pyplot()",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/_optional.py",
      "sha256": "2fd3517cad8d6b3bdd4827adac0384edac9b18a825ef427f7d8ca1fc232d7a43"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Any": "typing.Any",
        "Callable": "typing.Callable",
        "Iterable": "typing.Iterable",
        "LocalRayletDiedError": "ray.exceptions.LocalRayletDiedError",
        "OutOfDiskError": "ray.exceptions.OutOfDiskError",
        "Path": "pathlib.Path",
        "RayError": "ray.exceptions.RayError",
        "TypeVar": "typing.TypeVar",
        "annotations": "__future__.annotations",
        "require_ray": "spectralbridge._optional.require_ray"
      },
      "module": "spectralbridge._ray_utils",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 16,
          "methods": [],
          "name": "_resolve_cpu_target",
          "parameters": [
            {
              "annotation": "int | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "num_cpus"
            }
          ],
          "path": "spectralbridge._ray_utils._resolve_cpu_target",
          "signature": "_resolve_cpu_target(num_cpus: int | None) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Initialize Ray with project defaults and disable memory monitoring.",
          "examples": [],
          "exports": [
            "spectralbridge.ray_utils.init_ray"
          ],
          "kind": "function",
          "line": 29,
          "methods": [],
          "name": "init_ray",
          "parameters": [
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "num_cpus"
            },
            {
              "annotation": "Any",
              "default": null,
              "kind": "variadic-keyword",
              "name": "ray_kwargs"
            }
          ],
          "path": "spectralbridge._ray_utils.init_ray",
          "signature": "init_ray(*, num_cpus: int | None=None, **ray_kwargs: Any)",
          "summary": "Initialize Ray with project defaults and disable memory monitoring.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Execute ``func`` across ``iterable`` using Ray remote tasks.",
          "examples": [],
          "exports": [
            "spectralbridge.ray_utils.ray_map"
          ],
          "kind": "function",
          "line": 87,
          "methods": [],
          "name": "ray_map",
          "parameters": [
            {
              "annotation": "Callable[[_T], _U]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "func"
            },
            {
              "annotation": "Iterable[_T]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "iterable"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "num_cpus"
            }
          ],
          "path": "spectralbridge._ray_utils.ray_map",
          "signature": "ray_map(func: Callable[[_T], _U], iterable: Iterable[_T], *, num_cpus: int | None=None) -> list[_U]",
          "summary": "Execute ``func`` across ``iterable`` using Ray remote tasks.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/_ray_utils.py",
      "sha256": "4c79f1ba598a05a875f1484c428ebeb9132828e2ad5092f6620dc45e7525ff4b"
    },
    {
      "area": "corrections",
      "constants": [
        {
          "annotation": null,
          "name": "TopoFitMode",
          "value": "Literal['scene', 'tile']"
        }
      ],
      "declared_exports": [
        "TopoFitMode",
        "apply_brdf_topo_core",
        "apply_brdf_topo_correction",
        "build_and_write_correction_json",
        "build_correction_parameters_dict"
      ],
      "docstring": "BRDF and topographic correction helpers for the streamlined pipeline.",
      "export_expressions": [
        "__all__ = ['TopoFitMode', 'build_correction_parameters_dict', 'build_and_write_correction_json', 'apply_brdf_topo_core', 'apply_brdf_topo_correction']"
      ],
      "imports": {
        "EnviWriter": "spectralbridge.envi_writer.EnviWriter",
        "HYTOOLS_BRDF_KERNEL_CONFIG": "spectralbridge.corrections.HYTOOLS_BRDF_KERNEL_CONFIG",
        "Literal": "typing.Literal",
        "NDVIBinningConfig": "spectralbridge.corrections.NDVIBinningConfig",
        "NeonCube": "spectralbridge.neon_cube.NeonCube",
        "Path": "pathlib.Path",
        "TileProgressReporter": "spectralbridge.progress_utils.TileProgressReporter",
        "Tuple": "typing.Tuple",
        "annotations": "__future__.annotations",
        "apply_brdf_correct": "spectralbridge.corrections.apply_brdf_correct",
        "apply_topo_correct": "spectralbridge.corrections.apply_topo_correct",
        "fit_and_save_brdf_model": "spectralbridge.corrections.fit_and_save_brdf_model",
        "fit_scs_c_coefficients": "spectralbridge.corrections.fit_scs_c_coefficients",
        "is_valid_envi_pair": "spectralbridge.utils_checks.is_valid_envi_pair",
        "is_valid_json": "spectralbridge.utils_checks.is_valid_json"
      },
      "module": "spectralbridge.brdf_topo",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 41,
          "methods": [],
          "name": "_normalize_topo_fit_mode",
          "parameters": [
            {
              "annotation": "str | TopoFitMode",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "topo_fit_mode"
            }
          ],
          "path": "spectralbridge.brdf_topo._normalize_topo_fit_mode",
          "signature": "_normalize_topo_fit_mode(topo_fit_mode: str | TopoFitMode) -> TopoFitMode",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return spatial chunk sizes used while applying topographic correction.\n\nFor ``scene`` mode the SCS+C coefficients are fit once over the full footprint\n(streamed), then applied in full-width row strips. For ``tile`` mode both fit\nand apply remain local to each ``100 x 100`` tile.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 51,
          "methods": [],
          "name": "_resolve_topo_chunk_dims",
          "parameters": [
            {
              "annotation": "NeonCube",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "str | TopoFitMode",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "topo_fit_mode"
            }
          ],
          "path": "spectralbridge.brdf_topo._resolve_topo_chunk_dims",
          "signature": "_resolve_topo_chunk_dims(cube: NeonCube, topo_fit_mode: str | TopoFitMode) -> tuple[int, int]",
          "summary": "Return spatial chunk sizes used while applying topographic correction.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 68,
          "methods": [],
          "name": "_derive_corrected_stem",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_img_path"
            }
          ],
          "path": "spectralbridge.brdf_topo._derive_corrected_stem",
          "signature": "_derive_corrected_stem(raw_img_path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Compute the correction parameter payload without writing it to disk.",
          "examples": [],
          "exports": [
            "spectralbridge.brdf_topo.build_correction_parameters_dict"
          ],
          "kind": "function",
          "line": 79,
          "methods": [],
          "name": "build_correction_parameters_dict",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "h5_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_hdr_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "base_folder"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "flight_stem"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "product_code"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_slice"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "line_slice"
            }
          ],
          "path": "spectralbridge.brdf_topo.build_correction_parameters_dict",
          "signature": "build_correction_parameters_dict(*, h5_path: Path, raw_img_path: Path, raw_hdr_path: Path, base_folder: Path, use_ndvi_brdf_bins: bool=False, flight_stem: str | None=None, product_code: str | None=None, sample_slice: slice | tuple[int, int] | None=None, line_slice: slice | tuple[int, int] | None=None) -> dict",
          "summary": "Compute the correction parameter payload without writing it to disk.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Persist BRDF/topographic correction parameters for a flightline.",
          "examples": [],
          "exports": [
            "spectralbridge.brdf_topo.build_and_write_correction_json"
          ],
          "kind": "function",
          "line": 189,
          "methods": [],
          "name": "build_and_write_correction_json",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_hdr_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_dir"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "use_ndvi_brdf_bins"
            }
          ],
          "path": "spectralbridge.brdf_topo.build_and_write_correction_json",
          "signature": "build_and_write_correction_json(h5_path: Path, raw_img_path: Path, raw_hdr_path: Path, out_dir: Path, use_ndvi_brdf_bins: bool=False) -> Path",
          "summary": "Persist BRDF/topographic correction parameters for a flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run the BRDF+topographic correction using ``params`` into ``out_*`` paths.\n\nParameters\n----------\ntopo_fit_mode : {\"scene\", \"tile\"}, default \"scene\"\n    Controls how topographic correction is fit before application.\n\n    * ``\"scene\"`` fits the SCS+C regression once over the full flightline\n      footprint (HyTools-style), then applies in memory-safe row strips.\n    * ``\"tile\"`` fits independently inside each 100x100 spatial tile.",
          "examples": [],
          "exports": [
            "spectralbridge.brdf_topo.apply_brdf_topo_core"
          ],
          "kind": "function",
          "line": 255,
          "methods": [],
          "name": "apply_brdf_topo_core",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_hdr_path"
            },
            {
              "annotation": "dict",
              "default": null,
              "kind": "keyword-only",
              "name": "params"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "out_img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "out_hdr_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "str | TopoFitMode",
              "default": "_DEFAULT_TOPO_FIT_MODE",
              "kind": "keyword-only",
              "name": "topo_fit_mode"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "interactive_mode"
            },
            {
              "annotation": "int",
              "default": "25",
              "kind": "keyword-only",
              "name": "log_every"
            }
          ],
          "path": "spectralbridge.brdf_topo.apply_brdf_topo_core",
          "signature": "apply_brdf_topo_core(*, raw_img_path: Path, raw_hdr_path: Path, params: dict, out_img_path: Path, out_hdr_path: Path, use_ndvi_brdf_bins: bool=False, topo_fit_mode: str | TopoFitMode=_DEFAULT_TOPO_FIT_MODE, interactive_mode: bool=True, log_every: int=25) -> None",
          "summary": "Run the BRDF+topographic correction using ``params`` into ``out_*`` paths.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Apply BRDF + topographic correction using precomputed parameters.",
          "examples": [],
          "exports": [
            "spectralbridge.brdf_topo.apply_brdf_topo_correction"
          ],
          "kind": "function",
          "line": 433,
          "methods": [],
          "name": "apply_brdf_topo_correction",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_hdr_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "correction_json_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "out_dir"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "str | TopoFitMode",
              "default": "_DEFAULT_TOPO_FIT_MODE",
              "kind": "keyword-only",
              "name": "topo_fit_mode"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "interactive_mode"
            },
            {
              "annotation": "int",
              "default": "25",
              "kind": "keyword-only",
              "name": "log_every"
            }
          ],
          "path": "spectralbridge.brdf_topo.apply_brdf_topo_correction",
          "signature": "apply_brdf_topo_correction(*, raw_img_path: Path, raw_hdr_path: Path, correction_json_path: Path, out_dir: Path, use_ndvi_brdf_bins: bool=False, topo_fit_mode: str | TopoFitMode=_DEFAULT_TOPO_FIT_MODE, interactive_mode: bool=True, log_every: int=25) -> Tuple[Path, Path]",
          "summary": "Apply BRDF + topographic correction using precomputed parameters.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/brdf_topo.py",
      "sha256": "b4d7afc2ae0a02964ce70ce291f8c5233380fe926ef698b01b55b4ce7c156e7e"
    },
    {
      "area": "corrections",
      "constants": [],
      "declared_exports": [
        "apply_brightness_correction"
      ],
      "docstring": "",
      "export_expressions": [
        "__all__ = ['apply_brightness_correction']"
      ],
      "imports": {
        "Literal": "typing.Literal",
        "Optional": "typing.Optional",
        "Tuple": "typing.Tuple",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.brightness",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 8,
          "methods": [],
          "name": "_prepare_cube",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            }
          ],
          "path": "spectralbridge.brightness._prepare_cube",
          "signature": "_prepare_cube(cube: np.ndarray) -> tuple[np.ndarray, bool]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 18,
          "methods": [],
          "name": "_prepare_mask",
          "parameters": [
            {
              "annotation": "Optional[np.ndarray]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "mask"
            },
            {
              "annotation": "tuple[int, int, int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "shape"
            }
          ],
          "path": "spectralbridge.brightness._prepare_mask",
          "signature": "_prepare_mask(mask: Optional[np.ndarray], shape: tuple[int, int, int]) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 29,
          "methods": [],
          "name": "_band_percentiles",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "mask"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "p_lo"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "p_hi"
            }
          ],
          "path": "spectralbridge.brightness._band_percentiles",
          "signature": "_band_percentiles(data: np.ndarray, mask: np.ndarray, p_lo: float, p_hi: float) -> tuple[np.ndarray, np.ndarray]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 47,
          "methods": [],
          "name": "_solve_linear_regression",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reference"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "mask"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "huber_delta"
            }
          ],
          "path": "spectralbridge.brightness._solve_linear_regression",
          "signature": "_solve_linear_regression(cube: np.ndarray, reference: np.ndarray, mask: np.ndarray, huber_delta: float) -> tuple[np.ndarray, np.ndarray]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Apply a per-band brightness correction to hyperspectral/multispectral data.\n\nThis normalizes scene brightness under varying illumination (sun angle, terrain shadow)\nor sensor gain drift. Typically used after ENVI export and before BRDF correction.\n\nMathematical form\n-----------------\nFor band b:\n    y_corr[b] = gain[b] * y_raw[b] + offset[b]\nwhere gain/offset come from robust percentile matching or regression vs a reference.\n\nParameters\n----------\ncube : np.ndarray\n    Array shaped (B, Y, X) or (Y, X, B).\nmask : np.ndarray, optional\n    Boolean mask: True = valid pixel used for stats.\nmethod : {'percentile_match', 'linear_regression', 'unit_gain_offset_only'}, default='percentile_match'\n    Strategy for estimating per-band gain/offset.\nreference_cube : np.ndarray, optional\n    Reference to match brightness against (required for 'linear_regression').\nreference_stats : tuple[np.ndarray, np.ndarray], optional\n    (p_lo, p_hi) per band for reference distribution (each shape (B,)).\np_lo, p_hi : float\n    Robust percentile bounds, default (5, 95).\nclip_min, clip_max : float\n    Optional post-correction clipping, default (0.0, 1.2).\nhuber_delta : float\n    Huber delta for robust regression.\n\nReturns\n-------\nnp.ndarray\n    Corrected cube with same shape as input.\ndict\n    Metadata with per-band gain/offset and diagnostics.\n\nExamples\n--------\n>>> import numpy as np\n>>> from spectralbridge import apply_brightness_correction\n>>> cube = np.full((2, 4, 4), .2, dtype=np.float32)\n>>> corr, meta = apply_brightness_correction(cube)\n>>> assert corr.shape == cube.shape\n\nNotes\n-----\n- NaNs preserved. Bandwise affine transform.\n- See also: topo+BRDF correction stage and QA JSON (gain/offset are included there when run).",
          "examples": [],
          "exports": [
            "spectralbridge.apply_brightness_correction",
            "spectralbridge.brightness.apply_brightness_correction"
          ],
          "kind": "function",
          "line": 84,
          "methods": [],
          "name": "apply_brightness_correction",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "Optional[np.ndarray]",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "mask"
            },
            {
              "annotation": "Literal['percentile_match', 'linear_regression', 'unit_gain_offset_only']",
              "default": "'percentile_match'",
              "kind": "keyword-only",
              "name": "method"
            },
            {
              "annotation": "Optional[np.ndarray]",
              "default": "None",
              "kind": "keyword-only",
              "name": "reference_cube"
            },
            {
              "annotation": "Optional[Tuple[np.ndarray, np.ndarray]]",
              "default": "None",
              "kind": "keyword-only",
              "name": "reference_stats"
            },
            {
              "annotation": "float",
              "default": "5.0",
              "kind": "keyword-only",
              "name": "p_lo"
            },
            {
              "annotation": "float",
              "default": "95.0",
              "kind": "keyword-only",
              "name": "p_hi"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "clip_min"
            },
            {
              "annotation": "float",
              "default": "1.2",
              "kind": "keyword-only",
              "name": "clip_max"
            },
            {
              "annotation": "float",
              "default": "0.1",
              "kind": "keyword-only",
              "name": "huber_delta"
            }
          ],
          "path": "spectralbridge.brightness.apply_brightness_correction",
          "signature": "apply_brightness_correction(cube: np.ndarray, mask: Optional[np.ndarray]=None, *, method: Literal['percentile_match', 'linear_regression', 'unit_gain_offset_only']='percentile_match', reference_cube: Optional[np.ndarray]=None, reference_stats: Optional[Tuple[np.ndarray, np.ndarray]]=None, p_lo: float=5.0, p_hi: float=95.0, clip_min: float=0.0, clip_max: float=1.2, huber_delta: float=0.1) -> tuple[np.ndarray, dict[str, np.ndarray]]",
          "summary": "Apply a per-band brightness correction to hyperspectral/multispectral data.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/brightness.py",
      "sha256": "56a69defa559a14b3e5dc9fb729828e65f7ef3f6c6342b4dcc2b65fc5c6d9e9a"
    },
    {
      "area": "corrections",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Dict": "typing.Dict",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.brightness_config",
      "objects": [
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [
            "docs/reference/extending.md"
          ],
          "docstring": "Load brightness coefficients for a given system pair.\n\nParameters\n----------\nsystem_pair : str\n    Key identifying the pair of systems, e.g. \"landsat_to_micasense\".\n\nReturns\n-------\ndict[int, float]\n    Mapping from 1-based band index to brightness coefficient (percent).\n\nNotes\n-----\n- Values are stored in percent (e.g., -7.3959 means \"reduce by 7.3959%\").\n\nExamples\n--------\n>>> from spectralbridge import load_brightness_coefficients\n>>> coefficients = load_brightness_coefficients()\n>>> assert all(isinstance(band, int) and band >= 1 for band in coefficients)",
          "examples": [],
          "exports": [
            "spectralbridge.load_brightness_coefficients"
          ],
          "kind": "function",
          "line": 9,
          "methods": [],
          "name": "load_brightness_coefficients",
          "parameters": [
            {
              "annotation": "str",
              "default": "'landsat_to_micasense'",
              "kind": "positional-or-keyword",
              "name": "system_pair"
            }
          ],
          "path": "spectralbridge.brightness_config.load_brightness_coefficients",
          "signature": "load_brightness_coefficients(system_pair: str='landsat_to_micasense') -> Dict[int, float]",
          "summary": "Load brightness coefficients for a given system pair.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/brightness_config.py",
      "sha256": "e69c5f0cbb9cd79fafc03ad98f8b4ea9f03e8489eea02a19a82b5a2d696c6c36"
    },
    {
      "area": "bulk",
      "constants": [],
      "declared_exports": [
        "AnalysisProfile",
        "BULK_RESULTS_SCHEMA_VERSION",
        "BULK_SCHEMA_VERSION",
        "BulkAnalysisPaths",
        "BulkInputKind",
        "BulkInputMode",
        "BulkResultsConfig",
        "BulkResultsPaths",
        "BulkSource",
        "ExclusionRecord",
        "FlightlineIdentity",
        "FlightlineIdentityParser",
        "FlightlineRecord",
        "ProductDescriptor",
        "ProductRegistry",
        "SourceFileRecord",
        "SpectralLibraryPlotConfig",
        "TabularProductDescriptor",
        "TranslationPair",
        "build_bulk_catalog",
        "build_harmonized_dataset",
        "canonical_identity_from_product",
        "discover_bulk_sources",
        "inspect_spectral_library",
        "inspect_spectral_library_preflight",
        "run_dataset_census",
        "run_leave_one_site_out",
        "run_sensor_translation",
        "run_spectral_library_analysis",
        "summarize_bulk_results"
      ],
      "docstring": "Production-scale catalog, virtual dataset, and population analyses.",
      "export_expressions": [
        "__all__ = ['BULK_SCHEMA_VERSION', 'BULK_RESULTS_SCHEMA_VERSION', 'BulkAnalysisPaths', 'BulkInputKind', 'BulkInputMode', 'BulkSource', 'BulkResultsConfig', 'BulkResultsPaths', 'ExclusionRecord', 'FlightlineIdentity', 'FlightlineIdentityParser', 'FlightlineRecord', 'SourceFileRecord', 'AnalysisProfile', 'ProductDescriptor', 'ProductRegistry', 'TabularProductDescriptor', 'TranslationPair', 'SpectralLibraryPlotConfig', 'build_bulk_catalog', 'build_harmonized_dataset', 'canonical_identity_from_product', 'discover_bulk_sources', 'run_dataset_census', 'run_leave_one_site_out', 'run_sensor_translation', 'inspect_spectral_library', 'inspect_spectral_library_preflight', 'run_spectral_library_analysis', 'summarize_bulk_results']"
      ],
      "imports": {
        "AnalysisProfile": "spectralbridge.bulk.registry.AnalysisProfile",
        "BULK_RESULTS_SCHEMA_VERSION": "spectralbridge.bulk.results.BULK_RESULTS_SCHEMA_VERSION",
        "BULK_SCHEMA_VERSION": "spectralbridge.bulk.models.BULK_SCHEMA_VERSION",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "BulkInputKind": "spectralbridge.bulk.models.BulkInputKind",
        "BulkInputMode": "spectralbridge.bulk.models.BulkInputMode",
        "BulkResultsConfig": "spectralbridge.bulk.results.BulkResultsConfig",
        "BulkResultsPaths": "spectralbridge.bulk.results.BulkResultsPaths",
        "BulkSource": "spectralbridge.bulk.models.BulkSource",
        "ExclusionRecord": "spectralbridge.bulk.models.ExclusionRecord",
        "FlightlineIdentity": "spectralbridge.bulk.identity.FlightlineIdentity",
        "FlightlineIdentityParser": "spectralbridge.bulk.identity.FlightlineIdentityParser",
        "FlightlineRecord": "spectralbridge.bulk.models.FlightlineRecord",
        "ProductDescriptor": "spectralbridge.bulk.registry.ProductDescriptor",
        "ProductRegistry": "spectralbridge.bulk.registry.ProductRegistry",
        "SourceFileRecord": "spectralbridge.bulk.models.SourceFileRecord",
        "SpectralLibraryPlotConfig": "spectralbridge.bulk.analyses.SpectralLibraryPlotConfig",
        "TabularProductDescriptor": "spectralbridge.bulk.registry.TabularProductDescriptor",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "build_bulk_catalog": "spectralbridge.bulk.catalog.build_bulk_catalog",
        "build_harmonized_dataset": "spectralbridge.bulk.harmonized.build_harmonized_dataset",
        "canonical_identity_from_product": "spectralbridge.bulk.catalog.canonical_identity_from_product",
        "discover_bulk_sources": "spectralbridge.bulk.catalog.discover_bulk_sources",
        "inspect_spectral_library": "spectralbridge.bulk.analyses.inspect_spectral_library",
        "inspect_spectral_library_preflight": "spectralbridge.bulk.analyses.inspect_spectral_library_preflight",
        "run_dataset_census": "spectralbridge.bulk.analyses.run_dataset_census",
        "run_leave_one_site_out": "spectralbridge.bulk.analyses.run_leave_one_site_out",
        "run_sensor_translation": "spectralbridge.bulk.analyses.run_sensor_translation",
        "run_spectral_library_analysis": "spectralbridge.bulk.analyses.run_spectral_library_analysis",
        "summarize_bulk_results": "spectralbridge.bulk.results.summarize_bulk_results"
      },
      "module": "spectralbridge.bulk",
      "objects": [],
      "path": "src/spectralbridge/bulk/__init__.py",
      "sha256": "a7bcf45eb2c1e903cc157ec9bc9ba1fef916d185ca48a4048de88c13e74da7f7"
    },
    {
      "area": "bulk",
      "constants": [],
      "declared_exports": [
        "SpectralLibraryPlotConfig",
        "inspect_spectral_library",
        "inspect_spectral_library_preflight",
        "run_dataset_census",
        "run_leave_one_site_out",
        "run_sensor_translation",
        "run_spectral_library_analysis"
      ],
      "docstring": "Independently callable population-analysis modules.",
      "export_expressions": [
        "__all__ = ['run_dataset_census', 'run_leave_one_site_out', 'run_sensor_translation', 'SpectralLibraryPlotConfig', 'inspect_spectral_library', 'inspect_spectral_library_preflight', 'run_spectral_library_analysis']"
      ],
      "imports": {
        "SpectralLibraryPlotConfig": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPlotConfig",
        "inspect_spectral_library": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library",
        "inspect_spectral_library_preflight": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
        "run_dataset_census": "spectralbridge.bulk.analyses.dataset_census.run_dataset_census",
        "run_leave_one_site_out": "spectralbridge.bulk.analyses.leave_one_site_out.run_leave_one_site_out",
        "run_sensor_translation": "spectralbridge.bulk.analyses.sensor_translation.run_sensor_translation",
        "run_spectral_library_analysis": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis"
      },
      "module": "spectralbridge.bulk.analyses",
      "objects": [],
      "path": "src/spectralbridge/bulk/analyses/__init__.py",
      "sha256": "380eacba74d1de917098d06e0faed559fac8cb8c73e4362b3c818336919d010b"
    },
    {
      "area": "bulk",
      "constants": [],
      "declared_exports": [
        "PairSpec",
        "available_pair_specs",
        "band_map",
        "pair_literals",
        "sql_literal",
        "valid_pair_cte"
      ],
      "docstring": "Shared projected-query helpers for bulk analyses.",
      "export_expressions": [
        "__all__ = ['PairSpec', 'available_pair_specs', 'band_map', 'pair_literals', 'sql_literal', 'valid_pair_cte']"
      ],
      "imports": {
        "DEFAULT_PRODUCT_REGISTRY": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
        "Sequence": "typing.Sequence",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "observation_columns": "spectralbridge.bulk.dataset.observation_columns",
        "quote_identifier": "spectralbridge.bulk.dataset.quote_identifier"
      },
      "module": "spectralbridge.bulk.analyses.common",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "translation_pair"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "target_sensor"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "band_index"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "source_band_index"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "target_band_index"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "x_column"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "y_column"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "name": "error_columns"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Describe one registered source/target band pair available in a bulk observation view.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.common.PairSpec"
          ],
          "kind": "class",
          "line": 15,
          "methods": [
            {
              "docstring": "Compatibility alias for the former source-sensor field.",
              "line": 29,
              "name": "micasense_sensor",
              "parameters": [],
              "private": false,
              "signature": "micasense_sensor(self) -> str"
            },
            {
              "docstring": "Compatibility alias for the former target-sensor field.",
              "line": 35,
              "name": "landsat_sensor",
              "parameters": [],
              "private": false,
              "signature": "landsat_sensor(self) -> str"
            }
          ],
          "name": "PairSpec",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.common.PairSpec",
          "signature": null,
          "summary": "Describe one registered source/target band pair available in a bulk observation view.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Map sensor-labelled ``*_band_<integer>`` columns to their available band indices.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.common.band_map"
          ],
          "kind": "function",
          "line": 41,
          "methods": [],
          "name": "band_map",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            }
          ],
          "path": "spectralbridge.bulk.analyses.common.band_map",
          "signature": "band_map(columns: Sequence[str]) -> dict[str, set[int]]",
          "summary": "Map sensor-labelled ``*_band_<integer>`` columns to their available band indices.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 52,
          "methods": [],
          "name": "_possible_error_columns",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "label"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band_index"
            }
          ],
          "path": "spectralbridge.bulk.analyses.common._possible_error_columns",
          "signature": "_possible_error_columns(label: str, band_index: int) -> tuple[str, ...]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Select registered band relationships whose source and target columns both exist.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.common.available_pair_specs"
          ],
          "kind": "function",
          "line": 62,
          "methods": [],
          "name": "available_pair_specs",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Sequence[TranslationPair] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "translation_pairs"
            }
          ],
          "path": "spectralbridge.bulk.analyses.common.available_pair_specs",
          "signature": "available_pair_specs(con: duckdb.DuckDBPyConnection, translation_pairs: Sequence[TranslationPair] | None=None) -> list[PairSpec]",
          "summary": "Select registered band relationships whose source and target columns both exist.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.common.sql_literal"
          ],
          "kind": "function",
          "line": 114,
          "methods": [],
          "name": "sql_literal",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.analyses.common.sql_literal",
          "signature": "sql_literal(value: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Projected valid-pair CTE shared by all regression levels.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.common.valid_pair_cte"
          ],
          "kind": "function",
          "line": 118,
          "methods": [],
          "name": "valid_pair_cte",
          "parameters": [
            {
              "annotation": "PairSpec",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spec"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "minimum_reflectance"
            }
          ],
          "path": "spectralbridge.bulk.analyses.common.valid_pair_cte",
          "signature": "valid_pair_cte(spec: PairSpec, minimum_reflectance: float) -> str",
          "summary": "Projected valid-pair CTE shared by all regression levels.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Build SQL literal columns identifying one registered band relationship.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.common.pair_literals"
          ],
          "kind": "function",
          "line": 151,
          "methods": [],
          "name": "pair_literals",
          "parameters": [
            {
              "annotation": "PairSpec",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spec"
            }
          ],
          "path": "spectralbridge.bulk.analyses.common.pair_literals",
          "signature": "pair_literals(spec: PairSpec) -> str",
          "summary": "Build SQL literal columns identifying one registered band relationship.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/analyses/common.py",
      "sha256": "aa848acf1f1c9a272121d3f321ec7edf8b440bc7bf57b94cc173de8ee4394af8"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "REQUIRED_INPUT_TABLES",
          "value": "('flightlines', 'source_files')"
        }
      ],
      "declared_exports": [
        "DatasetCensusPaths",
        "REQUIRED_INPUT_TABLES",
        "run_dataset_census"
      ],
      "docstring": "Fast catalog-only preflight census for a bulk collection.",
      "export_expressions": [
        "__all__ = ['DatasetCensusPaths', 'REQUIRED_INPUT_TABLES', 'run_dataset_census']"
      ],
      "imports": {
        "Any": "typing.Any",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "copy_table_atomic": "spectralbridge.bulk.dataset.copy_table_atomic",
        "dataclass": "dataclasses.dataclass",
        "sql_literal": "spectralbridge.bulk.analyses.common.sql_literal",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic",
        "write_text_atomic": "spectralbridge.bulk.provenance.write_text_atomic"
      },
      "module": "spectralbridge.bulk.analyses.dataset_census",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "directory"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Resolve compact census tables and report paths beneath a bulk analysis run.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.dataset_census.DatasetCensusPaths"
          ],
          "kind": "class",
          "line": 23,
          "methods": [
            {
              "docstring": "",
              "line": 29,
              "name": "summary_parquet",
              "parameters": [],
              "private": false,
              "signature": "summary_parquet(self) -> Path"
            },
            {
              "docstring": "",
              "line": 33,
              "name": "summary_json",
              "parameters": [],
              "private": false,
              "signature": "summary_json(self) -> Path"
            },
            {
              "docstring": "",
              "line": 37,
              "name": "report",
              "parameters": [],
              "private": false,
              "signature": "report(self) -> Path"
            },
            {
              "docstring": "",
              "line": 41,
              "name": "by_site",
              "parameters": [],
              "private": false,
              "signature": "by_site(self) -> Path"
            },
            {
              "docstring": "",
              "line": 45,
              "name": "by_year",
              "parameters": [],
              "private": false,
              "signature": "by_year(self) -> Path"
            },
            {
              "docstring": "",
              "line": 49,
              "name": "by_sensor",
              "parameters": [],
              "private": false,
              "signature": "by_sensor(self) -> Path"
            },
            {
              "docstring": "",
              "line": 53,
              "name": "by_schema",
              "parameters": [],
              "private": false,
              "signature": "by_schema(self) -> Path"
            },
            {
              "docstring": "",
              "line": 57,
              "name": "by_product",
              "parameters": [],
              "private": false,
              "signature": "by_product(self) -> Path"
            },
            {
              "docstring": "",
              "line": 61,
              "name": "missing_products",
              "parameters": [],
              "private": false,
              "signature": "missing_products(self) -> Path"
            },
            {
              "docstring": "",
              "line": 65,
              "name": "inconsistencies",
              "parameters": [],
              "private": false,
              "signature": "inconsistencies(self) -> Path"
            },
            {
              "docstring": "",
              "line": 69,
              "name": "by_exclusion_reason",
              "parameters": [],
              "private": false,
              "signature": "by_exclusion_reason(self) -> Path"
            }
          ],
          "name": "DatasetCensusPaths",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.dataset_census.DatasetCensusPaths",
          "signature": null,
          "summary": "Resolve compact census tables and report paths beneath a bulk analysis run.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 73,
          "methods": [],
          "name": "_scalar",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "query"
            }
          ],
          "path": "spectralbridge.bulk.analyses.dataset_census._scalar",
          "signature": "_scalar(con: duckdb.DuckDBPyConnection, query: str) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 78,
          "methods": [],
          "name": "_list_values",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "query"
            }
          ],
          "path": "spectralbridge.bulk.analyses.dataset_census._list_values",
          "signature": "_list_values(con: duckdb.DuckDBPyConnection, query: str) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Write metadata-only census tables without scanning observation values.\n\nParameters\n----------\ncon : duckdb.DuckDBPyConnection\n    Open DuckDB connection prepared by the bulk workflow with the required catalog and observation views; the caller owns its lifetime.\npaths : BulkAnalysisPaths\n    BulkAnalysisPaths instance selecting isolated catalog, database, analysis and report locations.\nanalysis_run_id : str\n    Provenance identifier written into generated tables and restart metadata for this run.\nreuse_existing : bool, default=True\n    Reuse valid analysis outputs when their recorded inputs match, rather than recomputing them.\n\nReturns\n-------\ndict[str, Any]\n    Status, summary counts and paths to census Parquet, JSON, missing-product table and report.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.run_dataset_census",
            "spectralbridge.bulk.analyses.run_dataset_census",
            "spectralbridge.bulk.analyses.dataset_census.run_dataset_census"
          ],
          "kind": "function",
          "line": 82,
          "methods": [],
          "name": "run_dataset_census",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "reuse_existing"
            }
          ],
          "path": "spectralbridge.bulk.analyses.dataset_census.run_dataset_census",
          "signature": "run_dataset_census(con: duckdb.DuckDBPyConnection, paths: BulkAnalysisPaths, *, analysis_run_id: str, reuse_existing: bool=True) -> dict[str, Any]",
          "summary": "Write metadata-only census tables without scanning observation values.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/analyses/dataset_census.py",
      "sha256": "a0bbd6d0fb09edd7b3c47dba852d46c3548d10ae20153ab91ac434493c8ce103"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "REQUIRED_INPUT_TABLES",
          "value": "('bulk_observations',)"
        },
        {
          "annotation": null,
          "name": "REQUIRED_PROVENANCE_COLUMNS",
          "value": "('bulk_flightline_id', 'bulk_site')"
        }
      ],
      "declared_exports": [
        "LeaveOneSiteOutPaths",
        "REQUIRED_INPUT_TABLES",
        "REQUIRED_PROVENANCE_COLUMNS",
        "run_leave_one_site_out"
      ],
      "docstring": "Leave-one-site-out validation for synthetic sensor translation.",
      "export_expressions": [
        "__all__ = ['LeaveOneSiteOutPaths', 'REQUIRED_INPUT_TABLES', 'REQUIRED_PROVENANCE_COLUMNS', 'run_leave_one_site_out']"
      ],
      "imports": {
        "Any": "typing.Any",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "DEFAULT_PRODUCT_REGISTRY": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
        "PairSpec": "spectralbridge.bulk.analyses.common.PairSpec",
        "Path": "pathlib.Path",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "annotations": "__future__.annotations",
        "available_pair_specs": "spectralbridge.bulk.analyses.common.available_pair_specs",
        "copy_table_atomic": "spectralbridge.bulk.dataset.copy_table_atomic",
        "dataclass": "dataclasses.dataclass",
        "pair_literals": "spectralbridge.bulk.analyses.common.pair_literals",
        "sql_literal": "spectralbridge.bulk.analyses.common.sql_literal",
        "valid_pair_cte": "spectralbridge.bulk.analyses.common.valid_pair_cte",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.bulk.analyses.leave_one_site_out",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "directory"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Resolve held-site fit tables and metadata beneath a bulk analysis run.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.leave_one_site_out.LeaveOneSiteOutPaths"
          ],
          "kind": "class",
          "line": 28,
          "methods": [
            {
              "docstring": "",
              "line": 34,
              "name": "results",
              "parameters": [],
              "private": false,
              "signature": "results(self) -> Path"
            },
            {
              "docstring": "",
              "line": 38,
              "name": "metadata",
              "parameters": [],
              "private": false,
              "signature": "metadata(self) -> Path"
            }
          ],
          "name": "LeaveOneSiteOutPaths",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.leave_one_site_out.LeaveOneSiteOutPaths",
          "signature": null,
          "summary": "Resolve held-site fit tables and metadata beneath a bulk analysis run.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 74,
          "methods": [],
          "name": "_loso_query",
          "parameters": [
            {
              "annotation": "PairSpec",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spec"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            }
          ],
          "path": "spectralbridge.bulk.analyses.leave_one_site_out._loso_query",
          "signature": "_loso_query(spec: PairSpec, *, analysis_run_id: str, minimum_reflectance: float) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 184,
          "methods": [],
          "name": "_records",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "query"
            }
          ],
          "path": "spectralbridge.bulk.analyses.leave_one_site_out._records",
          "signature": "_records(con: duckdb.DuckDBPyConnection, query: str) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Fit on all other sites and score every held-out site.\n\nParameters\n----------\ncon : duckdb.DuckDBPyConnection\n    Open DuckDB connection prepared by the bulk workflow with the required catalog and observation views; the caller owns its lifetime.\npaths : BulkAnalysisPaths\n    BulkAnalysisPaths instance selecting isolated catalog, database, analysis and report locations.\nanalysis_run_id : str\n    Provenance identifier written into generated tables and restart metadata for this run.\nminimum_reflectance : float\n    Lower screening bound in the stored reflectance units; used for regression validity, not automatic unit conversion.\ntranslation_pairs : tuple[TranslationPair, ...] | None, default=None\n    Explicit registered source-to-target relationships to analyze; None uses the selected registry/profile defaults.\nreuse_existing : bool, default=True\n    Reuse valid analysis outputs when their recorded inputs match, rather than recomputing them.\n\nReturns\n-------\ndict[str, Any]\n    Status, held-site result count and paths to compact results and metadata.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.run_leave_one_site_out",
            "spectralbridge.bulk.analyses.run_leave_one_site_out",
            "spectralbridge.bulk.analyses.leave_one_site_out.run_leave_one_site_out"
          ],
          "kind": "function",
          "line": 190,
          "methods": [],
          "name": "run_leave_one_site_out",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            },
            {
              "annotation": "tuple[TranslationPair, ...] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "reuse_existing"
            }
          ],
          "path": "spectralbridge.bulk.analyses.leave_one_site_out.run_leave_one_site_out",
          "signature": "run_leave_one_site_out(con: duckdb.DuckDBPyConnection, paths: BulkAnalysisPaths, *, analysis_run_id: str, minimum_reflectance: float, translation_pairs: tuple[TranslationPair, ...] | None=None, reuse_existing: bool=True) -> dict[str, Any]",
          "summary": "Fit on all other sites and score every held-out site.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/analyses/leave_one_site_out.py",
      "sha256": "fe8b5ec328013841d56c20dfaf2de0c1afec3940be153bc666fc5895e9458a0f"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "REQUIRED_INPUT_TABLES",
          "value": "('bulk_observations',)"
        },
        {
          "annotation": null,
          "name": "REQUIRED_PROVENANCE_COLUMNS",
          "value": "('bulk_source_id', 'bulk_flightline_id', 'bulk_site')"
        }
      ],
      "declared_exports": [
        "REQUIRED_INPUT_TABLES",
        "REQUIRED_PROVENANCE_COLUMNS",
        "SensorTranslationPaths",
        "run_sensor_translation"
      ],
      "docstring": "Hierarchical synthetic MicaSense-to-Landsat translation analysis.",
      "export_expressions": [
        "__all__ = ['REQUIRED_INPUT_TABLES', 'REQUIRED_PROVENANCE_COLUMNS', 'SensorTranslationPaths', 'run_sensor_translation']"
      ],
      "imports": {
        "Any": "typing.Any",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "DEFAULT_PRODUCT_REGISTRY": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
        "PairSpec": "spectralbridge.bulk.analyses.common.PairSpec",
        "Path": "pathlib.Path",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "annotations": "__future__.annotations",
        "available_pair_specs": "spectralbridge.bulk.analyses.common.available_pair_specs",
        "copy_table_atomic": "spectralbridge.bulk.dataset.copy_table_atomic",
        "dataclass": "dataclasses.dataclass",
        "pair_literals": "spectralbridge.bulk.analyses.common.pair_literals",
        "sql_literal": "spectralbridge.bulk.analyses.common.sql_literal",
        "valid_pair_cte": "spectralbridge.bulk.analyses.common.valid_pair_cte",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.bulk.analyses.sensor_translation",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "directory"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Resolve pooled, balanced and grouped sensor-fit artifacts beneath a bulk run.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.sensor_translation.SensorTranslationPaths"
          ],
          "kind": "class",
          "line": 29,
          "methods": [
            {
              "docstring": "",
              "line": 35,
              "name": "pixel_pooled",
              "parameters": [],
              "private": false,
              "signature": "pixel_pooled(self) -> Path"
            },
            {
              "docstring": "",
              "line": 39,
              "name": "per_flightline",
              "parameters": [],
              "private": false,
              "signature": "per_flightline(self) -> Path"
            },
            {
              "docstring": "",
              "line": 43,
              "name": "per_site",
              "parameters": [],
              "private": false,
              "signature": "per_site(self) -> Path"
            },
            {
              "docstring": "",
              "line": 47,
              "name": "flightline_balanced",
              "parameters": [],
              "private": false,
              "signature": "flightline_balanced(self) -> Path"
            },
            {
              "docstring": "",
              "line": 51,
              "name": "site_balanced",
              "parameters": [],
              "private": false,
              "signature": "site_balanced(self) -> Path"
            },
            {
              "docstring": "",
              "line": 55,
              "name": "metadata",
              "parameters": [],
              "private": false,
              "signature": "metadata(self) -> Path"
            }
          ],
          "name": "SensorTranslationPaths",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.sensor_translation.SensorTranslationPaths",
          "signature": null,
          "summary": "Resolve pooled, balanced and grouped sensor-fit artifacts beneath a bulk run.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 98,
          "methods": [],
          "name": "_grouped_query",
          "parameters": [
            {
              "annotation": "PairSpec",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spec"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_level"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            }
          ],
          "path": "spectralbridge.bulk.analyses.sensor_translation._grouped_query",
          "signature": "_grouped_query(spec: PairSpec, *, analysis_run_id: str, analysis_level: str, minimum_reflectance: float) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 189,
          "methods": [],
          "name": "_balanced_query",
          "parameters": [
            {
              "annotation": "PairSpec",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spec"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "balance_level"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            }
          ],
          "path": "spectralbridge.bulk.analyses.sensor_translation._balanced_query",
          "signature": "_balanced_query(spec: PairSpec, *, analysis_run_id: str, balance_level: str, minimum_reflectance: float) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 276,
          "methods": [],
          "name": "_create_table_from_queries",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table_name"
            },
            {
              "annotation": "list[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "queries"
            }
          ],
          "path": "spectralbridge.bulk.analyses.sensor_translation._create_table_from_queries",
          "signature": "_create_table_from_queries(con: duckdb.DuckDBPyConnection, table_name: str, queries: list[str]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 291,
          "methods": [],
          "name": "_records",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "query"
            }
          ],
          "path": "spectralbridge.bulk.analyses.sensor_translation._records",
          "signature": "_records(con: duckdb.DuckDBPyConnection, query: str) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Run pooled, grouped, and equal-replicate sensor regressions.\n\nParameters\n----------\ncon : duckdb.DuckDBPyConnection\n    Open DuckDB connection prepared by the bulk workflow with the required catalog and observation views; the caller owns its lifetime.\npaths : BulkAnalysisPaths\n    BulkAnalysisPaths instance selecting isolated catalog, database, analysis and report locations.\nanalysis_run_id : str\n    Provenance identifier written into generated tables and restart metadata for this run.\nminimum_reflectance : float\n    Lower screening bound in the stored reflectance units; used for regression validity, not automatic unit conversion.\ntranslation_pairs : tuple[TranslationPair, ...] | None, default=None\n    Explicit registered source-to-target relationships to analyze; None uses the selected registry/profile defaults.\nreuse_existing : bool, default=True\n    Reuse valid analysis outputs when their recorded inputs match, rather than recomputing them.\n\nReturns\n-------\ndict[str, Any]\n    Status, pair/candidate counts and paths to pooled, balanced, per-flightline/per-site fits and candidate coefficients.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.run_sensor_translation",
            "spectralbridge.bulk.analyses.run_sensor_translation",
            "spectralbridge.bulk.analyses.sensor_translation.run_sensor_translation"
          ],
          "kind": "function",
          "line": 297,
          "methods": [],
          "name": "run_sensor_translation",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            },
            {
              "annotation": "tuple[TranslationPair, ...] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "reuse_existing"
            }
          ],
          "path": "spectralbridge.bulk.analyses.sensor_translation.run_sensor_translation",
          "signature": "run_sensor_translation(con: duckdb.DuckDBPyConnection, paths: BulkAnalysisPaths, *, analysis_run_id: str, minimum_reflectance: float, translation_pairs: tuple[TranslationPair, ...] | None=None, reuse_existing: bool=True) -> dict[str, Any]",
          "summary": "Run pooled, grouped, and equal-replicate sensor regressions.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/analyses/sensor_translation.py",
      "sha256": "d0e24072d5908ff9ba8d63495b1faa930ad6df2ce61baa942905727d487e7dbd"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "SPECTRAL_LIBRARY_SCHEMA_VERSION",
          "value": "2"
        },
        {
          "annotation": null,
          "name": "DEFAULT_QUANTILES",
          "value": "(0.025, 0.1, 0.25, 0.5, 0.75, 0.9, 0.975)"
        }
      ],
      "declared_exports": [
        "DEFAULT_QUANTILES",
        "SPECTRAL_LIBRARY_SCHEMA_VERSION",
        "SpectralBand",
        "SpectralLibraryPaths",
        "SpectralLibraryPlotConfig",
        "SpectralLibrarySchema",
        "inspect_spectral_library",
        "inspect_spectral_library_preflight",
        "iter_group_spectra",
        "run_spectral_library_analysis",
        "trace_alpha"
      ],
      "docstring": "Bounded summaries and low-alpha reports for an existing spectral library.",
      "export_expressions": [
        "__all__ = ['DEFAULT_QUANTILES', 'SPECTRAL_LIBRARY_SCHEMA_VERSION', 'SpectralBand', 'SpectralLibraryPaths', 'SpectralLibraryPlotConfig', 'SpectralLibrarySchema', 'inspect_spectral_library', 'inspect_spectral_library_preflight', 'iter_group_spectra', 'run_spectral_library_analysis', 'trace_alpha']"
      ],
      "imports": {
        "Any": "typing.Any",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "Figure": "matplotlib.figure.Figure",
        "FigureCanvasAgg": "matplotlib.backends.backend_agg.FigureCanvasAgg",
        "Iterator": "typing.Iterator",
        "Line2D": "matplotlib.lines.Line2D",
        "LineCollection": "matplotlib.collections.LineCollection",
        "Path": "pathlib.Path",
        "PdfPages": "matplotlib.backends.backend_pdf.PdfPages",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "datetime": "datetime.datetime",
        "quote_identifier": "spectralbridge.bulk.dataset.quote_identifier",
        "replace": "dataclasses.replace",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "timezone": "datetime.timezone",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.bulk.analyses.spectral_library",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "column"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "stage"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "band_index"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "wavelength_nm"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Record one wavelength-bearing Parquet column and its band index and nanometer coordinate.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.spectral_library.SpectralBand"
          ],
          "kind": "class",
          "line": 55,
          "methods": [],
          "name": "SpectralBand",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.spectral_library.SpectralBand",
          "signature": null,
          "summary": "Record one wavelength-bearing Parquet column and its band index and nanometer coordinate.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "source"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_signature_sha256"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "row_count"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "species_field"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "polygon_field"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "flightline_field"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "site_field"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "acquisition_date_field"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "pixel_field"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "spectral_stage"
            },
            {
              "annotation": "tuple[SpectralBand, ...]",
              "default": null,
              "name": "bands"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "name": "available_spectral_stages"
            },
            {
              "annotation": "tuple[float, ...]",
              "default": null,
              "name": "detected_nodata_values"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Record the detected group fields, source fingerprint and selected wavelength-bearing spectral stage.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.spectral_library.SpectralLibrarySchema"
          ],
          "kind": "class",
          "line": 65,
          "methods": [
            {
              "docstring": "",
              "line": 83,
              "name": "wavelengths_nm",
              "parameters": [],
              "private": false,
              "signature": "wavelengths_nm(self) -> tuple[float, ...]"
            },
            {
              "docstring": "",
              "line": 86,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "SpectralLibrarySchema",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.spectral_library.SpectralLibrarySchema",
          "signature": null,
          "summary": "Record the detected group fields, source fingerprint and selected wavelength-bearing spectral stage.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "species_field"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "spectral_stage"
            },
            {
              "annotation": "str",
              "default": "'count_desc'",
              "name": "species_sort"
            },
            {
              "annotation": "int",
              "default": "4",
              "name": "panels_per_page"
            },
            {
              "annotation": "int",
              "default": "2000",
              "name": "trace_batch_size"
            },
            {
              "annotation": "int",
              "default": "32",
              "name": "summary_band_batch_size"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "max_traces_per_group"
            },
            {
              "annotation": "int",
              "default": "0",
              "name": "sampling_seed"
            },
            {
              "annotation": "int",
              "default": "150",
              "name": "raster_dpi"
            },
            {
              "annotation": "tuple[float, ...]",
              "default": "DEFAULT_QUANTILES",
              "name": "quantiles"
            },
            {
              "annotation": "tuple[float, float]",
              "default": "DEFAULT_PLOT_Y_QUANTILES",
              "name": "plot_y_quantiles"
            },
            {
              "annotation": "str",
              "default": "'global_robust'",
              "name": "species_y_scale"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "name": "spectral_plot_minimum_reflectance"
            },
            {
              "annotation": "tuple[float, ...]",
              "default": "DEFAULT_NODATA_VALUES",
              "name": "nodata_values"
            },
            {
              "annotation": "float",
              "default": "0.01",
              "name": "nodata_tolerance"
            },
            {
              "annotation": "int",
              "default": "100",
              "name": "max_extreme_spectra_per_species"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Explicit controls for potentially expensive spectral-library reports.\n\nAttributes\n----------\nspecies_field : str | None, default=None\n    Parquet column containing species/group names; None requests schema-based detection.\nspectral_stage : str | None, default=None\n    One wavelength-bearing column prefix to analyze; specify it when multiple processing stages are present.\nspecies_sort : str, default='count_desc'\n    Panel ordering: 'count_desc' (default) sorts by group size; 'alphabetical' sorts by species name.\npanels_per_page : int, default=4\n    Maximum number of group panels per report page, from 1 through 8.\ntrace_batch_size : int, default=2000\n    Positive bounded trace-row or summary-band processing batch size, controlling memory rather than scientific support.\nsummary_band_batch_size : int, default=32\n    Positive bounded trace-row or summary-band processing batch size, controlling memory rather than scientific support.\nmax_traces_per_group : int | None, default=None\n    Optional cap on rendered traces per group; None retains all eligible traces. Numerical summaries retain their own declared full support.\nsampling_seed : int, default=0\n    Seed controlling reproducible trace sampling when a render cap is configured.\nraster_dpi : int, default=150\n    Positive output rendering resolution in dots per inch; rasterization controls file size without changing analytical summaries.\nquantiles : tuple[float, ...], default=DEFAULT_QUANTILES\n    Nonempty sorted probability tuple strictly between 0 and 1, including 0.5 for the median; compact distribution summaries, not fitted boosted quantile models.\nplot_y_quantiles : tuple[float, float], default=DEFAULT_PLOT_Y_QUANTILES\n    Lower/upper probability bounds used for robust display limits only; analytical values are not clipped.\nspecies_y_scale : str, default='global_robust'\n    Display bounds policy: 'global_robust', 'global_full', or 'per_group_robust'. Graphical limits do not clip analytical summaries.\nspectral_plot_minimum_reflectance : float | None, default=None\n    Optional stored-unit lower visualization bound; finite negative corrected reflectance is not automatically nodata.\nnodata_values : tuple[float, ...], default=DEFAULT_NODATA_VALUES\n    Explicit stored-value sentinels excluded from visualization support.\nnodata_tolerance : float, default=0.01\n    Absolute stored-unit tolerance used when comparing values with configured nodata sentinels.\nmax_extreme_spectra_per_species : int, default=100\n    Bounded number of extreme group traces retained with source identities for display-bound diagnostics.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.SpectralLibraryPlotConfig",
            "spectralbridge.bulk.analyses.SpectralLibraryPlotConfig",
            "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPlotConfig"
          ],
          "kind": "class",
          "line": 96,
          "methods": [
            {
              "docstring": "Validate configuration ranges and supported option combinations.\n\nReturns\n-------\nNone\n    No return value; unsupported report settings raise ValueError before rendering.\n\nRaises\n------\nValueError\n    If option values violate the configuration or relationship-selection contract.",
              "line": 152,
              "name": "validate",
              "parameters": [],
              "private": false,
              "signature": "validate(self) -> None"
            }
          ],
          "name": "SpectralLibraryPlotConfig",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPlotConfig",
          "signature": null,
          "summary": "Explicit controls for potentially expensive spectral-library reports.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "analysis_dir"
            },
            {
              "annotation": "Path",
              "default": null,
              "name": "figures_dir"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Resolve compact spectral-library summaries, trace diagnostics and report locations.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPaths"
          ],
          "kind": "class",
          "line": 212,
          "methods": [
            {
              "docstring": "",
              "line": 219,
              "name": "from_bulk_paths",
              "parameters": [
                {
                  "annotation": "BulkAnalysisPaths",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "paths"
                }
              ],
              "private": false,
              "signature": "from_bulk_paths(cls, paths: BulkAnalysisPaths) -> SpectralLibraryPaths"
            },
            {
              "docstring": "",
              "line": 226,
              "name": "species_summary",
              "parameters": [],
              "private": false,
              "signature": "species_summary(self) -> Path"
            },
            {
              "docstring": "",
              "line": 230,
              "name": "species_band_summary",
              "parameters": [],
              "private": false,
              "signature": "species_band_summary(self) -> Path"
            },
            {
              "docstring": "",
              "line": 234,
              "name": "species_quantiles",
              "parameters": [],
              "private": false,
              "signature": "species_quantiles(self) -> Path"
            },
            {
              "docstring": "",
              "line": 238,
              "name": "species_medians",
              "parameters": [],
              "private": false,
              "signature": "species_medians(self) -> Path"
            },
            {
              "docstring": "",
              "line": 242,
              "name": "group_counts",
              "parameters": [],
              "private": false,
              "signature": "group_counts(self) -> Path"
            },
            {
              "docstring": "",
              "line": 246,
              "name": "species_plot_ranges",
              "parameters": [],
              "private": false,
              "signature": "species_plot_ranges(self) -> Path"
            },
            {
              "docstring": "",
              "line": 250,
              "name": "extreme_spectra",
              "parameters": [],
              "private": false,
              "signature": "extreme_spectra(self) -> Path"
            },
            {
              "docstring": "",
              "line": 254,
              "name": "metadata",
              "parameters": [],
              "private": false,
              "signature": "metadata(self) -> Path"
            },
            {
              "docstring": "",
              "line": 258,
              "name": "species_variability",
              "parameters": [],
              "private": false,
              "signature": "species_variability(self) -> Path"
            },
            {
              "docstring": "",
              "line": 262,
              "name": "species_variability_full_range",
              "parameters": [],
              "private": false,
              "signature": "species_variability_full_range(self) -> Path"
            },
            {
              "docstring": "",
              "line": 266,
              "name": "species_quantile_report",
              "parameters": [],
              "private": false,
              "signature": "species_quantile_report(self) -> Path"
            },
            {
              "docstring": "",
              "line": 270,
              "name": "species_median_report",
              "parameters": [],
              "private": false,
              "signature": "species_median_report(self) -> Path"
            },
            {
              "docstring": "",
              "line": 274,
              "name": "observation_counts",
              "parameters": [],
              "private": false,
              "signature": "observation_counts(self) -> Path"
            },
            {
              "docstring": "",
              "line": 278,
              "name": "hierarchy_report",
              "parameters": [],
              "private": false,
              "signature": "hierarchy_report(self) -> Path"
            },
            {
              "docstring": "",
              "line": 282,
              "name": "site_variability",
              "parameters": [],
              "private": false,
              "signature": "site_variability(self) -> Path"
            },
            {
              "docstring": "",
              "line": 286,
              "name": "flightline_variability",
              "parameters": [],
              "private": false,
              "signature": "flightline_variability(self) -> Path"
            }
          ],
          "name": "SpectralLibraryPaths",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPaths",
          "signature": null,
          "summary": "Resolve compact spectral-library summaries, trace diagnostics and report locations.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 388,
          "methods": [],
          "name": "_field",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "explicit"
            },
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "candidates"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._field",
          "signature": "_field(columns: Sequence[str], explicit: str | None, candidates: Sequence[str]) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 400,
          "methods": [],
          "name": "_metadata_nodata_values",
          "parameters": [
            {
              "annotation": "pq.ParquetFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._metadata_nodata_values",
          "signature": "_metadata_nodata_values(parquet: pq.ParquetFile) -> tuple[float, ...]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Inspect a merged polygon Parquet and select one coherent spectral stage.\n\nParameters\n----------\npath : str | Path\n    Existing merged polygon Parquet to inspect in place; no spectral rows are copied into a cache.\nspecies_field : str | None, default=None\n    Parquet column containing species/group names; None requests schema-based detection.\nspectral_stage : str | None, default=None\n    One wavelength-bearing column prefix to analyze; specify it when multiple processing stages are present.\n\nReturns\n-------\nSpectralLibrarySchema\n    Detected source identity, species/group fields, selected spectral stage and ordered wavelength-bearing bands.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.",
          "examples": [
            "examples/first_example.py",
            "examples/release_candidate_smoke.py",
            "examples/scientific_workflows_offline.py"
          ],
          "exports": [
            "spectralbridge.bulk.inspect_spectral_library",
            "spectralbridge.bulk.analyses.inspect_spectral_library",
            "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library"
          ],
          "kind": "function",
          "line": 422,
          "methods": [],
          "name": "inspect_spectral_library",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "species_field"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "spectral_stage"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library",
          "signature": "inspect_spectral_library(path: str | Path, *, species_field: str | None=None, spectral_stage: str | None=None) -> SpectralLibrarySchema",
          "summary": "Inspect a merged polygon Parquet and select one coherent spectral stage.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Deterministic low-alpha rule for qualitative trace-density ensembles.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.spectral_library.trace_alpha"
          ],
          "kind": "function",
          "line": 561,
          "methods": [],
          "name": "trace_alpha",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "trace_count"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library.trace_alpha",
          "signature": "trace_alpha(trace_count: int) -> float",
          "summary": "Deterministic low-alpha rule for qualitative trace-density ensembles.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 569,
          "methods": [],
          "name": "_valid_predicate",
          "parameters": [
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._valid_predicate",
          "signature": "_valid_predicate(schema: SpectralLibrarySchema, config: SpectralLibraryPlotConfig) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 593,
          "methods": [],
          "name": "_visualization_validity_policy",
          "parameters": [
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._visualization_validity_policy",
          "signature": "_visualization_validity_policy(schema: SpectralLibrarySchema, config: SpectralLibraryPlotConfig) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 616,
          "methods": [],
          "name": "_distinct",
          "parameters": [
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "field"
            },
            {
              "annotation": "str",
              "default": "'is_valid'",
              "kind": "positional-or-keyword",
              "name": "valid_name"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._distinct",
          "signature": "_distinct(field: str | None, valid_name: str='is_valid') -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 628,
          "methods": [],
          "name": "_group_count_rows",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "grouping_field"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._group_count_rows",
          "signature": "_group_count_rows(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, grouping_field: str, config: SpectralLibraryPlotConfig) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 673,
          "methods": [],
          "name": "_write_table_atomic",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "pa.Schema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._write_table_atomic",
          "signature": "_write_table_atomic(path: Path, rows: list[dict[str, Any]], schema: pa.Schema) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 683,
          "methods": [],
          "name": "_write_group_counts",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._write_group_counts",
          "signature": "_write_group_counts(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, config: SpectralLibraryPlotConfig) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 705,
          "methods": [],
          "name": "_open_writers",
          "parameters": [
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._open_writers",
          "signature": "_open_writers(paths: SpectralLibraryPaths) -> dict[str, tuple[pq.ParquetWriter, Path, Path]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 721,
          "methods": [],
          "name": "_write_species_spectral_summaries",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "band_batch_size"
            },
            {
              "annotation": "tuple[float, ...]",
              "default": null,
              "kind": "keyword-only",
              "name": "quantiles"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._write_species_spectral_summaries",
          "signature": "_write_species_spectral_summaries(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, *, band_batch_size: int, quantiles: tuple[float, ...], config: SpectralLibraryPlotConfig) -> dict[str, tuple[float, float]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 825,
          "methods": [],
          "name": "_write_species_summary",
          "parameters": [
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "group_rows"
            },
            {
              "annotation": "dict[str, tuple[float, float]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bounds"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._write_species_summary",
          "signature": "_write_species_summary(schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, group_rows: Sequence[dict[str, Any]], bounds: dict[str, tuple[float, float]]) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 857,
          "methods": [],
          "name": "_band_values_expression",
          "parameters": [
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._band_values_expression",
          "signature": "_band_values_expression(schema: SpectralLibrarySchema) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 864,
          "methods": [],
          "name": "_outside_value_expression",
          "parameters": [
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "operator"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bound"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._outside_value_expression",
          "signature": "_outside_value_expression(schema: SpectralLibrarySchema, operator: str, bound: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 877,
          "methods": [],
          "name": "_outside_spectrum_expression",
          "parameters": [
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "lower"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "upper"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._outside_spectrum_expression",
          "signature": "_outside_spectrum_expression(schema: SpectralLibrarySchema, lower: str, upper: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 892,
          "methods": [],
          "name": "_write_plot_ranges",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "group_rows"
            },
            {
              "annotation": "dict[str, tuple[float, float]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "full_bounds"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._write_plot_ranges",
          "signature": "_write_plot_ranges(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, group_rows: Sequence[dict[str, Any]], full_bounds: dict[str, tuple[float, float]], config: SpectralLibraryPlotConfig) -> tuple[list[dict[str, Any]], dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1027,
          "methods": [],
          "name": "_metadata_expression",
          "parameters": [
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "field"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "alias"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._metadata_expression",
          "signature": "_metadata_expression(field: str | None, alias: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1035,
          "methods": [],
          "name": "_write_extreme_spectra",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._write_extreme_spectra",
          "signature": "_write_extreme_spectra(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, config: SpectralLibraryPlotConfig) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1134,
          "methods": [],
          "name": "_ordered_groups",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "grouping_field"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "order"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._ordered_groups",
          "signature": "_ordered_groups(rows: Sequence[dict[str, Any]], *, grouping_field: str, order: str) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Inspect schema, exact group counts, and approximate report cost without PDFs.\n\nParameters\n----------\npath : str | Path\n    Existing merged polygon Parquet to inspect in place; no spectral rows are copied into a cache.\nconfig : SpectralLibraryPlotConfig | None, default=None\n    Configuration object for this workflow; None selects the documented defaults of its configuration class.\n\nReturns\n-------\ndict[str, Any]\n    Detected schema, validity/group counts, largest groups, expected pages and approximate scan/render cost; no PDFs are written.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.\n\nExamples\n--------\nThe supplied path must be a real existing library. For a fully executable invented-data example, run ``python examples/first_example.py`` from a checkout.\n\n>>> from spectralbridge import inspect_spectral_library_preflight\n>>> result = inspect_spectral_library_preflight(library_path)  # doctest: +SKIP",
          "examples": [
            "examples/first_example.py",
            "examples/release_candidate_smoke.py",
            "examples/scientific_workflows_offline.py"
          ],
          "exports": [
            "spectralbridge.inspect_spectral_library_preflight",
            "spectralbridge.bulk.inspect_spectral_library_preflight",
            "spectralbridge.bulk.analyses.inspect_spectral_library_preflight",
            "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight"
          ],
          "kind": "function",
          "line": 1153,
          "methods": [],
          "name": "inspect_spectral_library_preflight",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "SpectralLibraryPlotConfig | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
          "signature": "inspect_spectral_library_preflight(path: str | Path, *, config: SpectralLibraryPlotConfig | None=None) -> dict[str, Any]",
          "summary": "Inspect schema, exact group counts, and approximate report cost without PDFs.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1315,
          "methods": [],
          "name": "_report_cost_from_group_rows",
          "parameters": [
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "group_rows"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._report_cost_from_group_rows",
          "signature": "_report_cost_from_group_rows(schema: SpectralLibrarySchema, config: SpectralLibraryPlotConfig, group_rows: Sequence[dict[str, Any]]) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Yield one group's spectra as bounded NumPy batches without pandas.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.spectral_library.iter_group_spectra"
          ],
          "kind": "function",
          "line": 1415,
          "methods": [],
          "name": "iter_group_spectra",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "grouping_field"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "group_value"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "batch_size"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "max_traces"
            },
            {
              "annotation": "int",
              "default": "0",
              "kind": "keyword-only",
              "name": "sampling_seed"
            },
            {
              "annotation": "SpectralLibraryPlotConfig | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library.iter_group_spectra",
          "signature": "iter_group_spectra(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, *, grouping_field: str, group_value: str, batch_size: int, max_traces: int | None=None, sampling_seed: int=0, config: SpectralLibraryPlotConfig | None=None) -> Iterator[np.ndarray]",
          "summary": "Yield one group's spectra as bounded NumPy batches without pandas.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1474,
          "methods": [],
          "name": "_group_median",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "grouping_field"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "group_value"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._group_median",
          "signature": "_group_median(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, grouping_field: str, group_value: str, config: SpectralLibraryPlotConfig) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1496,
          "methods": [],
          "name": "_species_median",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "species"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._species_median",
          "signature": "_species_median(con: duckdb.DuckDBPyConnection, paths: SpectralLibraryPaths, species: str) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1509,
          "methods": [],
          "name": "_trace_raster",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "Iterator[np.ndarray]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "alpha"
            },
            {
              "annotation": "tuple[float, float]",
              "default": null,
              "kind": "keyword-only",
              "name": "x_limits"
            },
            {
              "annotation": "tuple[float, float]",
              "default": null,
              "kind": "keyword-only",
              "name": "y_limits"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "dpi"
            },
            {
              "annotation": "str",
              "default": "'#2A6F97'",
              "kind": "keyword-only",
              "name": "color"
            },
            {
              "annotation": "float",
              "default": "0.28",
              "kind": "keyword-only",
              "name": "linewidth"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._trace_raster",
          "signature": "_trace_raster(wavelengths: np.ndarray, spectra: Iterator[np.ndarray], *, alpha: float, x_limits: tuple[float, float], y_limits: tuple[float, float], dpi: int, color: str='#2A6F97', linewidth: float=0.28) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1529,
          "methods": [],
          "name": "_layered_trace_raster",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "Sequence[tuple[Iterator[np.ndarray], str, float, float]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "layers"
            },
            {
              "annotation": "tuple[float, float]",
              "default": null,
              "kind": "keyword-only",
              "name": "x_limits"
            },
            {
              "annotation": "tuple[float, float]",
              "default": null,
              "kind": "keyword-only",
              "name": "y_limits"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "dpi"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._layered_trace_raster",
          "signature": "_layered_trace_raster(wavelengths: np.ndarray, layers: Sequence[tuple[Iterator[np.ndarray], str, float, float]], *, x_limits: tuple[float, float], y_limits: tuple[float, float], dpi: int) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/validate_figures.py",
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 1566,
          "methods": [],
          "name": "_limits",
          "parameters": [
            {
              "annotation": "tuple[float, float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._limits",
          "signature": "_limits(values: tuple[float, float]) -> tuple[float, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1577,
          "methods": [],
          "name": "_page_layout",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "panels_per_page"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._page_layout",
          "signature": "_page_layout(panels_per_page: int) -> tuple[int, int]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1583,
          "methods": [],
          "name": "_pdf_metadata",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "title"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "subject"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._pdf_metadata",
          "signature": "_pdf_metadata(title: str, subject: str) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1593,
          "methods": [],
          "name": "_finish_pdf",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "temporary"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "final"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._finish_pdf",
          "signature": "_finish_pdf(temporary: Path, final: Path) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1602,
          "methods": [],
          "name": "_trace_report",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "grouping_field"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": "tuple[float, float]",
              "default": null,
              "kind": "keyword-only",
              "name": "global_bounds"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "display_mode"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": "()",
              "kind": "keyword-only",
              "name": "species_range_rows"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._trace_report",
          "signature": "_trace_report(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, groups: Sequence[dict[str, Any]], *, grouping_field: str, output: Path, config: SpectralLibraryPlotConfig, global_bounds: tuple[float, float], display_mode: str, species_range_rows: Sequence[dict[str, Any]]=()) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1775,
          "methods": [],
          "name": "_quantile_report",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._quantile_report",
          "signature": "_quantile_report(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, groups: Sequence[dict[str, Any]], config: SpectralLibraryPlotConfig) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1847,
          "methods": [],
          "name": "_median_overview_report",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "groups"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._median_overview_report",
          "signature": "_median_overview_report(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, groups: Sequence[dict[str, Any]]) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1905,
          "methods": [],
          "name": "_counts_report",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._counts_report",
          "signature": "_counts_report(groups: Sequence[dict[str, Any]], paths: SpectralLibraryPaths) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1966,
          "methods": [],
          "name": "_iter_hierarchy_medians",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "species"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "grouping_field"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "batch_size"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._iter_hierarchy_medians",
          "signature": "_iter_hierarchy_medians(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, *, species: str, grouping_field: str, batch_size: int, config: SpectralLibraryPlotConfig) -> Iterator[np.ndarray]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1999,
          "methods": [],
          "name": "_hierarchy_report",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibrarySchema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": "tuple[float, float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "global_bounds"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._hierarchy_report",
          "signature": "_hierarchy_report(con: duckdb.DuckDBPyConnection, schema: SpectralLibrarySchema, paths: SpectralLibraryPaths, groups: Sequence[dict[str, Any]], config: SpectralLibraryPlotConfig, global_bounds: tuple[float, float]) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2102,
          "methods": [],
          "name": "_register_outputs",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "SpectralLibraryPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library._register_outputs",
          "signature": "_register_outputs(con: duckdb.DuckDBPyConnection, paths: SpectralLibraryPaths) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Build compact summaries and requested PDFs without copying source spectra.\n\nParameters\n----------\ncon : duckdb.DuckDBPyConnection\n    Open DuckDB connection prepared by the bulk workflow with the required catalog and observation views; the caller owns its lifetime.\nbulk_paths : BulkAnalysisPaths\n    BulkAnalysisPaths instance selecting isolated catalog, database, analysis and report locations.\nspectral_library : str | Path\n    Existing merged polygon Parquet with wavelength-bearing columns; read in place without copying the source dataset.\nanalysis_run_id : str\n    Provenance identifier written into generated tables and restart metadata for this run.\nconfig : SpectralLibraryPlotConfig | None, default=None\n    Configuration object for this workflow; None selects the documented defaults of its configuration class.\nmake_summary_plots : bool, default=True\n    Write compact spectral-summary figures in addition to numerical summaries.\nmake_full_spectral_reports : bool, default=False\n    Explicitly enable potentially expensive full trace reports; inspect preflight costs before enabling.\nminimum_reflectance : float | None, default=None\n    Lower screening bound in the stored reflectance units; used for regression validity, not automatic unit conversion.\n\nReturns\n-------\ndict[str, Any]\n    Analysis metadata, validity/count summaries and output paths; compact summaries and explicitly enabled report files are persisted beneath bulk_paths.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.\n\nExamples\n--------\nUse a bulk-prepared connection and isolated paths object. Read the existing library in place; full trace reports remain opt-in.\n\n>>> from spectralbridge import run_spectral_library_analysis\n>>> result = run_spectral_library_analysis(con, bulk_paths, spectral_library=library_path, analysis_run_id=run_id, make_full_spectral_reports=False)  # doctest: +SKIP",
          "examples": [
            "examples/release_candidate_smoke.py"
          ],
          "exports": [
            "spectralbridge.run_spectral_library_analysis",
            "spectralbridge.bulk.run_spectral_library_analysis",
            "spectralbridge.bulk.analyses.run_spectral_library_analysis",
            "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis"
          ],
          "kind": "function",
          "line": 2121,
          "methods": [],
          "name": "run_spectral_library_analysis",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bulk_paths"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "spectral_library"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "SpectralLibraryPlotConfig | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "make_summary_plots"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "make_full_spectral_reports"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            }
          ],
          "path": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
          "signature": "run_spectral_library_analysis(con: duckdb.DuckDBPyConnection, bulk_paths: BulkAnalysisPaths, *, spectral_library: str | Path, analysis_run_id: str, config: SpectralLibraryPlotConfig | None=None, make_summary_plots: bool=True, make_full_spectral_reports: bool=False, minimum_reflectance: float | None=None) -> dict[str, Any]",
          "summary": "Build compact summaries and requested PDFs without copying source spectra.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2391,
          "methods": [],
          "name": "_spectralbridge_version",
          "parameters": [],
          "path": "spectralbridge.bulk.analyses.spectral_library._spectralbridge_version",
          "signature": "_spectralbridge_version() -> str",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/bulk/analyses/spectral_library.py",
      "sha256": "dfcea8d1f83cad67aa041b7028b75c3386b1cb0f679b35b7a649b1297db330b8"
    },
    {
      "area": "bulk",
      "constants": [],
      "declared_exports": [
        "run_streaming_translation_analyses"
      ],
      "docstring": "Translation models derived from compact streaming sufficient statistics.",
      "export_expressions": [
        "__all__ = ['run_streaming_translation_analyses']"
      ],
      "imports": {
        "Any": "typing.Any",
        "BivariateStatistics": "spectralbridge.bulk.streaming.BivariateStatistics",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "FlightlineRecord": "spectralbridge.bulk.models.FlightlineRecord",
        "Iterable": "typing.Iterable",
        "LeaveOneSiteOutPaths": "spectralbridge.bulk.analyses.leave_one_site_out.LeaveOneSiteOutPaths",
        "Path": "pathlib.Path",
        "SensorTranslationPaths": "spectralbridge.bulk.analyses.sensor_translation.SensorTranslationPaths",
        "Sequence": "typing.Sequence",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "iter_aligned_pair_chunks": "spectralbridge.bulk.streaming.iter_aligned_pair_chunks",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.bulk.analyses.streaming_translation",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 101,
          "methods": [],
          "name": "_write_parquet",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "pa.Schema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._write_parquet",
          "signature": "_write_parquet(path: Path, rows: list[dict[str, Any]], schema: pa.Schema) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Fingerprint the compact inputs to the coefficient/LOSO stage.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 111,
          "methods": [],
          "name": "_streaming_stage_signature",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "statistics_rows"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "keyword-only",
              "name": "evidence_classes"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._streaming_stage_signature",
          "signature": "_streaming_stage_signature(*, analysis_run_id: str, statistics_rows: Sequence[dict[str, Any]], minimum_reflectance: float, chunk_size: int, translation_pairs: Sequence[TranslationPair], evidence_classes: Sequence[str]) -> str",
          "summary": "Fingerprint the compact inputs to the coefficient/LOSO stage.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 135,
          "methods": [],
          "name": "_translation_outputs_valid",
          "parameters": [
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "SensorTranslationPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": "LeaveOneSiteOutPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "loso_output"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._translation_outputs_valid",
          "signature": "_translation_outputs_valid(paths: BulkAnalysisPaths, output: SensorTranslationPaths, loso_output: LeaveOneSiteOutPaths) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 162,
          "methods": [],
          "name": "_register_translation_outputs",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "SensorTranslationPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": "LeaveOneSiteOutPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "loso_output"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._register_translation_outputs",
          "signature": "_register_translation_outputs(con: duckdb.DuckDBPyConnection, paths: BulkAnalysisPaths, output: SensorTranslationPaths, loso_output: LeaveOneSiteOutPaths) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_regions.py",
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/validate_figures.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 184,
          "methods": [],
          "name": "_merge",
          "parameters": [
            {
              "annotation": "Iterable[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._merge",
          "signature": "_merge(rows: Iterable[dict[str, Any]]) -> BivariateStatistics",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 191,
          "methods": [],
          "name": "_normalized",
          "parameters": [
            {
              "annotation": "BivariateStatistics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stats"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._normalized",
          "signature": "_normalized(stats: BivariateStatistics) -> BivariateStatistics",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/manuscript_synthesis/validate_data.py",
            "examples/run_neon_pipeline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 208,
          "methods": [],
          "name": "_fit",
          "parameters": [
            {
              "annotation": "BivariateStatistics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stats"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._fit",
          "signature": "_fit(stats: BivariateStatistics) -> tuple[float | None, float | None, float | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 225,
          "methods": [],
          "name": "_pair_fields",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._pair_fields",
          "signature": "_pair_fields(row: dict[str, Any]) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 240,
          "methods": [],
          "name": "_translation_record",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "template"
            },
            {
              "annotation": "BivariateStatistics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stats"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_level"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "weighting"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "flightline_id"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "site"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "sample_count"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "source_count"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "flightline_count"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "site_count"
            },
            {
              "annotation": "int | None",
              "default": null,
              "kind": "keyword-only",
              "name": "replicate_count"
            },
            {
              "annotation": "BivariateStatistics | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "bounds"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._translation_record",
          "signature": "_translation_record(template: dict[str, Any], stats: BivariateStatistics, *, analysis_run_id: str, analysis_level: str, weighting: str, flightline_id: str | None, site: str | None, sample_count: int, source_count: int, flightline_count: int, site_count: int, replicate_count: int | None, bounds: BivariateStatistics | None=None) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 294,
          "methods": [],
          "name": "_spec_key",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._spec_key",
          "signature": "_spec_key(row: dict[str, Any]) -> tuple[str, int]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 298,
          "methods": [],
          "name": "_loso_record",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "template"
            },
            {
              "annotation": "BivariateStatistics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "global_stats"
            },
            {
              "annotation": "BivariateStatistics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "held_stats"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "site"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "total_sites"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "total_flightlines"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "held_flightlines"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._loso_record",
          "signature": "_loso_record(template: dict[str, Any], global_stats: BivariateStatistics, held_stats: BivariateStatistics, *, analysis_run_id: str, site: str, total_sites: int, total_flightlines: int, held_flightlines: int) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 380,
          "methods": [],
          "name": "_add_mae",
          "parameters": [
            {
              "annotation": "dict[tuple[Any, ...], list[float]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "accumulator"
            },
            {
              "annotation": "tuple[Any, ...]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "key"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "slope"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "intercept"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "weight"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._add_mae",
          "signature": "_add_mae(accumulator: dict[tuple[Any, ...], list[float]], key: tuple[Any, ...], x: np.ndarray, y: np.ndarray, slope: float | None, intercept: float | None, weight: float) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 399,
          "methods": [],
          "name": "_evaluate_mae",
          "parameters": [
            {
              "annotation": "Sequence[FlightlineRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightlines"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "translation_pairs"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "translation_rows"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "loso_rows"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stats_rows"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._evaluate_mae",
          "signature": "_evaluate_mae(flightlines: Sequence[FlightlineRecord], translation_pairs: Sequence[TranslationPair], translation_rows: list[dict[str, Any]], loso_rows: list[dict[str, Any]], stats_rows: list[dict[str, Any]], *, chunk_size: int, minimum_reflectance: float) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Derive all model levels and LOSO, using one bounded MAE evaluation pass.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.analyses.streaming_translation.run_streaming_translation_analyses"
          ],
          "kind": "function",
          "line": 505,
          "methods": [],
          "name": "run_streaming_translation_analyses",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "statistics_rows"
            },
            {
              "annotation": "Sequence[FlightlineRecord]",
              "default": null,
              "kind": "keyword-only",
              "name": "flightlines"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "reuse_existing"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation.run_streaming_translation_analyses",
          "signature": "run_streaming_translation_analyses(con: duckdb.DuckDBPyConnection, paths: BulkAnalysisPaths, *, analysis_run_id: str, statistics_rows: list[dict[str, Any]], flightlines: Sequence[FlightlineRecord], minimum_reflectance: float, chunk_size: int, translation_pairs: Sequence[TranslationPair], reuse_existing: bool=True) -> tuple[dict[str, Any], dict[str, Any]]",
          "summary": "Derive all model levels and LOSO, using one bounded MAE evaluation pass.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 854,
          "methods": [],
          "name": "_merge_normalized",
          "parameters": [
            {
              "annotation": "Iterable[BivariateStatistics]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.bulk.analyses.streaming_translation._merge_normalized",
          "signature": "_merge_normalized(values: Iterable[BivariateStatistics]) -> BivariateStatistics",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/bulk/analyses/streaming_translation.py",
      "sha256": "853adf6cf394fc9bb917e07c92ab191c90839d5b724b32745ac5a508bffdf6e0"
    },
    {
      "area": "bulk",
      "constants": [],
      "declared_exports": [
        "build_bulk_catalog",
        "canonical_identity_from_product",
        "catalog_signature_records",
        "discover_bulk_sources"
      ],
      "docstring": "Read-only discovery and canonical flightline catalog construction.",
      "export_expressions": [
        "__all__ = ['build_bulk_catalog', 'canonical_identity_from_product', 'catalog_signature_records', 'discover_bulk_sources']"
      ],
      "imports": {
        "AnalysisProfile": "spectralbridge.bulk.registry.AnalysisProfile",
        "Any": "typing.Any",
        "BulkInputKind": "spectralbridge.bulk.models.BulkInputKind",
        "DEFAULT_IDENTITY_PARSERS": "spectralbridge.bulk.identity.DEFAULT_IDENTITY_PARSERS",
        "DEFAULT_PRODUCT_REGISTRY": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
        "FlightlineIdentityParser": "spectralbridge.bulk.identity.FlightlineIdentityParser",
        "FlightlineRecord": "spectralbridge.bulk.models.FlightlineRecord",
        "Iterable": "typing.Iterable",
        "NEONReflectanceFile": "spectralbridge.file_types.NEONReflectanceFile",
        "Path": "pathlib.Path",
        "ProductRegistry": "spectralbridge.bulk.registry.ProductRegistry",
        "Sequence": "typing.Sequence",
        "SourceFileRecord": "spectralbridge.bulk.models.SourceFileRecord",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "canonical_json": "spectralbridge.bulk.provenance.canonical_json",
        "datetime": "datetime.datetime",
        "defaultdict": "collections.defaultdict",
        "replace": "dataclasses.replace",
        "resolve_analysis_profile": "spectralbridge.bulk.registry.resolve_analysis_profile",
        "resolve_flightline_identity": "spectralbridge.bulk.identity.resolve_flightline_identity"
      },
      "module": "spectralbridge.bulk.catalog",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 48,
          "methods": [],
          "name": "_path_is_within",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parent"
            }
          ],
          "path": "spectralbridge.bulk.catalog._path_is_within",
          "signature": "_path_is_within(path: Path, parent: Path) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 56,
          "methods": [],
          "name": "_classify_merged_parquet",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.bulk.catalog._classify_merged_parquet",
          "signature": "_classify_merged_parquet(path: Path) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 64,
          "methods": [],
          "name": "_canonical_stem",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_kind"
            }
          ],
          "path": "spectralbridge.bulk.catalog._canonical_stem",
          "signature": "_canonical_stem(path: Path, input_kind: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 69,
          "methods": [],
          "name": "_iso_date",
          "parameters": [
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.catalog._iso_date",
          "signature": "_iso_date(value: str | None) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Recover scientific identity from a canonical merged-product filename.\n\nParameters\n----------\npath : str | Path\n    Canonical merged-product path whose filename or parent manifest carries scientific identity.\nidentity_parsers : Sequence[FlightlineIdentityParser], default=DEFAULT_IDENTITY_PARSERS\n    Ordered parsers for canonical scientific identity from filenames or manifests; outer run-folder names are not scientific identifiers.\n\nReturns\n-------\ndict[str, str | None]\n    Canonical flightline ID, identity source, site and ISO acquisition date recovered without guessing outer folder identity.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nOuter folder names are intentionally ignored. A product whose filename\ncannot be parsed as a NEON reflectance identity is rejected rather than\nassigned a guessed identity.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.canonical_identity_from_product",
            "spectralbridge.bulk.catalog.canonical_identity_from_product"
          ],
          "kind": "function",
          "line": 78,
          "methods": [],
          "name": "canonical_identity_from_product",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Sequence[FlightlineIdentityParser]",
              "default": "DEFAULT_IDENTITY_PARSERS",
              "kind": "keyword-only",
              "name": "identity_parsers"
            }
          ],
          "path": "spectralbridge.bulk.catalog.canonical_identity_from_product",
          "signature": "canonical_identity_from_product(path: str | Path, *, identity_parsers: Sequence[FlightlineIdentityParser]=DEFAULT_IDENTITY_PARSERS) -> dict[str, str | None]",
          "summary": "Recover scientific identity from a canonical merged-product filename.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 145,
          "methods": [],
          "name": "_band_map",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            }
          ],
          "path": "spectralbridge.bulk.catalog._band_map",
          "signature": "_band_map(columns: Sequence[str]) -> dict[str, set[int]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 154,
          "methods": [],
          "name": "_available_sensors",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            }
          ],
          "path": "spectralbridge.bulk.catalog._available_sensors",
          "signature": "_available_sensors(columns: Sequence[str]) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 158,
          "methods": [],
          "name": "_has_translation_pair",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pairs"
            }
          ],
          "path": "spectralbridge.bulk.catalog._has_translation_pair",
          "signature": "_has_translation_pair(columns: Sequence[str], pairs: Sequence[TranslationPair]) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 177,
          "methods": [],
          "name": "_schema_fingerprint",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            }
          ],
          "path": "spectralbridge.bulk.catalog._schema_fingerprint",
          "signature": "_schema_fingerprint(schema: Any) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 182,
          "methods": [],
          "name": "_candidate_paths",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.bulk.catalog._candidate_paths",
          "signature": "_candidate_paths(root: Path) -> tuple[list[Path], Path]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Recursively inventory full and polygon merged-Parquet candidates.\n\nParameters\n----------\ninput_path : str | Path\n    Existing source tree or merged Parquet to inventory; input products are read in place.\ninput_kind : BulkInputKind, default='full'\n    Select eligible 'full', 'polygon', or 'both' table products; discovery still records companions for transparency.\nexclude_dir : str | Path | None, default=None\n    Optional output subtree to omit from recursive discovery to avoid treating generated products as sources.\nproduct_registry : ProductRegistry, default=DEFAULT_PRODUCT_REGISTRY\n    ProductRegistry describing recognized filenames, sensor roles, band contracts and translation relationships.\nsensors : Sequence[str] | None, default=None\n    Optional sensor-name selection passed to the product registry; None retains profile-compatible sensors.\ntranslation_pairs : Sequence[str | TranslationPair] | None, default=None\n    Explicit registered source-to-target relationships to analyze; None uses the selected registry/profile defaults.\nidentity_parsers : Sequence[FlightlineIdentityParser], default=DEFAULT_IDENTITY_PARSERS\n    Ordered parsers for canonical scientific identity from filenames or manifests; outer run-folder names are not scientific identifiers.\n\nReturns\n-------\nlist[SourceFileRecord]\n    Deterministically ordered source records, including rejected candidates and their reasons.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nBoth product kinds are cataloged so companion availability is visible.\n``input_kind`` controls later scientific selection, not discovery. Invalid\ncandidates remain explicit rejected records.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.discover_bulk_sources",
            "spectralbridge.bulk.catalog.discover_bulk_sources",
            "spectralbridge.pipelines.bulk.discover_bulk_sources"
          ],
          "kind": "function",
          "line": 190,
          "methods": [],
          "name": "discover_bulk_sources",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_path"
            },
            {
              "annotation": "BulkInputKind",
              "default": "'full'",
              "kind": "keyword-only",
              "name": "input_kind"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "exclude_dir"
            },
            {
              "annotation": "ProductRegistry",
              "default": "DEFAULT_PRODUCT_REGISTRY",
              "kind": "keyword-only",
              "name": "product_registry"
            },
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensors"
            },
            {
              "annotation": "Sequence[str | TranslationPair] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "Sequence[FlightlineIdentityParser]",
              "default": "DEFAULT_IDENTITY_PARSERS",
              "kind": "keyword-only",
              "name": "identity_parsers"
            }
          ],
          "path": "spectralbridge.bulk.catalog.discover_bulk_sources",
          "signature": "discover_bulk_sources(input_path: str | Path, *, input_kind: BulkInputKind='full', exclude_dir: str | Path | None=None, product_registry: ProductRegistry=DEFAULT_PRODUCT_REGISTRY, sensors: Sequence[str] | None=None, translation_pairs: Sequence[str | TranslationPair] | None=None, identity_parsers: Sequence[FlightlineIdentityParser]=DEFAULT_IDENTITY_PARSERS) -> list[SourceFileRecord]",
          "summary": "Recursively inventory full and polygon merged-Parquet candidates.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 344,
          "methods": [],
          "name": "_walk_json_items",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "str",
              "default": "''",
              "kind": "keyword-only",
              "name": "prefix"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "kind": "keyword-only",
              "name": "keywords"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "output"
            }
          ],
          "path": "spectralbridge.bulk.catalog._walk_json_items",
          "signature": "_walk_json_items(value: Any, *, prefix: str='', keywords: tuple[str, ...], output: dict[str, Any]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 377,
          "methods": [],
          "name": "_related_product_inventory",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_directory"
            }
          ],
          "path": "spectralbridge.bulk.catalog._related_product_inventory",
          "signature": "_related_product_inventory(source_directory: Path) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 448,
          "methods": [],
          "name": "_selected_kinds",
          "parameters": [
            {
              "annotation": "BulkInputKind",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_kind"
            }
          ],
          "path": "spectralbridge.bulk.catalog._selected_kinds",
          "signature": "_selected_kinds(input_kind: BulkInputKind) -> set[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Build source-file and canonical-flightline catalogs.\n\nParameters\n----------\ninput_path : str | Path\n    Existing source tree or merged Parquet to inventory; input products are read in place.\ninput_kind : BulkInputKind, default='full'\n    Select eligible 'full', 'polygon', or 'both' table products; discovery still records companions for transparency.\nexclude_dir : str | Path | None, default=None\n    Optional output subtree to omit from recursive discovery to avoid treating generated products as sources.\nanalysis_profile : str | AnalysisProfile, default='translation'\n    Registered analysis profile name or AnalysisProfile controlling required products and permissible sensor pairs.\nproduct_registry : ProductRegistry, default=DEFAULT_PRODUCT_REGISTRY\n    ProductRegistry describing recognized filenames, sensor roles, band contracts and translation relationships.\nsensors : Sequence[str] | None, default=None\n    Optional sensor-name selection passed to the product registry; None retains profile-compatible sensors.\ntranslation_pairs : Sequence[str | TranslationPair] | None, default=None\n    Explicit registered source-to-target relationships to analyze; None uses the selected registry/profile defaults.\nidentity_parsers : Sequence[FlightlineIdentityParser], default=DEFAULT_IDENTITY_PARSERS\n    Ordered parsers for canonical scientific identity from filenames or manifests; outer run-folder names are not scientific identifiers.\n\nReturns\n-------\ntuple[list[SourceFileRecord], list[FlightlineRecord]]\n    Source-file records and canonical-flightline records; duplicate identities remain explicitly excluded.\n\nNotes\n-----\nDuplicate canonical IDs in different source directories are explicitly\nexcluded. Multiple different IDs in one machine/run directory remain\nindependent scientific flightlines.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.build_bulk_catalog",
            "spectralbridge.bulk.catalog.build_bulk_catalog"
          ],
          "kind": "function",
          "line": 452,
          "methods": [],
          "name": "build_bulk_catalog",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_path"
            },
            {
              "annotation": "BulkInputKind",
              "default": "'full'",
              "kind": "keyword-only",
              "name": "input_kind"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "exclude_dir"
            },
            {
              "annotation": "str | AnalysisProfile",
              "default": "'translation'",
              "kind": "keyword-only",
              "name": "analysis_profile"
            },
            {
              "annotation": "ProductRegistry",
              "default": "DEFAULT_PRODUCT_REGISTRY",
              "kind": "keyword-only",
              "name": "product_registry"
            },
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensors"
            },
            {
              "annotation": "Sequence[str | TranslationPair] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "Sequence[FlightlineIdentityParser]",
              "default": "DEFAULT_IDENTITY_PARSERS",
              "kind": "keyword-only",
              "name": "identity_parsers"
            }
          ],
          "path": "spectralbridge.bulk.catalog.build_bulk_catalog",
          "signature": "build_bulk_catalog(input_path: str | Path, *, input_kind: BulkInputKind='full', exclude_dir: str | Path | None=None, analysis_profile: str | AnalysisProfile='translation', product_registry: ProductRegistry=DEFAULT_PRODUCT_REGISTRY, sensors: Sequence[str] | None=None, translation_pairs: Sequence[str | TranslationPair] | None=None, identity_parsers: Sequence[FlightlineIdentityParser]=DEFAULT_IDENTITY_PARSERS) -> tuple[list[SourceFileRecord], list[FlightlineRecord]]",
          "summary": "Build source-file and canonical-flightline catalogs.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return deterministic manifest-ready catalog records.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.catalog.catalog_signature_records"
          ],
          "kind": "function",
          "line": 815,
          "methods": [],
          "name": "catalog_signature_records",
          "parameters": [
            {
              "annotation": "Iterable[SourceFileRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_files"
            },
            {
              "annotation": "Iterable[FlightlineRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightlines"
            }
          ],
          "path": "spectralbridge.bulk.catalog.catalog_signature_records",
          "signature": "catalog_signature_records(source_files: Iterable[SourceFileRecord], flightlines: Iterable[FlightlineRecord]) -> dict[str, list[dict[str, Any]]]",
          "summary": "Return deterministic manifest-ready catalog records.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/catalog.py",
      "sha256": "4cf0665f411dede7ac49e47492b315101d6b5a13fcb0be8f889e8b45f8050585"
    },
    {
      "area": "bulk",
      "constants": [],
      "declared_exports": [
        "configure_duckdb",
        "copy_table_atomic",
        "create_bulk_database",
        "finalize_bulk_database",
        "observation_columns",
        "quote_identifier",
        "quote_path"
      ],
      "docstring": "DuckDB-backed virtual observation dataset and catalog persistence.",
      "export_expressions": [
        "__all__ = ['configure_duckdb', 'copy_table_atomic', 'create_bulk_database', 'finalize_bulk_database', 'observation_columns', 'quote_identifier', 'quote_path']"
      ],
      "imports": {
        "Any": "typing.Any",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "ExclusionRecord": "spectralbridge.bulk.models.ExclusionRecord",
        "FlightlineRecord": "spectralbridge.bulk.models.FlightlineRecord",
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "SourceFileRecord": "spectralbridge.bulk.models.SourceFileRecord",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.bulk.dataset",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.dataset.quote_path"
          ],
          "kind": "function",
          "line": 23,
          "methods": [],
          "name": "quote_path",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.bulk.dataset.quote_path",
          "signature": "quote_path(path: str | Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.dataset.quote_identifier"
          ],
          "kind": "function",
          "line": 27,
          "methods": [],
          "name": "quote_identifier",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identifier"
            }
          ],
          "path": "spectralbridge.bulk.dataset.quote_identifier",
          "signature": "quote_identifier(identifier: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Apply bounded-resource settings used by catalog and analysis queries.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.dataset.configure_duckdb"
          ],
          "kind": "function",
          "line": 31,
          "methods": [],
          "name": "configure_duckdb",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "memory_limit"
            },
            {
              "annotation": "int | None",
              "default": null,
              "kind": "keyword-only",
              "name": "threads"
            },
            {
              "annotation": "Path | None",
              "default": null,
              "kind": "keyword-only",
              "name": "temp_directory"
            }
          ],
          "path": "spectralbridge.bulk.dataset.configure_duckdb",
          "signature": "configure_duckdb(con: duckdb.DuckDBPyConnection, *, memory_limit: str | None, threads: int | None, temp_directory: Path | None) -> None",
          "summary": "Apply bounded-resource settings used by catalog and analysis queries.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Write a small table or projected query to Parquet atomically.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.dataset.copy_table_atomic"
          ],
          "kind": "function",
          "line": 52,
          "methods": [],
          "name": "copy_table_atomic",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table_or_query"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "row_group_size"
            }
          ],
          "path": "spectralbridge.bulk.dataset.copy_table_atomic",
          "signature": "copy_table_atomic(con: duckdb.DuckDBPyConnection, table_or_query: str, output_path: Path, *, row_group_size: int | None=None) -> Path",
          "summary": "Write a small table or projected query to Parquet atomically.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 191,
          "methods": [],
          "name": "_insert_dataclasses",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table_name"
            },
            {
              "annotation": "Sequence[Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            }
          ],
          "path": "spectralbridge.bulk.dataset._insert_dataclasses",
          "signature": "_insert_dataclasses(con: duckdb.DuckDBPyConnection, table_name: str, records: Sequence[Any]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 203,
          "methods": [],
          "name": "_case_expression",
          "parameters": [
            {
              "annotation": "Sequence[SourceFileRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sources"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "attribute"
            },
            {
              "annotation": "str",
              "default": "'NULL'",
              "kind": "keyword-only",
              "name": "default"
            }
          ],
          "path": "spectralbridge.bulk.dataset._case_expression",
          "signature": "_case_expression(sources: Sequence[SourceFileRecord], attribute: str, *, default: str='NULL') -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 224,
          "methods": [],
          "name": "_create_observation_views",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Sequence[SourceFileRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "accepted_sources"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "materialize_observations"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "row_group_size"
            }
          ],
          "path": "spectralbridge.bulk.dataset._create_observation_views",
          "signature": "_create_observation_views(con: duckdb.DuckDBPyConnection, accepted_sources: Sequence[SourceFileRecord], paths: BulkAnalysisPaths, *, materialize_observations: bool, row_group_size: int) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Create a temporary database ready for modular analysis execution.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.dataset.create_bulk_database"
          ],
          "kind": "function",
          "line": 293,
          "methods": [],
          "name": "create_bulk_database",
          "parameters": [
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[SourceFileRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_files"
            },
            {
              "annotation": "Sequence[FlightlineRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightlines"
            },
            {
              "annotation": "Sequence[ExclusionRecord]",
              "default": "()",
              "kind": "positional-or-keyword",
              "name": "exclusions"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sufficient_statistics"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "metadata"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "materialize_observations"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "row_group_size"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "memory_limit"
            },
            {
              "annotation": "int | None",
              "default": null,
              "kind": "keyword-only",
              "name": "threads"
            },
            {
              "annotation": "Path | None",
              "default": null,
              "kind": "keyword-only",
              "name": "temp_directory"
            }
          ],
          "path": "spectralbridge.bulk.dataset.create_bulk_database",
          "signature": "create_bulk_database(paths: BulkAnalysisPaths, source_files: Sequence[SourceFileRecord], flightlines: Sequence[FlightlineRecord], exclusions: Sequence[ExclusionRecord]=(), *, sufficient_statistics: Path | None=None, metadata: dict[str, Any], materialize_observations: bool, row_group_size: int, memory_limit: str | None, threads: int | None, temp_directory: Path | None) -> tuple[duckdb.DuckDBPyConnection, Path]",
          "summary": "Create a temporary database ready for modular analysis execution.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Checkpoint, close, and atomically publish the database.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.dataset.finalize_bulk_database"
          ],
          "kind": "function",
          "line": 419,
          "methods": [],
          "name": "finalize_bulk_database",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "temporary_database"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "database_path"
            }
          ],
          "path": "spectralbridge.bulk.dataset.finalize_bulk_database",
          "signature": "finalize_bulk_database(con: duckdb.DuckDBPyConnection, temporary_database: Path, database_path: Path) -> None",
          "summary": "Checkpoint, close, and atomically publish the database.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "List column names in the prepared ``bulk_observations`` DuckDB view.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.dataset.observation_columns"
          ],
          "kind": "function",
          "line": 431,
          "methods": [],
          "name": "observation_columns",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            }
          ],
          "path": "spectralbridge.bulk.dataset.observation_columns",
          "signature": "observation_columns(con: duckdb.DuckDBPyConnection) -> list[str]",
          "summary": "List column names in the prepared ``bulk_observations`` DuckDB view.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/dataset.py",
      "sha256": "8dd54fb78f83f5cdcd748c346d54e8553f38262cda26dc15322fd5ea8dce6c05"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "KNOWN_REASON_CODES",
          "value": "frozenset({'missing_required_product', 'missing_sidecar', 'zero_byte_file', 'duplicate_product', 'unreadable_metadata', 'invalid_schema', 'invalid_dimensions', 'incompatible_band_schema', 'incomplete_translation_pair', 'duplicate_scientific_identity', 'extraction_failure', 'identity_unresolved', 'transient_source_disappeared', 'invalid_source'})"
        }
      ],
      "declared_exports": [
        "KNOWN_REASON_CODES",
        "build_exclusion_records"
      ],
      "docstring": "Structured exclusion records for population-safe bulk processing.",
      "export_expressions": [
        "__all__ = ['KNOWN_REASON_CODES', 'build_exclusion_records']"
      ],
      "imports": {
        "ExclusionRecord": "spectralbridge.bulk.models.ExclusionRecord",
        "FlightlineRecord": "spectralbridge.bulk.models.FlightlineRecord",
        "Sequence": "typing.Sequence",
        "SourceFileRecord": "spectralbridge.bulk.models.SourceFileRecord",
        "annotations": "__future__.annotations",
        "canonical_json": "spectralbridge.bulk.provenance.canonical_json"
      },
      "module": "spectralbridge.bulk.exclusions",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 33,
          "methods": [],
          "name": "_identifier",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parts"
            }
          ],
          "path": "spectralbridge.bulk.exclusions._identifier",
          "signature": "_identifier(parts: Sequence[str]) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Build deterministic exclusions from product and flightline validation.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.exclusions.build_exclusion_records"
          ],
          "kind": "function",
          "line": 37,
          "methods": [],
          "name": "build_exclusion_records",
          "parameters": [
            {
              "annotation": "Sequence[SourceFileRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_files"
            },
            {
              "annotation": "Sequence[FlightlineRecord]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightlines"
            }
          ],
          "path": "spectralbridge.bulk.exclusions.build_exclusion_records",
          "signature": "build_exclusion_records(source_files: Sequence[SourceFileRecord], flightlines: Sequence[FlightlineRecord]) -> list[ExclusionRecord]",
          "summary": "Build deterministic exclusions from product and flightline validation.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/exclusions.py",
      "sha256": "0f95db60b5cb044cea09eb9373b8809587ccf0503c958d95cf65a1b8f14df9e5"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "EXTRACTION_SCHEMA_VERSION",
          "value": "1"
        }
      ],
      "declared_exports": [
        "EXTRACTION_SCHEMA_VERSION",
        "discover_completed_flightlines",
        "extract_flightline_cache",
        "find_canonical_flightline_directories"
      ],
      "docstring": "Discovery plus explicit legacy materialization for completed outputs.",
      "export_expressions": [
        "__all__ = ['EXTRACTION_SCHEMA_VERSION', 'discover_completed_flightlines', 'extract_flightline_cache', 'find_canonical_flightline_directories']"
      ],
      "imports": {
        "AnalysisProfile": "spectralbridge.bulk.registry.AnalysisProfile",
        "Any": "typing.Any",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "DEFAULT_IDENTITY_PARSERS": "spectralbridge.bulk.identity.DEFAULT_IDENTITY_PARSERS",
        "DEFAULT_PRODUCT_REGISTRY": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
        "FlightlineIdentityParser": "spectralbridge.bulk.identity.FlightlineIdentityParser",
        "FlightlineRecord": "spectralbridge.bulk.models.FlightlineRecord",
        "Iterable": "typing.Iterable",
        "Path": "pathlib.Path",
        "ProductDescriptor": "spectralbridge.bulk.registry.ProductDescriptor",
        "ProductRegistry": "spectralbridge.bulk.registry.ProductRegistry",
        "Sequence": "typing.Sequence",
        "SourceFileRecord": "spectralbridge.bulk.models.SourceFileRecord",
        "TabularProductDescriptor": "spectralbridge.bulk.registry.TabularProductDescriptor",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "_write_parquet_chunks": "spectralbridge.parquet_export._write_parquet_chunks",
        "annotations": "__future__.annotations",
        "canonical_json": "spectralbridge.bulk.provenance.canonical_json",
        "defaultdict": "collections.defaultdict",
        "parse_envi_wavelengths_nm": "spectralbridge.exports.schema_utils.parse_envi_wavelengths_nm",
        "quote_identifier": "spectralbridge.bulk.dataset.quote_identifier",
        "quote_path": "spectralbridge.bulk.dataset.quote_path",
        "read_envi_in_chunks": "spectralbridge.parquet_export.read_envi_in_chunks",
        "replace": "dataclasses.replace",
        "resolve_analysis_profile": "spectralbridge.bulk.registry.resolve_analysis_profile",
        "resolve_flightline_identity": "spectralbridge.bulk.identity.resolve_flightline_identity",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic",
        "write_text_atomic": "spectralbridge.bulk.provenance.write_text_atomic"
      },
      "module": "spectralbridge.bulk.flightline_outputs",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 42,
          "methods": [],
          "name": "_path_is_within",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parent"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._path_is_within",
          "signature": "_path_is_within(path: Path, parent: Path) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validation failure with a stable machine-readable reason code.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 50,
          "methods": [
            {
              "docstring": "",
              "line": 53,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "reason_code"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "detail"
                }
              ],
              "private": true,
              "signature": "__init__(self, reason_code: str, detail: str) -> None"
            }
          ],
          "name": "ProductValidationError",
          "parameters": [],
          "path": "spectralbridge.bulk.flightline_outputs.ProductValidationError",
          "signature": null,
          "summary": "Validation failure with a stable machine-readable reason code.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Find scientifically identifiable flightline directories recursively.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.flightline_outputs.find_canonical_flightline_directories"
          ],
          "kind": "function",
          "line": 58,
          "methods": [],
          "name": "find_canonical_flightline_directories",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_path"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "exclude_dir"
            },
            {
              "annotation": "Sequence[FlightlineIdentityParser]",
              "default": "DEFAULT_IDENTITY_PARSERS",
              "kind": "keyword-only",
              "name": "identity_parsers"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs.find_canonical_flightline_directories",
          "signature": "find_canonical_flightline_directories(input_path: str | Path, *, exclude_dir: str | Path | None=None, identity_parsers: Sequence[FlightlineIdentityParser]=DEFAULT_IDENTITY_PARSERS) -> list[Path]",
          "summary": "Find scientifically identifiable flightline directories recursively.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 88,
          "methods": [],
          "name": "_small_file_sha256",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._small_file_sha256",
          "signature": "_small_file_sha256(path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 96,
          "methods": [],
          "name": "_raster_metadata",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr"
            },
            {
              "annotation": "ProductDescriptor",
              "default": null,
              "kind": "keyword-only",
              "name": "descriptor"
            },
            {
              "annotation": "AnalysisProfile",
              "default": null,
              "kind": "keyword-only",
              "name": "profile"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._raster_metadata",
          "signature": "_raster_metadata(img: Path, hdr: Path, *, descriptor: ProductDescriptor, profile: AnalysisProfile) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read a Parquet footer and schema without scanning observation rows.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 189,
          "methods": [],
          "name": "_tabular_metadata",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "AnalysisProfile",
              "default": null,
              "kind": "keyword-only",
              "name": "profile"
            },
            {
              "annotation": "TabularProductDescriptor | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "descriptor"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._tabular_metadata",
          "signature": "_tabular_metadata(path: Path, *, profile: AnalysisProfile, descriptor: TabularProductDescriptor | None=None) -> dict[str, Any]",
          "summary": "Read a Parquet footer and schema without scanning observation rows.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Separate product compatibility from scientific regression evidence.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 268,
          "methods": [],
          "name": "_pair_regression_eligibility",
          "parameters": [
            {
              "annotation": "dict[str, dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pairs"
            },
            {
              "annotation": "dict[str, bool]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "structural"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._pair_regression_eligibility",
          "signature": "_pair_regression_eligibility(targets: dict[str, dict[str, Any]], pairs: Sequence[TranslationPair], structural: dict[str, bool]) -> tuple[dict[str, bool], list[dict[str, Any]]]",
          "summary": "Separate product compatibility from scientific regression evidence.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 300,
          "methods": [],
          "name": "_qa_inventory",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._qa_inventory",
          "signature": "_qa_inventory(directory: Path) -> tuple[list[str], str, dict[str, dict[str, Any]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 369,
          "methods": [],
          "name": "_translation_eligibility",
          "parameters": [
            {
              "annotation": "dict[str, dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pairs"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._translation_eligibility",
          "signature": "_translation_eligibility(targets: dict[str, dict[str, Any]], pairs: Sequence[TranslationPair]) -> dict[str, bool]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 404,
          "methods": [],
          "name": "_source_record",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "root"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "directory"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "canonical_id"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "site"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_date"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "candidate_id"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "role"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "status"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "reason"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": null,
              "kind": "keyword-only",
              "name": "metadata"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "qa_status"
            },
            {
              "annotation": "str",
              "default": "'canonical_flightline_directory'",
              "kind": "keyword-only",
              "name": "identity_source"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "reason_code"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "matching_group"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "processing_stage"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "product_key"
            },
            {
              "annotation": "str",
              "default": "'envi'",
              "kind": "keyword-only",
              "name": "storage_format"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "product_semantics"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "extraction_mode"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "row_count"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "schema_sha256"
            },
            {
              "annotation": "str",
              "default": "'[]'",
              "kind": "keyword-only",
              "name": "schema_json"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._source_record",
          "signature": "_source_record(*, root: Path, directory: Path, canonical_id: str, site: str, acquisition_date: str, candidate_id: str, path: Path, role: str, sensor: str | None, status: str, reason: str | None, metadata: dict[str, Any] | None, qa_status: str, identity_source: str='canonical_flightline_directory', reason_code: str | None=None, matching_group: str | None=None, processing_stage: str | None=None, product_key: str | None=None, storage_format: str='envi', product_semantics: str | None=None, extraction_mode: str | None=None, row_count: int | None=None, schema_sha256: str | None=None, schema_json: str='[]') -> SourceFileRecord",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Inventory identifiable flightlines without reading raster pixels.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.flightline_outputs.discover_completed_flightlines"
          ],
          "kind": "function",
          "line": 492,
          "methods": [],
          "name": "discover_completed_flightlines",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_path"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "exclude_dir"
            },
            {
              "annotation": "str | AnalysisProfile",
              "default": "'translation'",
              "kind": "keyword-only",
              "name": "analysis_profile"
            },
            {
              "annotation": "ProductRegistry",
              "default": "DEFAULT_PRODUCT_REGISTRY",
              "kind": "keyword-only",
              "name": "product_registry"
            },
            {
              "annotation": "Sequence[FlightlineIdentityParser]",
              "default": "DEFAULT_IDENTITY_PARSERS",
              "kind": "keyword-only",
              "name": "identity_parsers"
            },
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensors"
            },
            {
              "annotation": "Sequence[str | TranslationPair] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "translation_pairs"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs.discover_completed_flightlines",
          "signature": "discover_completed_flightlines(input_path: str | Path, *, exclude_dir: str | Path | None=None, analysis_profile: str | AnalysisProfile='translation', product_registry: ProductRegistry=DEFAULT_PRODUCT_REGISTRY, identity_parsers: Sequence[FlightlineIdentityParser]=DEFAULT_IDENTITY_PARSERS, sensors: Sequence[str] | None=None, translation_pairs: Sequence[str | TranslationPair] | None=None) -> tuple[list[SourceFileRecord], list[FlightlineRecord]]",
          "summary": "Inventory identifiable flightlines without reading raster pixels.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1137,
          "methods": [],
          "name": "_schema_fingerprint",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._schema_fingerprint",
          "signature": "_schema_fingerprint(path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1143,
          "methods": [],
          "name": "_extract_sensor",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "product"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_size"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._extract_sensor",
          "signature": "_extract_sensor(sensor: str, product: dict[str, Any], output: Path, *, chunk_size: int) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1178,
          "methods": [],
          "name": "_merge_sensor_caches",
          "parameters": [
            {
              "annotation": "dict[str, Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_files"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._merge_sensor_caches",
          "signature": "_merge_sensor_caches(sensor_files: dict[str, Path], output: Path) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Explicitly create or reuse a legacy pixel-level observation cache.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.flightline_outputs.extract_flightline_cache"
          ],
          "kind": "function",
          "line": 1221,
          "methods": [],
          "name": "extract_flightline_cache",
          "parameters": [
            {
              "annotation": "FlightlineRecord",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_run_id"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "force"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs.extract_flightline_cache",
          "signature": "extract_flightline_cache(flightline: FlightlineRecord, paths: BulkAnalysisPaths, *, analysis_run_id: str, chunk_size: int, translation_pairs: Sequence[TranslationPair], force: bool=False) -> tuple[SourceFileRecord, FlightlineRecord]",
          "summary": "Explicitly create or reuse a legacy pixel-level observation cache.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1350,
          "methods": [],
          "name": "_spectralbridge_version",
          "parameters": [],
          "path": "spectralbridge.bulk.flightline_outputs._spectralbridge_version",
          "signature": "_spectralbridge_version() -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1356,
          "methods": [],
          "name": "_cache_source_record",
          "parameters": [
            {
              "annotation": "FlightlineRecord",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observations"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row_count"
            }
          ],
          "path": "spectralbridge.bulk.flightline_outputs._cache_source_record",
          "signature": "_cache_source_record(flightline: FlightlineRecord, observations: Path, row_count: int) -> SourceFileRecord",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/bulk/flightline_outputs.py",
      "sha256": "f4c9d3e67a8859b64ede4737b96e401601b2ce4ba8f015d94ed884ee3222b014"
    },
    {
      "area": "bulk",
      "constants": [],
      "declared_exports": [
        "build_harmonized_dataset"
      ],
      "docstring": "Explicit boundary for intentionally building a pixel-level bulk dataset.",
      "export_expressions": [
        "__all__ = ['build_harmonized_dataset']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "run_bulk_pipeline": "spectralbridge.pipelines.bulk.run_bulk_pipeline"
      },
      "module": "spectralbridge.bulk.harmonized",
      "objects": [
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Build the legacy combined pixel dataset as an explicit requested product.\n\nParameters\n----------\ninput_path : str | Path\n    Existing source tree or merged Parquet to inventory; input products are read in place.\noutput_dir : str | Path\n    Directory for generated products; bulk outputs must be outside the read-only input tree.\nkwargs : Any\n    Additional keyword options forwarded to run_bulk_pipeline; materialize_observations is controlled by this builder and must not be supplied.\n\nReturns\n-------\ndict[str, Any]\n    Bulk workflow result including the explicitly materialized combined pixel dataset and provenance paths.\n\nRaises\n------\nTypeError\n    If unsupported keyword options are supplied.\n\nNotes\n-----\nThis compatibility builder currently produces the established combined\nParquet through the bulk pipeline. It is deliberately separate from normal\nanalysis so no caller can create a pixel-scale copy by accepting defaults.\nA future dedicated partitioned/Zarr builder can replace this implementation\nwithout changing the analysis contract.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.\n\nExamples\n--------\nThis explicitly writes a pixel-scale product and can require substantial disk space. Normal compact analysis uses run_bulk_pipeline instead.\n\n>>> from spectralbridge import build_harmonized_dataset\n>>> result = build_harmonized_dataset(source_dir, output_dir)  # doctest: +SKIP",
          "examples": [
            "examples/release_candidate_smoke.py"
          ],
          "exports": [
            "spectralbridge.build_harmonized_dataset",
            "spectralbridge.bulk.build_harmonized_dataset",
            "spectralbridge.bulk.harmonized.build_harmonized_dataset"
          ],
          "kind": "function",
          "line": 9,
          "methods": [],
          "name": "build_harmonized_dataset",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_path"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": "Any",
              "default": null,
              "kind": "variadic-keyword",
              "name": "kwargs"
            }
          ],
          "path": "spectralbridge.bulk.harmonized.build_harmonized_dataset",
          "signature": "build_harmonized_dataset(input_path: str | Path, output_dir: str | Path, **kwargs: Any) -> dict[str, Any]",
          "summary": "Build the legacy combined pixel dataset as an explicit requested product.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/harmonized.py",
      "sha256": "a60f42e3617fbc62b93ae521385b4617cff40c0abd5934edb64f2377753c4e73"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": "tuple[FlightlineIdentityParser, ...]",
          "name": "DEFAULT_IDENTITY_PARSERS",
          "value": "(ManifestIdentityParser(), NEONDirectoryIdentityParser())"
        }
      ],
      "declared_exports": [
        "DEFAULT_IDENTITY_PARSERS",
        "FlightlineIdentity",
        "FlightlineIdentityParser",
        "ManifestIdentityParser",
        "NEONDirectoryIdentityParser",
        "resolve_flightline_identity"
      ],
      "docstring": "Extensible scientific-identity parsing for bulk flightline discovery.",
      "export_expressions": [
        "__all__ = ['DEFAULT_IDENTITY_PARSERS', 'FlightlineIdentity', 'FlightlineIdentityParser', 'ManifestIdentityParser', 'NEONDirectoryIdentityParser', 'resolve_flightline_identity']"
      ],
      "imports": {
        "NEONReflectanceFile": "spectralbridge.file_types.NEONReflectanceFile",
        "Path": "pathlib.Path",
        "Protocol": "typing.Protocol",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "datetime": "datetime.datetime"
      },
      "module": "spectralbridge.bulk.identity",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "flightline_id"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "site"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "acquisition_date"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "identity_source"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Scientific identity for one independently processed flightline.\n\nAttributes\n----------\nflightline_id : str\n    Canonical scientific flightline identifier; histories from the same underlying flight must retain this identity.\nsite : str | None\n    Scientific site code recovered from the canonical identity or manifest, not an arbitrary outer directory name.\nacquisition_date : str | None\n    ISO acquisition date associated with this scientific flightline; None indicates unavailable metadata.\nidentity_source : str\n    Parser or manifest provenance explaining how the scientific flightline identity was recovered.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.FlightlineIdentity",
            "spectralbridge.bulk.identity.FlightlineIdentity"
          ],
          "kind": "class",
          "line": 15,
          "methods": [],
          "name": "FlightlineIdentity",
          "parameters": [],
          "path": "spectralbridge.bulk.identity.FlightlineIdentity",
          "signature": null,
          "summary": "Scientific identity for one independently processed flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "name"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Protocol for adding identity conventions without changing discovery.\n\nAttributes\n----------\nname : str\n    Stable parser/profile identifier used in configuration and provenance.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.FlightlineIdentityParser",
            "spectralbridge.bulk.identity.FlightlineIdentityParser"
          ],
          "kind": "class",
          "line": 36,
          "methods": [
            {
              "docstring": "Return an identity when ``directory`` matches this convention.",
              "line": 47,
              "name": "parse",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                }
              ],
              "private": false,
              "signature": "parse(self, directory: Path) -> FlightlineIdentity | None"
            }
          ],
          "name": "FlightlineIdentityParser",
          "parameters": [],
          "path": "spectralbridge.bulk.identity.FlightlineIdentityParser",
          "signature": null,
          "summary": "Protocol for adding identity conventions without changing discovery.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": "'spectralbridge_flightline.json'",
              "name": "filename"
            },
            {
              "annotation": "str",
              "default": "'spectralbridge_flightline_manifest'",
              "name": "name"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Parse a generic, user-authored flightline identity manifest.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.identity.ManifestIdentityParser"
          ],
          "kind": "class",
          "line": 52,
          "methods": [
            {
              "docstring": "",
              "line": 58,
              "name": "parse",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                }
              ],
              "private": false,
              "signature": "parse(self, directory: Path) -> FlightlineIdentity | None"
            }
          ],
          "name": "ManifestIdentityParser",
          "parameters": [],
          "path": "spectralbridge.bulk.identity.ManifestIdentityParser",
          "signature": null,
          "summary": "Parse a generic, user-authored flightline identity manifest.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": "'canonical_neon_directory'",
              "name": "name"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Preserve canonical NEON-directory support as one parser plugin.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.identity.NEONDirectoryIdentityParser"
          ],
          "kind": "class",
          "line": 91,
          "methods": [
            {
              "docstring": "",
              "line": 96,
              "name": "parse",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                }
              ],
              "private": false,
              "signature": "parse(self, directory: Path) -> FlightlineIdentity | None"
            }
          ],
          "name": "NEONDirectoryIdentityParser",
          "parameters": [],
          "path": "spectralbridge.bulk.identity.NEONDirectoryIdentityParser",
          "signature": null,
          "summary": "Preserve canonical NEON-directory support as one parser plugin.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Resolve one directory, rejecting conflicting parser results.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.identity.resolve_flightline_identity"
          ],
          "kind": "function",
          "line": 118,
          "methods": [],
          "name": "resolve_flightline_identity",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": "Sequence[FlightlineIdentityParser]",
              "default": "DEFAULT_IDENTITY_PARSERS",
              "kind": "keyword-only",
              "name": "parsers"
            }
          ],
          "path": "spectralbridge.bulk.identity.resolve_flightline_identity",
          "signature": "resolve_flightline_identity(directory: str | Path, *, parsers: Sequence[FlightlineIdentityParser]=DEFAULT_IDENTITY_PARSERS) -> FlightlineIdentity | None",
          "summary": "Resolve one directory, rejecting conflicting parser results.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/identity.py",
      "sha256": "5787145b18596effa587e4908d5e8e2b06926045d2ef36e5b99a3140087af10d"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "BULK_SCHEMA_VERSION",
          "value": "9"
        },
        {
          "annotation": null,
          "name": "BulkInputKind",
          "value": "Literal['full', 'polygon', 'both']"
        },
        {
          "annotation": null,
          "name": "BulkInputMode",
          "value": "Literal['auto', 'flightline_outputs', 'merged_parquet']"
        },
        {
          "annotation": null,
          "name": "BulkSource",
          "value": "SourceFileRecord"
        }
      ],
      "declared_exports": [
        "BULK_SCHEMA_VERSION",
        "BulkAnalysisPaths",
        "BulkInputKind",
        "BulkInputMode",
        "BulkSource",
        "ExclusionRecord",
        "FlightlineRecord",
        "SourceFileRecord"
      ],
      "docstring": "Data contracts for production bulk analysis.",
      "export_expressions": [
        "__all__ = ['BULK_SCHEMA_VERSION', 'BulkAnalysisPaths', 'BulkInputKind', 'BulkInputMode', 'BulkSource', 'ExclusionRecord', 'FlightlineRecord', 'SourceFileRecord']"
      ],
      "imports": {
        "Literal": "typing.Literal",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass"
      },
      "module": "spectralbridge.bulk.models",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "source_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "candidate_id"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "canonical_flightline_id"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "identity_source"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "site"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "acquisition_date"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_directory"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "relative_path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "input_kind"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "status"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "reason"
            },
            {
              "annotation": "int | None",
              "default": null,
              "name": "row_count"
            },
            {
              "annotation": "int | None",
              "default": null,
              "name": "column_count"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "size_bytes"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "modified_time_ns"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "schema_sha256"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "available_sensors_json"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "translation_eligible"
            },
            {
              "annotation": "str",
              "default": "'merged_parquet'",
              "name": "product_role"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "sensor_name"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "header_path"
            },
            {
              "annotation": "str",
              "default": "'{}'",
              "name": "dimensions_json"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "source_signature_sha256"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "qa_status"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "reason_code"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "matching_group"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "processing_stage"
            },
            {
              "annotation": "str",
              "default": "'[]'",
              "name": "wavelengths_json"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "dtype"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product_key"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "storage_format"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product_semantics"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "extraction_mode"
            },
            {
              "annotation": "str",
              "default": "'[]'",
              "name": "schema_json"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "One source product discovered in the read-only input tree.\n\nAttributes\n----------\nsource_id : str\n    Deterministic catalog key for this source, candidate directory or exclusion record; not a new ecological sampling unit.\ncandidate_id : str\n    Deterministic catalog key for this source, candidate directory or exclusion record; not a new ecological sampling unit.\ncanonical_flightline_id : str | None\n    Canonical scientific flightline identifier; histories from the same underlying flight must retain this identity.\nidentity_source : str | None\n    Parser or manifest provenance explaining how the scientific flightline identity was recovered.\nsite : str | None\n    Scientific site code recovered from the canonical identity or manifest, not an arbitrary outer directory name.\nacquisition_date : str | None\n    ISO acquisition date associated with this scientific flightline; None indicates unavailable metadata.\nsource_directory : str\n    Authoritative local source directory; bulk consumers treat its completed products as immutable.\nsource_path : str\n    Backing input product path retained for traceability and restart checks.\nrelative_path : str\n    Source path relative to the catalog input root for portable provenance.\ninput_kind : str\n    Select eligible 'full', 'polygon', or 'both' table products; discovery still records companions for transparency.\nstatus : str\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nreason : str | None\n    Explicit reason for exclusion, failure or unavailable status; None when no reason applies.\nrow_count : int | None\n    Recorded table dimension; None means the dimension could not be established.\ncolumn_count : int | None\n    Recorded table dimension; None means the dimension could not be established.\nsize_bytes : int\n    Size or estimated storage requirement in bytes; estimates describe planned artifacts rather than guaranteed disk use.\nmodified_time_ns : int\n    Recorded filesystem modification timestamp in nanoseconds for source-change detection.\nschema_sha256 : str | None\n    SHA-256 fingerprint of the recorded schema or source identity used for provenance/restart validation.\navailable_sensors_json : str\n    JSON-encoded available sensors retained in compact catalog rows; decode before inspecting nested fields.\ntranslation_eligible : bool\n    Whether the recorded product satisfies the corresponding translation availability/eligibility or producer-to-bulk gate; does not certify empirical sensor calibration.\nproduct_role : str, default='merged_parquet'\n    Scientific role of this product within the analysis profile, distinct from its storage format.\nsensor_name : str | None, default=None\n    Canonical sensor identity used to match registered products and translation relationships.\nheader_path : str | None, default=None\n    Companion raster header path needed to interpret dimensions, wavelengths and georeferencing.\ndimensions_json : str, default='{}'\n    JSON-encoded dimensions retained in compact catalog rows; decode before inspecting nested fields.\nsource_signature_sha256 : str | None, default=None\n    SHA-256 fingerprint of the recorded schema or source identity used for provenance/restart validation.\nqa_status : str | None, default=None\n    Recorded QA classification; missing or not-evaluated status is not a pass.\nreason_code : str | None, default=None\n    Machine-readable exclusion/review reason from the workflow vocabulary.\nmatching_group : str | None, default=None\n    Registry key declaring products that can be paired on common spatial/observational support.\nprocessing_stage : str | None, default=None\n    Recorded processing lineage, such as raw, corrected or translated; stages are not silently interchangeable.\nwavelengths_json : str, default='[]'\n    JSON-encoded wavelengths retained in compact catalog rows; decode before inspecting nested fields.\ndtype : str | None, default=None\n    Recorded numerical storage dtype of the source product.\nproduct_key : str | None, default=None\n    Unique registry key identifying this descriptor or translation relationship.\nstorage_format : str | None, default=None\n    Persisted representation such as raster or tabular storage, independent of scientific semantics.\nproduct_semantics : str | None, default=None\n    Declared meaning of the product values and their role in the evidence chain.\nextraction_mode : str | None, default=None\n    'full' writes pixel Parquet, 'polygon' requires polygons; None preserves the entry point's documented default extraction behavior.\nschema_json : str, default='[]'\n    JSON-encoded schema retained in compact catalog rows; decode before inspecting nested fields.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.SourceFileRecord",
            "spectralbridge.bulk.models.SourceFileRecord",
            "spectralbridge.pipelines.bulk.SourceFileRecord"
          ],
          "kind": "class",
          "line": 16,
          "methods": [],
          "name": "SourceFileRecord",
          "parameters": [],
          "path": "spectralbridge.bulk.models.SourceFileRecord",
          "signature": null,
          "summary": "One source product discovered in the read-only input tree.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "candidate_id"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "canonical_flightline_id"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "identity_source"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "site"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "acquisition_date"
            },
            {
              "annotation": "int | None",
              "default": null,
              "name": "acquisition_year"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_directory"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "canonical_merged_parquet"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "polygon_merged_parquet"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "selected_source_ids_json"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "selected_source_paths_json"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "qa_products_json"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "metadata_products_json"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "available_sensors_json"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "processing_stages_json"
            },
            {
              "annotation": "int | None",
              "default": null,
              "name": "row_count"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "size_bytes"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "source_directory_size_bytes"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "schema_fingerprints_json"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "brightness_state_json"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "correction_state_json"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "translation_eligible"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "status"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "rejection_reason"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "duplicate_status"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "duplicate_candidate_count"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_provenance_json"
            },
            {
              "annotation": "str",
              "default": "'merged_parquet'",
              "name": "input_mode"
            },
            {
              "annotation": "str",
              "default": "'{}'",
              "name": "corrected_product_json"
            },
            {
              "annotation": "str",
              "default": "'{}'",
              "name": "target_products_json"
            },
            {
              "annotation": "str",
              "default": "'missing'",
              "name": "qa_status"
            },
            {
              "annotation": "str",
              "default": "'{}'",
              "name": "stage_qa_status_json"
            },
            {
              "annotation": "str",
              "default": "'[]'",
              "name": "missing_products_json"
            },
            {
              "annotation": "str",
              "default": "'{}'",
              "name": "analysis_eligibility_json"
            },
            {
              "annotation": "int",
              "default": "0",
              "name": "estimated_cache_bytes"
            },
            {
              "annotation": "int",
              "default": "0",
              "name": "estimated_analysis_output_bytes"
            },
            {
              "annotation": "int",
              "default": "0",
              "name": "estimated_materialized_pixel_bytes"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "cache_observations"
            },
            {
              "annotation": "str",
              "default": "'not_required'",
              "name": "extraction_status"
            },
            {
              "annotation": "str",
              "default": "'translation'",
              "name": "analysis_profile"
            },
            {
              "annotation": "str",
              "default": "'unknown'",
              "name": "processing_completeness"
            },
            {
              "annotation": "str",
              "default": "'{}'",
              "name": "product_availability_json"
            },
            {
              "annotation": "str",
              "default": "'[]'",
              "name": "exclusion_reason_codes_json"
            },
            {
              "annotation": "str",
              "default": "'[]'",
              "name": "exclusion_context_json"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "translation_available"
            },
            {
              "annotation": "str",
              "default": "'{}'",
              "name": "translation_availability_json"
            },
            {
              "annotation": "str",
              "default": "'not_evaluated'",
              "name": "scientific_status"
            },
            {
              "annotation": "str",
              "default": "'[]'",
              "name": "scientific_blockers_json"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Canonical scientific unit recovered from one source directory.\n\nAttributes\n----------\ncandidate_id : str\n    Deterministic catalog key for this source, candidate directory or exclusion record; not a new ecological sampling unit.\ncanonical_flightline_id : str | None\n    Canonical scientific flightline identifier; histories from the same underlying flight must retain this identity.\nidentity_source : str | None\n    Parser or manifest provenance explaining how the scientific flightline identity was recovered.\nsite : str | None\n    Scientific site code recovered from the canonical identity or manifest, not an arbitrary outer directory name.\nacquisition_date : str | None\n    ISO acquisition date associated with this scientific flightline; None indicates unavailable metadata.\nacquisition_year : int | None\n    Calendar acquisition year used for inventory grouping and completeness checks.\nsource_directory : str\n    Authoritative local source directory; bulk consumers treat its completed products as immutable.\ncanonical_merged_parquet : str | None\n    Authoritative existing merged product path, or None when the corresponding full/polygon table is unavailable.\npolygon_merged_parquet : str | None\n    Authoritative existing merged product path, or None when the corresponding full/polygon table is unavailable.\nselected_source_ids_json : str\n    JSON-encoded selected source ids retained in compact catalog rows; decode before inspecting nested fields.\nselected_source_paths_json : str\n    JSON-encoded selected source paths retained in compact catalog rows; decode before inspecting nested fields.\nqa_products_json : str\n    JSON-encoded qa products retained in compact catalog rows; decode before inspecting nested fields.\nmetadata_products_json : str\n    JSON-encoded metadata products retained in compact catalog rows; decode before inspecting nested fields.\navailable_sensors_json : str\n    JSON-encoded available sensors retained in compact catalog rows; decode before inspecting nested fields.\nprocessing_stages_json : str\n    JSON-encoded processing stages retained in compact catalog rows; decode before inspecting nested fields.\nrow_count : int | None\n    Recorded table dimension; None means the dimension could not be established.\nsize_bytes : int\n    Size or estimated storage requirement in bytes; estimates describe planned artifacts rather than guaranteed disk use.\nsource_directory_size_bytes : int\n    Size or estimated storage requirement in bytes; estimates describe planned artifacts rather than guaranteed disk use.\nschema_fingerprints_json : str\n    JSON-encoded schema fingerprints retained in compact catalog rows; decode before inspecting nested fields.\nbrightness_state_json : str\n    JSON-encoded brightness state retained in compact catalog rows; decode before inspecting nested fields.\ncorrection_state_json : str\n    JSON-encoded correction state retained in compact catalog rows; decode before inspecting nested fields.\ntranslation_eligible : bool\n    Whether the recorded product satisfies the corresponding translation availability/eligibility or producer-to-bulk gate; does not certify empirical sensor calibration.\nstatus : str\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nrejection_reason : str | None\n    Explicit reason for exclusion, failure or unavailable status; None when no reason applies.\nduplicate_status : str\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nduplicate_candidate_count : int\n    Number of candidate directories sharing the canonical scientific flightline identity.\nsource_provenance_json : str\n    JSON-encoded source provenance retained in compact catalog rows; decode before inspecting nested fields.\ninput_mode : str, default='merged_parquet'\n    'auto' prefers completed flightline directories and falls back to merged Parquets; alternatives are 'flightline_outputs' and 'merged_parquet'.\ncorrected_product_json : str, default='{}'\n    JSON-encoded corrected product retained in compact catalog rows; decode before inspecting nested fields.\ntarget_products_json : str, default='{}'\n    JSON-encoded target products retained in compact catalog rows; decode before inspecting nested fields.\nqa_status : str, default='missing'\n    Recorded QA classification; missing or not-evaluated status is not a pass.\nstage_qa_status_json : str, default='{}'\n    JSON-encoded stage qa status retained in compact catalog rows; decode before inspecting nested fields.\nmissing_products_json : str, default='[]'\n    JSON-encoded missing products retained in compact catalog rows; decode before inspecting nested fields.\nanalysis_eligibility_json : str, default='{}'\n    JSON-encoded analysis eligibility retained in compact catalog rows; decode before inspecting nested fields.\nestimated_cache_bytes : int, default=0\n    Size or estimated storage requirement in bytes; estimates describe planned artifacts rather than guaranteed disk use.\nestimated_analysis_output_bytes : int, default=0\n    Size or estimated storage requirement in bytes; estimates describe planned artifacts rather than guaranteed disk use.\nestimated_materialized_pixel_bytes : int, default=0\n    Size or estimated storage requirement in bytes; estimates describe planned artifacts rather than guaranteed disk use.\ncache_observations : str | None, default=None\n    Optional path to explicitly materialized pixel observations; absent from ordinary compact bulk analysis.\nextraction_status : str, default='not_required'\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nanalysis_profile : str, default='translation'\n    Registered analysis profile name or AnalysisProfile controlling required products and permissible sensor pairs.\nprocessing_completeness : str, default='unknown'\n    Recorded assessment of required product completeness under the selected analysis profile.\nproduct_availability_json : str, default='{}'\n    JSON-encoded product availability retained in compact catalog rows; decode before inspecting nested fields.\nexclusion_reason_codes_json : str, default='[]'\n    JSON-encoded exclusion reason codes retained in compact catalog rows; decode before inspecting nested fields.\nexclusion_context_json : str, default='[]'\n    JSON-encoded exclusion context retained in compact catalog rows; decode before inspecting nested fields.\ntranslation_available : bool, default=False\n    Whether the recorded product satisfies the corresponding translation availability/eligibility or producer-to-bulk gate; does not certify empirical sensor calibration.\ntranslation_availability_json : str, default='{}'\n    JSON-encoded translation availability retained in compact catalog rows; decode before inspecting nested fields.\nscientific_status : str, default='not_evaluated'\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nscientific_blockers_json : str, default='[]'\n    JSON-encoded scientific blockers retained in compact catalog rows; decode before inspecting nested fields.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.FlightlineRecord",
            "spectralbridge.bulk.models.FlightlineRecord",
            "spectralbridge.pipelines.bulk.FlightlineRecord"
          ],
          "kind": "class",
          "line": 131,
          "methods": [],
          "name": "FlightlineRecord",
          "parameters": [],
          "path": "spectralbridge.bulk.models.FlightlineRecord",
          "signature": null,
          "summary": "Canonical scientific unit recovered from one source directory.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "exclusion_id"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "canonical_flightline_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_path"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "site"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "acquisition_date"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "analysis_profile"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "product_role"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "sensor_name"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "offending_files_json"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "reason_code"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "detail"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "processing_stage"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "One deterministic, machine-readable bulk exclusion.\n\nAttributes\n----------\nexclusion_id : str\n    Deterministic catalog key for this source, candidate directory or exclusion record; not a new ecological sampling unit.\ncanonical_flightline_id : str | None\n    Canonical scientific flightline identifier; histories from the same underlying flight must retain this identity.\nsource_path : str\n    Backing input product path retained for traceability and restart checks.\nsite : str | None\n    Scientific site code recovered from the canonical identity or manifest, not an arbitrary outer directory name.\nacquisition_date : str | None\n    ISO acquisition date associated with this scientific flightline; None indicates unavailable metadata.\nanalysis_profile : str\n    Registered analysis profile name or AnalysisProfile controlling required products and permissible sensor pairs.\nproduct_role : str | None\n    Scientific role of this product within the analysis profile, distinct from its storage format.\nsensor_name : str | None\n    Canonical sensor identity used to match registered products and translation relationships.\noffending_files_json : str\n    JSON-encoded offending files retained in compact catalog rows; decode before inspecting nested fields.\nreason_code : str\n    Machine-readable exclusion/review reason from the workflow vocabulary.\ndetail : str\n    Human-readable context supporting the exclusion or decision record.\nprocessing_stage : str | None\n    Recorded processing lineage, such as raw, corrected or translated; stages are not silently interchangeable.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.ExclusionRecord",
            "spectralbridge.bulk.models.ExclusionRecord"
          ],
          "kind": "class",
          "line": 285,
          "methods": [],
          "name": "ExclusionRecord",
          "parameters": [],
          "path": "spectralbridge.bulk.models.ExclusionRecord",
          "signature": null,
          "summary": "One deterministic, machine-readable bulk exclusion.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "output_dir"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Canonical, isolated output paths for one bulk-analysis run.\n\nAttributes\n----------\noutput_dir : Path\n    Directory for generated products; bulk outputs must be outside the read-only input tree.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.BulkAnalysisPaths",
            "spectralbridge.bulk.models.BulkAnalysisPaths",
            "spectralbridge.pipelines.bulk.BulkAnalysisPaths"
          ],
          "kind": "class",
          "line": 331,
          "methods": [
            {
              "docstring": "",
              "line": 342,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "Resolve the canonical catalog dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'catalog'``. Accessing this property does not create or validate the artifact.",
              "line": 346,
              "name": "catalog_dir",
              "parameters": [],
              "private": false,
              "signature": "catalog_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical database dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'database'``. Accessing this property does not create or validate the artifact.",
              "line": 358,
              "name": "database_dir",
              "parameters": [],
              "private": false,
              "signature": "database_dir(self) -> Path"
            },
            {
              "docstring": "Legacy pixel-materialization directory; unused by normal analysis.",
              "line": 370,
              "name": "cache_dir",
              "parameters": [],
              "private": false,
              "signature": "cache_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical statistics dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'statistics'``. Accessing this property does not create or validate the artifact.",
              "line": 376,
              "name": "statistics_dir",
              "parameters": [],
              "private": false,
              "signature": "statistics_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical flightline statistics dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.statistics_dir / 'flightlines'``. Accessing this property does not create or validate the artifact.",
              "line": 388,
              "name": "flightline_statistics_dir",
              "parameters": [],
              "private": false,
              "signature": "flightline_statistics_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical sufficient statistics location.\n\nReturns\n-------\nPath\n    Path computed as ``self.statistics_dir / 'translation_sufficient_statistics.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 400,
              "name": "sufficient_statistics",
              "parameters": [],
              "private": false,
              "signature": "sufficient_statistics(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical diagnostic sample location.\n\nReturns\n-------\nPath\n    Path computed as ``self.statistics_dir / 'diagnostic_sample.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 412,
              "name": "diagnostic_sample",
              "parameters": [],
              "private": false,
              "signature": "diagnostic_sample(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical analyses dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'analyses'``. Accessing this property does not create or validate the artifact.",
              "line": 424,
              "name": "analyses_dir",
              "parameters": [],
              "private": false,
              "signature": "analyses_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical coefficients dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'coefficients'``. Accessing this property does not create or validate the artifact.",
              "line": 436,
              "name": "coefficients_dir",
              "parameters": [],
              "private": false,
              "signature": "coefficients_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical tables dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'tables'``. Accessing this property does not create or validate the artifact.",
              "line": 448,
              "name": "tables_dir",
              "parameters": [],
              "private": false,
              "signature": "tables_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical figures dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'figures'``. Accessing this property does not create or validate the artifact.",
              "line": 460,
              "name": "figures_dir",
              "parameters": [],
              "private": false,
              "signature": "figures_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical reports dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'reports'``. Accessing this property does not create or validate the artifact.",
              "line": 472,
              "name": "reports_dir",
              "parameters": [],
              "private": false,
              "signature": "reports_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical logs dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.output_dir / 'logs'``. Accessing this property does not create or validate the artifact.",
              "line": 484,
              "name": "logs_dir",
              "parameters": [],
              "private": false,
              "signature": "logs_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical flightlines location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'flightlines.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 496,
              "name": "flightlines",
              "parameters": [],
              "private": false,
              "signature": "flightlines(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical source files location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'source_files.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 508,
              "name": "source_files",
              "parameters": [],
              "private": false,
              "signature": "source_files(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical source products location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'source_products.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 520,
              "name": "source_products",
              "parameters": [],
              "private": false,
              "signature": "source_products(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical duplicates location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'duplicates.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 532,
              "name": "duplicates",
              "parameters": [],
              "private": false,
              "signature": "duplicates(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical rejected sources location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'rejected_sources.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 544,
              "name": "rejected_sources",
              "parameters": [],
              "private": false,
              "signature": "rejected_sources(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical exclusions location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'exclusions.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 556,
              "name": "exclusions",
              "parameters": [],
              "private": false,
              "signature": "exclusions(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical exclusions json location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'exclusions.json'``. Accessing this property does not create or validate the artifact.",
              "line": 568,
              "name": "exclusions_json",
              "parameters": [],
              "private": false,
              "signature": "exclusions_json(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical exclusions csv location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'exclusions.csv'``. Accessing this property does not create or validate the artifact.",
              "line": 580,
              "name": "exclusions_csv",
              "parameters": [],
              "private": false,
              "signature": "exclusions_csv(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical manifest location.\n\nReturns\n-------\nPath\n    Path computed as ``self.catalog_dir / 'bulk_manifest.json'``. Accessing this property does not create or validate the artifact.",
              "line": 592,
              "name": "manifest",
              "parameters": [],
              "private": false,
              "signature": "manifest(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical database location.\n\nReturns\n-------\nPath\n    Path computed as ``self.database_dir / 'spectralbridge_bulk.duckdb'``. Accessing this property does not create or validate the artifact.",
              "line": 604,
              "name": "database",
              "parameters": [],
              "private": false,
              "signature": "database(self) -> Path"
            },
            {
              "docstring": "Optional portable materialization; absent in the default mode.",
              "line": 616,
              "name": "observations",
              "parameters": [],
              "private": false,
              "signature": "observations(self) -> Path"
            },
            {
              "docstring": "Compatibility alias for the source-file catalog.",
              "line": 622,
              "name": "source_catalog",
              "parameters": [],
              "private": false,
              "signature": "source_catalog(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical coefficients parquet location.\n\nReturns\n-------\nPath\n    Path computed as ``self.coefficients_dir / 'candidate_translation_coefficients.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 628,
              "name": "coefficients_parquet",
              "parameters": [],
              "private": false,
              "signature": "coefficients_parquet(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical coefficients json location.\n\nReturns\n-------\nPath\n    Path computed as ``self.coefficients_dir / 'candidate_translation_coefficients.json'``. Accessing this property does not create or validate the artifact.",
              "line": 640,
              "name": "coefficients_json",
              "parameters": [],
              "private": false,
              "signature": "coefficients_json(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical analysis decisions location.\n\nReturns\n-------\nPath\n    Path computed as ``self.reports_dir / 'analysis_decisions.json'``. Accessing this property does not create or validate the artifact.",
              "line": 652,
              "name": "analysis_decisions",
              "parameters": [],
              "private": false,
              "signature": "analysis_decisions(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical campaign summary location.\n\nReturns\n-------\nPath\n    Path computed as ``self.reports_dir / 'campaign_summary.md'``. Accessing this property does not create or validate the artifact.",
              "line": 664,
              "name": "campaign_summary",
              "parameters": [],
              "private": false,
              "signature": "campaign_summary(self) -> Path"
            },
            {
              "docstring": "Create the canonical output directory hierarchy.\n\nReturns\n-------\nNone\n    No return value; validation raises on unsupported configuration and directory creation persists the canonical hierarchy.",
              "line": 675,
              "name": "ensure_directories",
              "parameters": [],
              "private": false,
              "signature": "ensure_directories(self) -> None"
            }
          ],
          "name": "BulkAnalysisPaths",
          "parameters": [],
          "path": "spectralbridge.bulk.models.BulkAnalysisPaths",
          "signature": null,
          "summary": "Canonical, isolated output paths for one bulk-analysis run.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/models.py",
      "sha256": "dd13aeec7b03f22743b50894f559b6254b7f5dd04423b7fbb0755f7e5c74eebe"
    },
    {
      "area": "bulk",
      "constants": [],
      "declared_exports": [
        "canonical_json",
        "relative_paths",
        "signature_sha256",
        "write_json_atomic",
        "write_text_atomic"
      ],
      "docstring": "Deterministic provenance helpers for bulk outputs.",
      "export_expressions": [
        "__all__ = ['canonical_json', 'relative_paths', 'signature_sha256', 'write_json_atomic', 'write_text_atomic']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Iterable": "typing.Iterable",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.bulk.provenance",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 12,
          "methods": [],
          "name": "_json_safe",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.provenance._json_safe",
          "signature": "_json_safe(value: Any) -> Any",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Serialize a value deterministically for manifests and catalog columns.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.provenance.canonical_json"
          ],
          "kind": "function",
          "line": 22,
          "methods": [],
          "name": "canonical_json",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.provenance.canonical_json",
          "signature": "canonical_json(value: Any) -> str",
          "summary": "Serialize a value deterministically for manifests and catalog columns.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.provenance.signature_sha256"
          ],
          "kind": "function",
          "line": 30,
          "methods": [],
          "name": "signature_sha256",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.provenance.signature_sha256",
          "signature": "signature_sha256(value: Any) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.bulk.provenance.write_json_atomic"
          ],
          "kind": "function",
          "line": 34,
          "methods": [],
          "name": "write_json_atomic",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "payload"
            }
          ],
          "path": "spectralbridge.bulk.provenance.write_json_atomic",
          "signature": "write_json_atomic(path: Path, payload: dict[str, Any]) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.provenance.write_text_atomic"
          ],
          "kind": "function",
          "line": 49,
          "methods": [],
          "name": "write_text_atomic",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "text"
            }
          ],
          "path": "spectralbridge.bulk.provenance.write_text_atomic",
          "signature": "write_text_atomic(path: Path, text: str) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.provenance.relative_paths"
          ],
          "kind": "function",
          "line": 58,
          "methods": [],
          "name": "relative_paths",
          "parameters": [
            {
              "annotation": "Iterable[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.bulk.provenance.relative_paths",
          "signature": "relative_paths(paths: Iterable[Path], root: Path) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/bulk/provenance.py",
      "sha256": "5e4ad20baa54fa598a129b3502d4a8971dbbbbe241fc15a3b2228bcff30f7266"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "TRANSLATION_PROFILE",
          "value": "AnalysisProfile(name='translation', required_product_roles=('target_sensor',), require_translation_pair=True)"
        },
        {
          "annotation": null,
          "name": "ANALYSIS_PROFILES",
          "value": "{TRANSLATION_PROFILE.name: TRANSLATION_PROFILE}"
        },
        {
          "annotation": null,
          "name": "DEFAULT_PRODUCT_REGISTRY",
          "value": "ProductRegistry(products=_BUILTIN_PRODUCTS, translation_pairs=_BUILTIN_PAIRS, tabular_products=_BUILTIN_TABULAR_PRODUCTS)"
        }
      ],
      "declared_exports": [
        "ANALYSIS_PROFILES",
        "AnalysisProfile",
        "DEFAULT_PRODUCT_REGISTRY",
        "ProductDescriptor",
        "ProductRegistry",
        "TRANSLATION_PROFILE",
        "TabularProductDescriptor",
        "TranslationPair",
        "resolve_analysis_profile"
      ],
      "docstring": "Generic product, translation-pair, and analysis-profile contracts.",
      "export_expressions": [
        "__all__ = ['ANALYSIS_PROFILES', 'DEFAULT_PRODUCT_REGISTRY', 'TRANSLATION_PROFILE', 'AnalysisProfile', 'ProductDescriptor', 'ProductRegistry', 'TabularProductDescriptor', 'TranslationPair', 'resolve_analysis_profile']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY": "spectralbridge.sensor_pairs.SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "wavelength_matched_band_pairs": "spectralbridge.sensor_pairs.wavelength_matched_band_pairs"
      },
      "module": "spectralbridge.bulk.registry",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "key"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "product_role"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "name": "filename_patterns"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "sensor_name"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "matching_group"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "processing_stage"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product_semantics"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "extraction_mode"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "expected_band_count"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "header_required"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "include_undarkened"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Recognize and describe one persisted raster-product convention.\n\nAttributes\n----------\nkey : str\n    Unique registry key identifying this descriptor or translation relationship.\nproduct_role : str\n    Scientific role of this product within the analysis profile, distinct from its storage format.\nfilename_patterns : tuple[str, ...]\n    Recognized canonical filename glob patterns; matching does not alone establish scientific eligibility.\nsensor_name : str | None, default=None\n    Canonical sensor identity used to match registered products and translation relationships.\nmatching_group : str | None, default=None\n    Registry key declaring products that can be paired on common spatial/observational support.\nprocessing_stage : str | None, default=None\n    Recorded processing lineage, such as raw, corrected or translated; stages are not silently interchangeable.\nproduct_semantics : str | None, default=None\n    Declared meaning of the product values and their role in the evidence chain.\nextraction_mode : str | None, default=None\n    'full' writes pixel Parquet, 'polygon' requires polygons; None preserves the entry point's documented default extraction behavior.\nexpected_band_count : int | None, default=None\n    Required number of spectral bands under this descriptor; metadata and actual products are validated separately.\nheader_required : bool, default=True\n    Require a companion raster header for this product descriptor.\ninclude_undarkened : bool, default=False\n    Include the matching undarkened product convention when recognizing these filenames.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.ProductDescriptor",
            "spectralbridge.bulk.registry.ProductDescriptor"
          ],
          "kind": "class",
          "line": 17,
          "methods": [
            {
              "docstring": "Check whether the filename matches this registered product convention.\n\nParameters\n----------\npath : str | Path\n    Existing source path to match against registered canonical filename patterns.\n\nReturns\n-------\nbool\n    Whether the recorded state satisfies this method's predicate; no source processing is performed.",
              "line": 58,
              "name": "matches",
              "parameters": [
                {
                  "annotation": "str | Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "matches(self, path: str | Path) -> bool"
            }
          ],
          "name": "ProductDescriptor",
          "parameters": [],
          "path": "spectralbridge.bulk.registry.ProductDescriptor",
          "signature": null,
          "summary": "Recognize and describe one persisted raster-product convention.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "key"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "product_role"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "name": "filename_patterns"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "sensor_name"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "processing_stage"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product_semantics"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "extraction_mode"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "expected_spectral_band_count"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "()",
              "name": "required_columns"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Recognize one canonical per-flight tabular product convention.\n\nTabular products are catalog inputs, not implicit regression inputs.  The\ndescriptor keeps storage layout separate from the raster relationship used\nby the bounded statistics reader.\n\nAttributes\n----------\nkey : str\n    Unique registry key identifying this descriptor or translation relationship.\nproduct_role : str\n    Scientific role of this product within the analysis profile, distinct from its storage format.\nfilename_patterns : tuple[str, ...]\n    Recognized canonical filename glob patterns; matching does not alone establish scientific eligibility.\nsensor_name : str | None, default=None\n    Canonical sensor identity used to match registered products and translation relationships.\nprocessing_stage : str | None, default=None\n    Recorded processing lineage, such as raw, corrected or translated; stages are not silently interchangeable.\nproduct_semantics : str | None, default=None\n    Declared meaning of the product values and their role in the evidence chain.\nextraction_mode : str | None, default=None\n    'full' writes pixel Parquet, 'polygon' requires polygons; None preserves the entry point's documented default extraction behavior.\nexpected_spectral_band_count : int | None, default=None\n    Required number of spectral bands under this descriptor; metadata and actual products are validated separately.\nrequired_columns : tuple[str, ...], default=()\n    Required tabular column names for metadata validation; not a request to materialize all observation rows.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.TabularProductDescriptor",
            "spectralbridge.bulk.registry.TabularProductDescriptor"
          ],
          "kind": "class",
          "line": 81,
          "methods": [
            {
              "docstring": "Check whether the filename matches this registered product convention.\n\nParameters\n----------\npath : str | Path\n    Existing source path to match against registered canonical filename patterns.\n\nReturns\n-------\nbool\n    Whether the recorded state satisfies this method's predicate; no source processing is performed.",
              "line": 120,
              "name": "matches",
              "parameters": [
                {
                  "annotation": "str | Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "matches(self, path: str | Path) -> bool"
            }
          ],
          "name": "TabularProductDescriptor",
          "parameters": [],
          "path": "spectralbridge.bulk.registry.TabularProductDescriptor",
          "signature": null,
          "summary": "Recognize one canonical per-flight tabular product convention.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "key"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "target_sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "matching_group"
            },
            {
              "annotation": "tuple[tuple[int, int], ...]",
              "default": "()",
              "name": "band_pairs"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "expected_source_bands"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "expected_target_bands"
            },
            {
              "annotation": "tuple[int, ...]",
              "default": "()",
              "name": "compatible_target_band_counts"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "evidence_boundary"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "A scientifically defined relationship between two sensor products.\n\nAttributes\n----------\nkey : str\n    Unique registry key identifying this descriptor or translation relationship.\nsource_sensor : str\n    Canonical sensor identity used to match registered products and translation relationships.\ntarget_sensor : str\n    Canonical target sensor key present in the reviewed drone coefficient registry.\nmatching_group : str\n    Registry key declaring products that can be paired on common spatial/observational support.\nband_pairs : tuple[tuple[int, int], ...], default=()\n    Explicit source/target band relationships in the registry convention; preserve their declared index convention.\nexpected_source_bands : int | None, default=None\n    Declared source/target band-count contract for this registered translation relationship.\nexpected_target_bands : int | None, default=None\n    Declared source/target band-count contract for this registered translation relationship.\ncompatible_target_band_counts : tuple[int, ...], default=()\n    Declared source/target band-count contract for this registered translation relationship.\nevidence_boundary : str | None, default=None\n    Scientific limitation attached to this relationship; common-source synthetic products do not become independent calibration observations.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.TranslationPair",
            "spectralbridge.bulk.registry.TranslationPair"
          ],
          "kind": "class",
          "line": 141,
          "methods": [],
          "name": "TranslationPair",
          "parameters": [],
          "path": "spectralbridge.bulk.registry.TranslationPair",
          "signature": null,
          "summary": "A scientifically defined relationship between two sensor products.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "name"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "()",
              "name": "required_product_roles"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "('raw_hyperspectral', 'corrected_hyperspectral', 'qa', 'metadata')",
              "name": "optional_product_roles"
            },
            {
              "annotation": "tuple[str, ...] | None",
              "default": "None",
              "name": "allowed_sensors"
            },
            {
              "annotation": "tuple[str, ...] | None",
              "default": "None",
              "name": "allowed_matching_groups"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "require_translation_pair"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "require_qa"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "require_original_hyperspectral"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "require_corrected_hyperspectral"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "require_nonzero_files"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "require_readable_metadata"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "require_valid_dimensions"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "require_compatible_band_schema"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Product and integrity requirements for one bulk analysis.\n\nAttributes\n----------\nname : str\n    Stable parser/profile identifier used in configuration and provenance.\nrequired_product_roles : tuple[str, ...], default=()\n    Product roles required or additionally recognized by this analysis profile.\noptional_product_roles : tuple[str, ...], default=('raw_hyperspectral', 'corrected_hyperspectral', 'qa', 'metadata')\n    Product roles required or additionally recognized by this analysis profile.\nallowed_sensors : tuple[str, ...] | None, default=None\n    Optional registry restrictions on sensor identities or common-support matching groups.\nallowed_matching_groups : tuple[str, ...] | None, default=None\n    Optional registry restrictions on sensor identities or common-support matching groups.\nrequire_translation_pair : bool, default=False\n    Require at least one compatible registered translation relationship for eligibility.\nrequire_qa : bool, default=False\n    Require the profile's QA artifacts during source validation.\nrequire_original_hyperspectral : bool, default=False\n    Require the corresponding original/corrected hyperspectral source role for this profile.\nrequire_corrected_hyperspectral : bool, default=False\n    Require the corresponding original/corrected hyperspectral source role for this profile.\nrequire_nonzero_files : bool, default=True\n    Reject zero-byte product artifacts during completeness validation.\nrequire_readable_metadata : bool, default=True\n    Require metadata to be readable before admitting a candidate.\nrequire_valid_dimensions : bool, default=True\n    Require compatible positive raster dimensions during validation.\nrequire_compatible_band_schema : bool, default=True\n    Require product band metadata to satisfy the selected relationship contract.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.AnalysisProfile",
            "spectralbridge.bulk.registry.AnalysisProfile"
          ],
          "kind": "class",
          "line": 178,
          "methods": [],
          "name": "AnalysisProfile",
          "parameters": [],
          "path": "spectralbridge.bulk.registry.AnalysisProfile",
          "signature": null,
          "summary": "Product and integrity requirements for one bulk analysis.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "tuple[ProductDescriptor, ...]",
              "default": null,
              "name": "products"
            },
            {
              "annotation": "tuple[TranslationPair, ...]",
              "default": null,
              "name": "translation_pairs"
            },
            {
              "annotation": "tuple[TabularProductDescriptor, ...]",
              "default": "()",
              "name": "tabular_products"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Immutable registry used by discovery, extraction, and analysis.\n\nAttributes\n----------\nproducts : tuple[ProductDescriptor, ...]\n    Immutable collection of raster/tabular descriptors recognized by this registry.\ntranslation_pairs : tuple[TranslationPair, ...]\n    Explicit registered source-to-target relationships to analyze; None uses the selected registry/profile defaults.\ntabular_products : tuple[TabularProductDescriptor, ...], default=()\n    Immutable collection of raster/tabular descriptors recognized by this registry.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.ProductRegistry",
            "spectralbridge.bulk.registry.ProductRegistry"
          ],
          "kind": "class",
          "line": 232,
          "methods": [
            {
              "docstring": "Return the raster descriptor matching this product filename.\n\nParameters\n----------\npath : str | Path\n    Existing source path to match against registered canonical filename patterns.\n\nReturns\n-------\nProductDescriptor | None\n    Matching raster ProductDescriptor, or None when no filename convention matches.",
              "line": 249,
              "name": "recognize",
              "parameters": [
                {
                  "annotation": "str | Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "recognize(self, path: str | Path) -> ProductDescriptor | None"
            },
            {
              "docstring": "Return the registered raster descriptor for a sensor identity.\n\nParameters\n----------\nsensor_name : str\n    Canonical sensor identity used to match registered products and translation relationships.\n\nReturns\n-------\nProductDescriptor | None\n    ProductDescriptor for the requested canonical sensor name, or None when no descriptor exists.",
              "line": 269,
              "name": "product_for_sensor",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "sensor_name"
                }
              ],
              "private": false,
              "signature": "product_for_sensor(self, sensor_name: str) -> ProductDescriptor | None"
            },
            {
              "docstring": "Return the tabular descriptor matching this product filename.\n\nParameters\n----------\npath : str | Path\n    Existing source path to match against registered canonical filename patterns.\n\nReturns\n-------\nTabularProductDescriptor | None\n    Matching TabularProductDescriptor, or None when no tabular filename convention matches.",
              "line": 292,
              "name": "recognize_tabular",
              "parameters": [
                {
                  "annotation": "str | Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "recognize_tabular(self, path: str | Path) -> TabularProductDescriptor | None"
            },
            {
              "docstring": "Resolve and validate the requested registered sensor relationships.\n\nParameters\n----------\nsensors : Sequence[str] | None\n    Optional sensor-name selection passed to the product registry; None retains profile-compatible sensors.\ntranslation_pairs : Sequence[str | TranslationPair] | None\n    Explicit registered source-to-target relationships to analyze; None uses the selected registry/profile defaults.\nallowed_sensors : Sequence[str] | None\n    Optional registry restrictions on sensor identities or common-support matching groups.\nallowed_matching_groups : Sequence[str] | None\n    Optional registry restrictions on sensor identities or common-support matching groups.\nallow_empty : bool\n    Allow an empty relationship selection rather than raising an error.\n\nReturns\n-------\ntuple[TranslationPair, ...]\n    Ordered tuple of compatible TranslationPair records selected from this registry.\n\nRaises\n------\nValueError\n    If option values violate the configuration or relationship-selection contract.",
              "line": 316,
              "name": "select_pairs",
              "parameters": [
                {
                  "annotation": "Sequence[str] | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "sensors"
                },
                {
                  "annotation": "Sequence[str | TranslationPair] | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "translation_pairs"
                },
                {
                  "annotation": "Sequence[str] | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "allowed_sensors"
                },
                {
                  "annotation": "Sequence[str] | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "allowed_matching_groups"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "keyword-only",
                  "name": "allow_empty"
                }
              ],
              "private": false,
              "signature": "select_pairs(self, *, sensors: Sequence[str] | None=None, translation_pairs: Sequence[str | TranslationPair] | None=None, allowed_sensors: Sequence[str] | None=None, allowed_matching_groups: Sequence[str] | None=None, allow_empty: bool=False) -> tuple[TranslationPair, ...]"
            }
          ],
          "name": "ProductRegistry",
          "parameters": [],
          "path": "spectralbridge.bulk.registry.ProductRegistry",
          "signature": null,
          "summary": "Immutable registry used by discovery, extraction, and analysis.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Resolve a registered profile name or retain an explicit AnalysisProfile; reject unknown names.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.registry.resolve_analysis_profile"
          ],
          "kind": "function",
          "line": 397,
          "methods": [],
          "name": "resolve_analysis_profile",
          "parameters": [
            {
              "annotation": "str | AnalysisProfile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.registry.resolve_analysis_profile",
          "signature": "resolve_analysis_profile(value: str | AnalysisProfile) -> AnalysisProfile",
          "summary": "Resolve a registered profile name or retain an explicit AnalysisProfile; reject unknown names.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/registry.py",
      "sha256": "ce27ee27aeb5751ab196fb49270627f91bae5d0d370ef371c6eac2c9b7c46b83"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "BULK_PUBLICATION_FIGURE_NAMES",
          "value": "('translation_performance', 'translation_stability', 'generalization_and_failures')"
        },
        {
          "annotation": null,
          "name": "BULK_PUBLICATION_PANEL_COUNT",
          "value": "3"
        }
      ],
      "declared_exports": [
        "BULK_PUBLICATION_FIGURE_NAMES",
        "BULK_PUBLICATION_PANEL_COUNT",
        "render_bulk_pdf_report",
        "render_bulk_publication_figures",
        "render_bulk_summary_dashboard"
      ],
      "docstring": "Publication and summary reporting from compact bulk result products.",
      "export_expressions": [
        "__all__ = ['BULK_PUBLICATION_FIGURE_NAMES', 'BULK_PUBLICATION_PANEL_COUNT', 'render_bulk_pdf_report', 'render_bulk_publication_figures', 'render_bulk_summary_dashboard']"
      ],
      "imports": {
        "Any": "typing.Any",
        "DEFAULT_QA_STYLE": "spectralbridge.qa_style.DEFAULT_QA_STYLE",
        "Path": "pathlib.Path",
        "PdfPages": "matplotlib.backends.backend_pdf.PdfPages",
        "STATUS_COLORS": "spectralbridge.qa_style.STATUS_COLORS",
        "Sequence": "typing.Sequence",
        "WEIGHTING_COLORS": "spectralbridge.qa_style.WEIGHTING_COLORS",
        "WEIGHTING_MARKERS": "spectralbridge.qa_style.WEIGHTING_MARKERS",
        "annotations": "__future__.annotations",
        "apply_qa_axis_style": "spectralbridge.qa_style.apply_qa_axis_style",
        "wavelength_pair_label": "spectralbridge.qa_style.wavelength_pair_label"
      },
      "module": "spectralbridge.bulk.reporting",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 35,
          "methods": [],
          "name": "_number",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "int",
              "default": "3",
              "kind": "keyword-only",
              "name": "digits"
            },
            {
              "annotation": "str",
              "default": "''",
              "kind": "keyword-only",
              "name": "suffix"
            }
          ],
          "path": "spectralbridge.bulk.reporting._number",
          "signature": "_number(value: Any, *, digits: int=3, suffix: str='') -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 45,
          "methods": [],
          "name": "_save_pair",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "figure"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stem"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dpi"
            }
          ],
          "path": "spectralbridge.bulk.reporting._save_pair",
          "signature": "_save_pair(figure: Any, stem: Path, dpi: int) -> dict[str, str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 62,
          "methods": [],
          "name": "_metric_card",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "figure"
            },
            {
              "annotation": "tuple[float, float, float, float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bounds"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "label"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "attention"
            }
          ],
          "path": "spectralbridge.bulk.reporting._metric_card",
          "signature": "_metric_card(figure: Any, bounds: tuple[float, float, float, float], label: str, value: str, *, attention: bool=False) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render a one-page population QA dashboard from machine-readable metrics.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.reporting.render_bulk_summary_dashboard"
          ],
          "kind": "function",
          "line": 80,
          "methods": [],
          "name": "render_bulk_summary_dashboard",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "overview"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_stem"
            },
            {
              "annotation": "int",
              "default": "DEFAULT_QA_STYLE.figure_dpi",
              "kind": "keyword-only",
              "name": "figure_dpi"
            }
          ],
          "path": "spectralbridge.bulk.reporting.render_bulk_summary_dashboard",
          "signature": "render_bulk_summary_dashboard(overview: dict[str, Any], *, output_stem: str | Path, figure_dpi: int=DEFAULT_QA_STYLE.figure_dpi) -> dict[str, str]",
          "summary": "Render a one-page population QA dashboard from machine-readable metrics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 184,
          "methods": [],
          "name": "_publication_axes",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "title"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row_count"
            }
          ],
          "path": "spectralbridge.bulk.reporting._publication_axes",
          "signature": "_publication_axes(title: str, row_count: int)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 197,
          "methods": [],
          "name": "_set_pair_axis",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "axis"
            },
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "panel"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "title"
            }
          ],
          "path": "spectralbridge.bulk.reporting._set_pair_axis",
          "signature": "_set_pair_axis(axis: Any, labels: Sequence[str], panel: str, title: str) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render three manuscript-width figures from compact result tables only.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.reporting.render_bulk_publication_figures"
          ],
          "kind": "function",
          "line": 205,
          "methods": [],
          "name": "render_bulk_publication_figures",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "weighting"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "pair_summaries"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "flightline"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "site"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "loso"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_dir"
            },
            {
              "annotation": "int",
              "default": "DEFAULT_QA_STYLE.figure_dpi",
              "kind": "keyword-only",
              "name": "figure_dpi"
            }
          ],
          "path": "spectralbridge.bulk.reporting.render_bulk_publication_figures",
          "signature": "render_bulk_publication_figures(*, weighting: Sequence[dict[str, Any]], pair_summaries: Sequence[dict[str, Any]], flightline: Sequence[dict[str, Any]], site: Sequence[dict[str, Any]], loso: Sequence[dict[str, Any]], output_dir: str | Path, figure_dpi: int=DEFAULT_QA_STYLE.figure_dpi) -> dict[str, dict[str, str]]",
          "summary": "Render three manuscript-width figures from compact result tables only.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Assemble a self-contained PDF from already-computed compact QA outputs.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.reporting.render_bulk_pdf_report"
          ],
          "kind": "function",
          "line": 286,
          "methods": [],
          "name": "render_bulk_pdf_report",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "summary_png"
            },
            {
              "annotation": "dict[str, dict[str, str]]",
              "default": null,
              "kind": "keyword-only",
              "name": "publication_figures"
            },
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "keyword-only",
              "name": "diagnostic_figures"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "overview"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "flags"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_pdf"
            }
          ],
          "path": "spectralbridge.bulk.reporting.render_bulk_pdf_report",
          "signature": "render_bulk_pdf_report(*, summary_png: str | Path, publication_figures: dict[str, dict[str, str]], diagnostic_figures: Sequence[str], overview: dict[str, Any], flags: Sequence[dict[str, Any]], output_pdf: str | Path) -> Path",
          "summary": "Assemble a self-contained PDF from already-computed compact QA outputs.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/reporting.py",
      "sha256": "ea9325dde7ad07d242c81ef260414daad0fd557f9b008844dee42b56d2b38413"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "BULK_RESULTS_SCHEMA_VERSION",
          "value": "3"
        }
      ],
      "declared_exports": [
        "BULK_RESULTS_SCHEMA_VERSION",
        "BulkResultsConfig",
        "BulkResultsPaths",
        "summarize_bulk_results"
      ],
      "docstring": "Interpret completed bulk translations from compact result tables only.",
      "export_expressions": [
        "__all__ = ['BULK_RESULTS_SCHEMA_VERSION', 'BulkResultsConfig', 'BulkResultsPaths', 'summarize_bulk_results']"
      ],
      "imports": {
        "Any": "typing.Any",
        "DEFAULT_QA_STYLE": "spectralbridge.qa_style.DEFAULT_QA_STYLE",
        "Figure": "matplotlib.figure.Figure",
        "Iterable": "typing.Iterable",
        "Path": "pathlib.Path",
        "SPECTRAL_IDENTITY_ORDER": "spectralbridge.sensor_pairs.SPECTRAL_IDENTITY_ORDER",
        "Sequence": "typing.Sequence",
        "__version__": "spectralbridge.__version__",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "datetime": "datetime.datetime",
        "render_bulk_pdf_report": "spectralbridge.bulk.reporting.render_bulk_pdf_report",
        "render_bulk_publication_figures": "spectralbridge.bulk.reporting.render_bulk_publication_figures",
        "render_bulk_summary_dashboard": "spectralbridge.bulk.reporting.render_bulk_summary_dashboard",
        "sensor_band_identity": "spectralbridge.sensor_pairs.sensor_band_identity",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "timezone": "datetime.timezone",
        "wavelength_pair_label": "spectralbridge.qa_style.wavelength_pair_label",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic",
        "write_text_atomic": "spectralbridge.bulk.provenance.write_text_atomic"
      },
      "module": "spectralbridge.bulk.results",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "float | None",
              "default": "None",
              "name": "representative_source_value"
            },
            {
              "annotation": "float",
              "default": "0.9",
              "name": "r2_review_threshold"
            },
            {
              "annotation": "float",
              "default": "20.0",
              "name": "absolute_correction_review_threshold_pct"
            },
            {
              "annotation": "float",
              "default": "0.05",
              "name": "weighting_slope_spread_review_threshold"
            },
            {
              "annotation": "float",
              "default": "0.05",
              "name": "flightline_slope_iqr_review_threshold"
            },
            {
              "annotation": "float",
              "default": "0.05",
              "name": "site_slope_range_review_threshold"
            },
            {
              "annotation": "float",
              "default": "0.8",
              "name": "loso_r2_review_threshold"
            },
            {
              "annotation": "float",
              "default": "1e-08",
              "name": "correction_denominator_floor"
            },
            {
              "annotation": "int",
              "default": "150",
              "name": "figure_dpi"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Configurable review criteria for compact bulk translation results.\n\nThresholds are report-screening defaults, not scientific acceptance\ncriteria. A result that triggers no warning is not automatically approved\nfor universal calibration or extrapolation beyond the evaluated domain.\n\nAttributes\n----------\nrepresentative_source_value : float | None, default=None\n    Source reflectance value at which relative correction magnitude is reported; use the same reflectance units as the fitted coefficients.\nr2_review_threshold : float, default=0.9\n    R-squared screening threshold for descriptive/held-site attention flags; not a universal acceptance criterion.\nabsolute_correction_review_threshold_pct : float, default=20.0\n    Absolute predicted correction review bound in percent at representative_source_value.\nweighting_slope_spread_review_threshold : float, default=0.05\n    Dimensionless slope heterogeneity screening threshold for weighting, flightline or site comparisons; flags require scientific interpretation.\nflightline_slope_iqr_review_threshold : float, default=0.05\n    Dimensionless slope heterogeneity screening threshold for weighting, flightline or site comparisons; flags require scientific interpretation.\nsite_slope_range_review_threshold : float, default=0.05\n    Dimensionless slope heterogeneity screening threshold for weighting, flightline or site comparisons; flags require scientific interpretation.\nloso_r2_review_threshold : float, default=0.8\n    R-squared screening threshold for descriptive/held-site attention flags; not a universal acceptance criterion.\ncorrection_denominator_floor : float, default=1e-08\n    Positive denominator floor in reflectance units used to avoid unstable relative correction percentages near zero.\nfigure_dpi : int, default=150\n    Positive output rendering resolution in dots per inch; rasterization controls file size without changing analytical summaries.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.BulkResultsConfig",
            "spectralbridge.bulk.results.BulkResultsConfig"
          ],
          "kind": "class",
          "line": 53,
          "methods": [
            {
              "docstring": "Validate configuration ranges and supported option combinations.\n\nReturns\n-------\nNone\n    No return value; validation raises on unsupported configuration and directory creation persists the canonical hierarchy.\n\nRaises\n------\nValueError\n    If option values violate the configuration or relationship-selection contract.",
              "line": 92,
              "name": "validate",
              "parameters": [],
              "private": false,
              "signature": "validate(self) -> None"
            }
          ],
          "name": "BulkResultsConfig",
          "parameters": [],
          "path": "spectralbridge.bulk.results.BulkResultsConfig",
          "signature": null,
          "summary": "Configurable review criteria for compact bulk translation results.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "bulk_output"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Canonical compact inputs and interpretation outputs for one bulk run.\n\nAttributes\n----------\nbulk_output : Path\n    Root of an existing completed bulk run, containing its manifest and compact model tables.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.BulkResultsPaths",
            "spectralbridge.bulk.results.BulkResultsPaths"
          ],
          "kind": "class",
          "line": 142,
          "methods": [
            {
              "docstring": "",
              "line": 153,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "Resolve the canonical manifest location.\n\nReturns\n-------\nPath\n    Path computed as ``self.bulk_output / 'catalog' / 'bulk_manifest.json'``. Accessing this property does not create or validate the artifact.",
              "line": 157,
              "name": "manifest",
              "parameters": [],
              "private": false,
              "signature": "manifest(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical candidates location.\n\nReturns\n-------\nPath\n    Path computed as ``self.bulk_output / 'coefficients' / 'candidate_translation_coefficients.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 169,
              "name": "candidates",
              "parameters": [],
              "private": false,
              "signature": "candidates(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical per flightline location.\n\nReturns\n-------\nPath\n    Path computed as ``self.bulk_output / 'analyses' / 'sensor_translation' / 'per_flightline.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 181,
              "name": "per_flightline",
              "parameters": [],
              "private": false,
              "signature": "per_flightline(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical per site location.\n\nReturns\n-------\nPath\n    Path computed as ``self.bulk_output / 'analyses' / 'sensor_translation' / 'per_site.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 193,
              "name": "per_site",
              "parameters": [],
              "private": false,
              "signature": "per_site(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical loso location.\n\nReturns\n-------\nPath\n    Path computed as ``self.bulk_output / 'analyses' / 'leave_one_site_out' / 'leave_one_site_out.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 205,
              "name": "loso",
              "parameters": [],
              "private": false,
              "signature": "loso(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical analysis dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.bulk_output / 'analyses' / 'bulk_results'``. Accessing this property does not create or validate the artifact.",
              "line": 217,
              "name": "analysis_dir",
              "parameters": [],
              "private": false,
              "signature": "analysis_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical figures dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.bulk_output / 'figures' / 'bulk_results'``. Accessing this property does not create or validate the artifact.",
              "line": 229,
              "name": "figures_dir",
              "parameters": [],
              "private": false,
              "signature": "figures_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical diagnostics dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.figures_dir / 'diagnostics'``. Accessing this property does not create or validate the artifact.",
              "line": 241,
              "name": "diagnostics_dir",
              "parameters": [],
              "private": false,
              "signature": "diagnostics_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical publication dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.figures_dir / 'publication'``. Accessing this property does not create or validate the artifact.",
              "line": 253,
              "name": "publication_dir",
              "parameters": [],
              "private": false,
              "signature": "publication_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical summary dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.figures_dir / 'summary'``. Accessing this property does not create or validate the artifact.",
              "line": 265,
              "name": "summary_dir",
              "parameters": [],
              "private": false,
              "signature": "summary_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical report dir location.\n\nReturns\n-------\nPath\n    Path computed as ``self.bulk_output / 'reports' / 'bulk_results'``. Accessing this property does not create or validate the artifact.",
              "line": 277,
              "name": "report_dir",
              "parameters": [],
              "private": false,
              "signature": "report_dir(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical pair band summary location.\n\nReturns\n-------\nPath\n    Path computed as ``self.analysis_dir / 'pair_band_summary.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 289,
              "name": "pair_band_summary",
              "parameters": [],
              "private": false,
              "signature": "pair_band_summary(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical weighting comparison location.\n\nReturns\n-------\nPath\n    Path computed as ``self.analysis_dir / 'weighting_comparison.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 301,
              "name": "weighting_comparison",
              "parameters": [],
              "private": false,
              "signature": "weighting_comparison(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical flightline stability location.\n\nReturns\n-------\nPath\n    Path computed as ``self.analysis_dir / 'flightline_stability.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 313,
              "name": "flightline_stability",
              "parameters": [],
              "private": false,
              "signature": "flightline_stability(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical site stability location.\n\nReturns\n-------\nPath\n    Path computed as ``self.analysis_dir / 'site_stability.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 325,
              "name": "site_stability",
              "parameters": [],
              "private": false,
              "signature": "site_stability(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical loso transferability location.\n\nReturns\n-------\nPath\n    Path computed as ``self.analysis_dir / 'loso_transferability.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 337,
              "name": "loso_transferability",
              "parameters": [],
              "private": false,
              "signature": "loso_transferability(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical attention flags location.\n\nReturns\n-------\nPath\n    Path computed as ``self.analysis_dir / 'attention_flags.parquet'``. Accessing this property does not create or validate the artifact.",
              "line": 349,
              "name": "attention_flags",
              "parameters": [],
              "private": false,
              "signature": "attention_flags(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical metadata location.\n\nReturns\n-------\nPath\n    Path computed as ``self.analysis_dir / 'bulk_results_summary.json'``. Accessing this property does not create or validate the artifact.",
              "line": 361,
              "name": "metadata",
              "parameters": [],
              "private": false,
              "signature": "metadata(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical coefficient figure location.\n\nReturns\n-------\nPath\n    Path computed as ``self.diagnostics_dir / 'translation_coefficients_and_fit.png'``. Accessing this property does not create or validate the artifact.",
              "line": 373,
              "name": "coefficient_figure",
              "parameters": [],
              "private": false,
              "signature": "coefficient_figure(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical correction figure location.\n\nReturns\n-------\nPath\n    Path computed as ``self.diagnostics_dir / 'fitted_correction_magnitude.png'``. Accessing this property does not create or validate the artifact.",
              "line": 385,
              "name": "correction_figure",
              "parameters": [],
              "private": false,
              "signature": "correction_figure(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical transferability figure location.\n\nReturns\n-------\nPath\n    Path computed as ``self.diagnostics_dir / 'stability_and_transferability.png'``. Accessing this property does not create or validate the artifact.",
              "line": 397,
              "name": "transferability_figure",
              "parameters": [],
              "private": false,
              "signature": "transferability_figure(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical summary figure stem location.\n\nReturns\n-------\nPath\n    Path computed as ``self.summary_dir / 'bulk_qa_summary'``. Accessing this property does not create or validate the artifact.",
              "line": 409,
              "name": "summary_figure_stem",
              "parameters": [],
              "private": false,
              "signature": "summary_figure_stem(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical publication stems location.\n\nReturns\n-------\ntuple[Path, ...]\n    Path computed as ``tuple((self.publication_dir / name for name in ('translation_performance', 'translation_stability', 'generalization_and_failures')))``. Accessing this property does not create or validate the artifact.",
              "line": 421,
              "name": "publication_stems",
              "parameters": [],
              "private": false,
              "signature": "publication_stems(self) -> tuple[Path, ...]"
            },
            {
              "docstring": "Resolve the canonical report location.\n\nReturns\n-------\nPath\n    Path computed as ``self.report_dir / 'bulk_translation_results.md'``. Accessing this property does not create or validate the artifact.",
              "line": 440,
              "name": "report",
              "parameters": [],
              "private": false,
              "signature": "report(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical report pdf location.\n\nReturns\n-------\nPath\n    Path computed as ``self.report_dir / 'bulk_translation_results.pdf'``. Accessing this property does not create or validate the artifact.",
              "line": 452,
              "name": "report_pdf",
              "parameters": [],
              "private": false,
              "signature": "report_pdf(self) -> Path"
            },
            {
              "docstring": "Resolve the canonical required inputs location.\n\nReturns\n-------\ntuple[Path, ...]\n    Path computed as ``(self.manifest, self.candidates, self.per_flightline, self.per_site, self.loso)``. Accessing this property does not create or validate the artifact.",
              "line": 464,
              "name": "required_inputs",
              "parameters": [],
              "private": false,
              "signature": "required_inputs(self) -> tuple[Path, ...]"
            }
          ],
          "name": "BulkResultsPaths",
          "parameters": [],
          "path": "spectralbridge.bulk.results.BulkResultsPaths",
          "signature": null,
          "summary": "Canonical compact inputs and interpretation outputs for one bulk run.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 662,
          "methods": [],
          "name": "_finite",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.results._finite",
          "signature": "_finite(value: Any) -> float | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 672,
          "methods": [],
          "name": "_integer",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.results._integer",
          "signature": "_integer(value: Any) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 679,
          "methods": [],
          "name": "_key",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.bulk.results._key",
          "signature": "_key(row: dict[str, Any]) -> tuple[str, int]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 683,
          "methods": [],
          "name": "_identity",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.bulk.results._identity",
          "signature": "_identity(row: dict[str, Any]) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Resolve physical band identity without treating band numbers as global.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 694,
          "methods": [],
          "name": "_band_match_context",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.bulk.results._band_match_context",
          "signature": "_band_match_context(row: dict[str, Any]) -> dict[str, Any]",
          "summary": "Resolve physical band identity without treating band numbers as global.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 729,
          "methods": [],
          "name": "_band_sort_key",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.bulk.results._band_sort_key",
          "signature": "_band_sort_key(row: dict[str, Any]) -> tuple[Any, ...]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 745,
          "methods": [],
          "name": "_report_band_label",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.bulk.results._report_band_label",
          "signature": "_report_band_label(row: dict[str, Any]) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 762,
          "methods": [],
          "name": "_plot_band_label",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.bulk.results._plot_band_label",
          "signature": "_plot_band_label(row: dict[str, Any]) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 768,
          "methods": [],
          "name": "_read_compact",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "label"
            }
          ],
          "path": "spectralbridge.bulk.results._read_compact",
          "signature": "_read_compact(path: Path, label: str) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 783,
          "methods": [],
          "name": "_file_signature",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.bulk.results._file_signature",
          "signature": "_file_signature(path: Path) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/run_neon_pipeline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 797,
          "methods": [],
          "name": "_group",
          "parameters": [
            {
              "annotation": "Iterable[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            }
          ],
          "path": "spectralbridge.bulk.results._group",
          "signature": "_group(rows: Iterable[dict[str, Any]]) -> dict[tuple[str, int], list[dict[str, Any]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/release_candidate_smoke.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 804,
          "methods": [],
          "name": "_distribution",
          "parameters": [
            {
              "annotation": "Iterable[Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.bulk.results._distribution",
          "signature": "_distribution(values: Iterable[Any]) -> dict[str, float | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 833,
          "methods": [],
          "name": "_worst_r2",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identity_field"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "r2_field"
            }
          ],
          "path": "spectralbridge.bulk.results._worst_r2",
          "signature": "_worst_r2(rows: Sequence[dict[str, Any]], identity_field: str, r2_field: str) -> tuple[str | None, float | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 849,
          "methods": [],
          "name": "_summarize_stability",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "identity_field"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "r2_threshold"
            }
          ],
          "path": "spectralbridge.bulk.results._summarize_stability",
          "signature": "_summarize_stability(rows: Sequence[dict[str, Any]], *, identity_field: str, r2_threshold: float) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 892,
          "methods": [],
          "name": "_summarize_loso",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "BulkResultsConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.results._summarize_loso",
          "signature": "_summarize_loso(rows: Sequence[dict[str, Any]], config: BulkResultsConfig) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 936,
          "methods": [],
          "name": "_representative_value",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "BulkResultsConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.results._representative_value",
          "signature": "_representative_value(rows: Sequence[dict[str, Any]], config: BulkResultsConfig) -> tuple[float | None, str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 953,
          "methods": [],
          "name": "_weighting_rows",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "candidates"
            },
            {
              "annotation": "BulkResultsConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.results._weighting_rows",
          "signature": "_weighting_rows(candidates: Sequence[dict[str, Any]], config: BulkResultsConfig) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1006,
          "methods": [],
          "name": "_flag",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "template"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scope"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metric"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "threshold"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparison"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "detail"
            }
          ],
          "path": "spectralbridge.bulk.results._flag",
          "signature": "_flag(template: dict[str, Any], code: str, scope: str, metric: str, value: float, threshold: float, comparison: str, detail: str) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1033,
          "methods": [],
          "name": "_build_pair_summaries",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "weighting"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "site"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "loso"
            },
            {
              "annotation": "BulkResultsConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.results._build_pair_summaries",
          "signature": "_build_pair_summaries(weighting: Sequence[dict[str, Any]], flightline: Sequence[dict[str, Any]], site: Sequence[dict[str, Any]], loso: Sequence[dict[str, Any]], config: BulkResultsConfig) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1346,
          "methods": [],
          "name": "_write_parquet",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "pa.Schema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            }
          ],
          "path": "spectralbridge.bulk.results._write_parquet",
          "signature": "_write_parquet(path: Path, rows: Sequence[dict[str, Any]], schema: pa.Schema) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1357,
          "methods": [],
          "name": "_overview",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "manifest"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "weighting"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pair_summaries"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_rows"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "site_rows"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "loso_rows"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flags"
            }
          ],
          "path": "spectralbridge.bulk.results._overview",
          "signature": "_overview(manifest: dict[str, Any], weighting: Sequence[dict[str, Any]], pair_summaries: Sequence[dict[str, Any]], flightline_rows: Sequence[dict[str, Any]], site_rows: Sequence[dict[str, Any]], loso_rows: Sequence[dict[str, Any]], flags: Sequence[dict[str, Any]]) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/manuscript_synthesis/build_figure.py",
            "examples/publication_figures/figure_panels.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 1459,
          "methods": [],
          "name": "_format",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "int",
              "default": "4",
              "kind": "positional-or-keyword",
              "name": "digits"
            }
          ],
          "path": "spectralbridge.bulk.results._format",
          "signature": "_format(value: Any, digits: int=4) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1464,
          "methods": [],
          "name": "_labels",
          "parameters": [
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            }
          ],
          "path": "spectralbridge.bulk.results._labels",
          "signature": "_labels(rows: Sequence[dict[str, Any]]) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a finite plotting value or NaN for a visible missing-data gap.",
          "examples": [
            "examples/manuscript_synthesis/figure_data.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 1468,
          "methods": [],
          "name": "_plot_value",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.bulk.results._plot_value",
          "signature": "_plot_value(value: Any) -> float",
          "summary": "Return a finite plotting value or NaN for a visible missing-data gap.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1475,
          "methods": [],
          "name": "_save_figure",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "figure"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dpi"
            }
          ],
          "path": "spectralbridge.bulk.results._save_figure",
          "signature": "_save_figure(figure: Any, path: Path, dpi: int) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1485,
          "methods": [],
          "name": "_make_figures",
          "parameters": [
            {
              "annotation": "BulkResultsPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "weighting"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pair_summaries"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "site"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "loso"
            },
            {
              "annotation": "BulkResultsConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.bulk.results._make_figures",
          "signature": "_make_figures(paths: BulkResultsPaths, weighting: Sequence[dict[str, Any]], pair_summaries: Sequence[dict[str, Any]], flightline: Sequence[dict[str, Any]], site: Sequence[dict[str, Any]], loso: Sequence[dict[str, Any]], config: BulkResultsConfig) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1665,
          "methods": [],
          "name": "_markdown_report",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "overview"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pair_summaries"
            },
            {
              "annotation": "Sequence[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flags"
            },
            {
              "annotation": "BulkResultsConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "figure_paths"
            }
          ],
          "path": "spectralbridge.bulk.results._markdown_report",
          "signature": "_markdown_report(overview: dict[str, Any], pair_summaries: Sequence[dict[str, Any]], flags: Sequence[dict[str, Any]], config: BulkResultsConfig, figure_paths: Sequence[str]) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1768,
          "methods": [],
          "name": "_outputs_valid",
          "parameters": [
            {
              "annotation": "BulkResultsPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "make_figures"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "make_report"
            }
          ],
          "path": "spectralbridge.bulk.results._outputs_valid",
          "signature": "_outputs_valid(paths: BulkResultsPaths, *, make_figures: bool, make_report: bool) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Summarize completed translation results without the source archive.\n\nParameters\n----------\nbulk_output : str | Path\n    Root of an existing completed bulk run, containing its manifest and compact model tables.\nconfig : BulkResultsConfig | None, default=None\n    Configuration object for this workflow; None selects the documented defaults of its configuration class.\nmake_figures : bool, default=True\n    Render interpretation figures from completed compact results.\nmake_report : bool, default=True\n    Write the human-readable interpretation report alongside machine-readable summaries.\nforce : bool, default=False\n    Regenerate the requested outputs instead of reusing an otherwise valid checkpoint or report.\n\nReturns\n-------\ndict[str, Any]\n    Created/reused interpretation metadata, attention flags, compact summaries and enabled figure/report paths.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nOnly the completed bulk manifest and compact model-result Parquets are read.\nSource rasters, sufficient-statistics checkpoints, diagnostic pixel samples,\nand observation datasets are neither required nor opened.\n\nSee Also\n--------\nspectralbridge.pipelines.bulk.run_bulk_pipeline : Related source-derived API contract.\n\nExamples\n--------\nUse the directory returned by a completed bulk run; original rasters are not needed.\n\n>>> from spectralbridge import summarize_bulk_results\n>>> result = summarize_bulk_results(completed_bulk_dir, make_figures=False)  # doctest: +SKIP",
          "examples": [
            "examples/release_candidate_smoke.py"
          ],
          "exports": [
            "spectralbridge.summarize_bulk_results",
            "spectralbridge.bulk.summarize_bulk_results",
            "spectralbridge.bulk.results.summarize_bulk_results"
          ],
          "kind": "function",
          "line": 1809,
          "methods": [],
          "name": "summarize_bulk_results",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bulk_output"
            },
            {
              "annotation": "BulkResultsConfig | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "make_figures"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "make_report"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "force"
            }
          ],
          "path": "spectralbridge.bulk.results.summarize_bulk_results",
          "signature": "summarize_bulk_results(bulk_output: str | Path, *, config: BulkResultsConfig | None=None, make_figures: bool=True, make_report: bool=True, force: bool=False) -> dict[str, Any]",
          "summary": "Summarize completed translation results without the source archive.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/bulk/results.py",
      "sha256": "16648cf423ad89b43308e7b5d33dbfd6b85fcbcddb9ffcf937b7533876d6fc45"
    },
    {
      "area": "bulk",
      "constants": [
        {
          "annotation": null,
          "name": "STATISTICS_SCHEMA_VERSION",
          "value": "1"
        }
      ],
      "declared_exports": [
        "BivariateStatistics",
        "PairBand",
        "STATISTICS_SCHEMA_VERSION",
        "compute_flightline_statistics",
        "iter_aligned_pair_chunks",
        "pair_bands",
        "write_diagnostic_sample",
        "write_statistics"
      ],
      "docstring": "Bounded, restart-safe statistics over immutable ENVI flightline products.",
      "export_expressions": [
        "__all__ = ['STATISTICS_SCHEMA_VERSION', 'BivariateStatistics', 'PairBand', 'compute_flightline_statistics', 'iter_aligned_pair_chunks', 'pair_bands', 'write_diagnostic_sample', 'write_statistics']"
      ],
      "imports": {
        "Any": "typing.Any",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "ExitStack": "contextlib.ExitStack",
        "FlightlineRecord": "spectralbridge.bulk.models.FlightlineRecord",
        "Iterator": "typing.Iterator",
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "Window": "rasterio.windows.Window",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "canonical_json": "spectralbridge.bulk.provenance.canonical_json",
        "dataclass": "dataclasses.dataclass",
        "replace": "dataclasses.replace",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.bulk.streaming",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "int",
              "default": "0",
              "name": "n"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "name": "mean_x"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "name": "mean_y"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "name": "m2_x"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "name": "m2_y"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "name": "c_xy"
            },
            {
              "annotation": "float",
              "default": "math.inf",
              "name": "x_min"
            },
            {
              "annotation": "float",
              "default": "-math.inf",
              "name": "x_max"
            },
            {
              "annotation": "float",
              "default": "math.inf",
              "name": "y_min"
            },
            {
              "annotation": "float",
              "default": "-math.inf",
              "name": "y_max"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Numerically stable, mergeable bivariate population moments.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.streaming.BivariateStatistics"
          ],
          "kind": "class",
          "line": 28,
          "methods": [
            {
              "docstring": "",
              "line": 42,
              "name": "update",
              "parameters": [
                {
                  "annotation": "np.ndarray",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "x"
                },
                {
                  "annotation": "np.ndarray",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "y"
                }
              ],
              "private": false,
              "signature": "update(self, x: np.ndarray, y: np.ndarray) -> None"
            },
            {
              "docstring": "",
              "line": 68,
              "name": "merge",
              "parameters": [
                {
                  "annotation": "BivariateStatistics",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "other"
                }
              ],
              "private": false,
              "signature": "merge(self, other: BivariateStatistics) -> BivariateStatistics"
            },
            {
              "docstring": "Return the stable inverse merge ``self - other`` for LOSO fitting.",
              "line": 91,
              "name": "subtract",
              "parameters": [
                {
                  "annotation": "BivariateStatistics",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "other"
                }
              ],
              "private": false,
              "signature": "subtract(self, other: BivariateStatistics) -> BivariateStatistics"
            },
            {
              "docstring": "",
              "line": 113,
              "name": "copy",
              "parameters": [],
              "private": false,
              "signature": "copy(self) -> BivariateStatistics"
            },
            {
              "docstring": "",
              "line": 117,
              "name": "sum_x",
              "parameters": [],
              "private": false,
              "signature": "sum_x(self) -> float"
            },
            {
              "docstring": "",
              "line": 121,
              "name": "sum_y",
              "parameters": [],
              "private": false,
              "signature": "sum_y(self) -> float"
            },
            {
              "docstring": "",
              "line": 125,
              "name": "sum_x2",
              "parameters": [],
              "private": false,
              "signature": "sum_x2(self) -> float"
            },
            {
              "docstring": "",
              "line": 129,
              "name": "sum_y2",
              "parameters": [],
              "private": false,
              "signature": "sum_y2(self) -> float"
            },
            {
              "docstring": "",
              "line": 133,
              "name": "sum_xy",
              "parameters": [],
              "private": false,
              "signature": "sum_xy(self) -> float"
            },
            {
              "docstring": "",
              "line": 137,
              "name": "from_row",
              "parameters": [
                {
                  "annotation": "dict[str, Any]",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "row"
                }
              ],
              "private": false,
              "signature": "from_row(cls, row: dict[str, Any]) -> BivariateStatistics"
            }
          ],
          "name": "BivariateStatistics",
          "parameters": [],
          "path": "spectralbridge.bulk.streaming.BivariateStatistics",
          "signature": null,
          "summary": "Numerically stable, mergeable bivariate population moments.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "translation_pair"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "target_sensor"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "band_index"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "source_band_index"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "target_band_index"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Record a one-based source/target band relationship for streamed sufficient statistics.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.streaming.PairBand"
          ],
          "kind": "class",
          "line": 153,
          "methods": [
            {
              "docstring": "",
              "line": 164,
              "name": "x_column",
              "parameters": [],
              "private": false,
              "signature": "x_column(self) -> str"
            },
            {
              "docstring": "",
              "line": 168,
              "name": "y_column",
              "parameters": [],
              "private": false,
              "signature": "y_column(self) -> str"
            }
          ],
          "name": "PairBand",
          "parameters": [],
          "path": "spectralbridge.bulk.streaming.PairBand",
          "signature": null,
          "summary": "Record a one-based source/target band relationship for streamed sufficient statistics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Expand registered translation pairs into ordered band-level statistics specifications.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.streaming.pair_bands"
          ],
          "kind": "function",
          "line": 172,
          "methods": [],
          "name": "pair_bands",
          "parameters": [
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pairs"
            }
          ],
          "path": "spectralbridge.bulk.streaming.pair_bands",
          "signature": "pair_bands(pairs: Sequence[TranslationPair]) -> tuple[PairBand, ...]",
          "summary": "Expand registered translation pairs into ordered band-level statistics specifications.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 195,
          "methods": [],
          "name": "_valid_sensor_mask",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": "float | int | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "nodata"
            }
          ],
          "path": "spectralbridge.bulk.streaming._valid_sensor_mask",
          "signature": "_valid_sensor_mask(values: np.ndarray, nodata: float | int | None) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read all requested sensors together and yield aligned, valid pair arrays.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.streaming.iter_aligned_pair_chunks"
          ],
          "kind": "function",
          "line": 202,
          "methods": [],
          "name": "iter_aligned_pair_chunks",
          "parameters": [
            {
              "annotation": "FlightlineRecord",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "translation_pairs"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            }
          ],
          "path": "spectralbridge.bulk.streaming.iter_aligned_pair_chunks",
          "signature": "iter_aligned_pair_chunks(flightline: FlightlineRecord, translation_pairs: Sequence[TranslationPair], *, chunk_size: int, minimum_reflectance: float) -> Iterator[tuple[int, dict[PairBand, tuple[np.ndarray, np.ndarray, np.ndarray]]]]",
          "summary": "Read all requested sensors together and yield aligned, valid pair arrays.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 321,
          "methods": [],
          "name": "_write_parquet_atomic",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "pa.Schema",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "schema"
            }
          ],
          "path": "spectralbridge.bulk.streaming._write_parquet_atomic",
          "signature": "_write_parquet_atomic(path: Path, rows: list[dict[str, Any]], schema: pa.Schema) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Atomically write compact sufficient-statistics rows using the fixed statistics schema.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.streaming.write_statistics"
          ],
          "kind": "function",
          "line": 331,
          "methods": [],
          "name": "write_statistics",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            }
          ],
          "path": "spectralbridge.bulk.streaming.write_statistics",
          "signature": "write_statistics(path: Path, rows: list[dict[str, Any]]) -> None",
          "summary": "Atomically write compact sufficient-statistics rows using the fixed statistics schema.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Atomically write the explicitly requested diagnostic pixel sample using its fixed schema.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.streaming.write_diagnostic_sample"
          ],
          "kind": "function",
          "line": 337,
          "methods": [],
          "name": "write_diagnostic_sample",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            }
          ],
          "path": "spectralbridge.bulk.streaming.write_diagnostic_sample",
          "signature": "write_diagnostic_sample(path: Path, rows: list[dict[str, Any]]) -> None",
          "summary": "Atomically write the explicitly requested diagnostic pixel sample using its fixed schema.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return deterministic random priorities without hashing every pixel in Python.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 343,
          "methods": [],
          "name": "_sample_priorities",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "seed"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_id"
            },
            {
              "annotation": "PairBand",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spec"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "chunk_index"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "count"
            }
          ],
          "path": "spectralbridge.bulk.streaming._sample_priorities",
          "signature": "_sample_priorities(seed: int, flightline_id: str, spec: PairBand, chunk_index: int, count: int) -> np.ndarray",
          "summary": "Return deterministic random priorities without hashing every pixel in Python.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Create or reuse one compact per-flightline analytical checkpoint.",
          "examples": [],
          "exports": [
            "spectralbridge.bulk.streaming.compute_flightline_statistics"
          ],
          "kind": "function",
          "line": 365,
          "methods": [],
          "name": "compute_flightline_statistics",
          "parameters": [
            {
              "annotation": "FlightlineRecord",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            },
            {
              "annotation": "Sequence[TranslationPair]",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "int",
              "default": "0",
              "kind": "keyword-only",
              "name": "diagnostic_sample_size"
            },
            {
              "annotation": "int",
              "default": "0",
              "kind": "keyword-only",
              "name": "diagnostic_seed"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "force"
            }
          ],
          "path": "spectralbridge.bulk.streaming.compute_flightline_statistics",
          "signature": "compute_flightline_statistics(flightline: FlightlineRecord, paths: BulkAnalysisPaths, *, chunk_size: int, minimum_reflectance: float, translation_pairs: Sequence[TranslationPair], diagnostic_sample_size: int=0, diagnostic_seed: int=0, force: bool=False) -> tuple[list[dict[str, Any]], list[dict[str, Any]], FlightlineRecord]",
          "summary": "Create or reuse one compact per-flightline analytical checkpoint.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 570,
          "methods": [],
          "name": "_spectralbridge_version",
          "parameters": [],
          "path": "spectralbridge.bulk.streaming._spectralbridge_version",
          "signature": "_spectralbridge_version() -> str",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/bulk/streaming.py",
      "sha256": "58ee47771798e1f7503d8b646172c7c33d511dd8d0346e8c26080f90ebce4280"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "download_main",
        "pipeline_main",
        "qa_main",
        "warn_if_legacy_command"
      ],
      "docstring": "CLI entry points exposed for backwards compatibility.",
      "export_expressions": [
        "__all__ = ['download_main', 'pipeline_main', 'qa_main', 'warn_if_legacy_command']"
      ],
      "imports": {
        "NoReturn": "typing.NoReturn",
        "annotations": "__future__.annotations",
        "pipeline_cli_main": "spectralbridge.cli.pipeline_cli.main",
        "qa_cli_main": "spectralbridge.cli.qa_cli.main",
        "run_download": "spectralbridge.pipelines.download.run_download",
        "warn_if_legacy_command": "spectralbridge._cli_compat.warn_if_legacy_command"
      },
      "module": "spectralbridge.cli",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 15,
          "methods": [],
          "name": "_die",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "msg"
            },
            {
              "annotation": "int",
              "default": "2",
              "kind": "positional-or-keyword",
              "name": "code"
            }
          ],
          "path": "spectralbridge.cli._die",
          "signature": "_die(msg: str, code: int=2) -> NoReturn",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Entry point for the download helper CLI.",
          "examples": [],
          "exports": [
            "spectralbridge.cli.download_main"
          ],
          "kind": "function",
          "line": 20,
          "methods": [],
          "name": "download_main",
          "parameters": [
            {
              "annotation": "list[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.download_main",
          "signature": "download_main(argv: list[str] | None=None) -> None",
          "summary": "Entry point for the download helper CLI.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Backward compatible wrapper around :mod:`pipeline_cli`.",
          "examples": [],
          "exports": [
            "spectralbridge.cli.pipeline_main"
          ],
          "kind": "function",
          "line": 36,
          "methods": [],
          "name": "pipeline_main",
          "parameters": [
            {
              "annotation": "list[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.pipeline_main",
          "signature": "pipeline_main(argv: list[str] | None=None) -> None",
          "summary": "Backward compatible wrapper around :mod:`pipeline_cli`.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Backward compatible wrapper around :mod:`qa_cli`.",
          "examples": [],
          "exports": [
            "spectralbridge.cli.qa_main"
          ],
          "kind": "function",
          "line": 43,
          "methods": [],
          "name": "qa_main",
          "parameters": [
            {
              "annotation": "list[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.qa_main",
          "signature": "qa_main(argv: list[str] | None=None) -> None",
          "summary": "Backward compatible wrapper around :mod:`qa_cli`.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/cli/__init__.py",
      "sha256": "61ce8bf66c60542222dda831d945ef62ace2477babf0e5718cb151f9a151f87d"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "main"
      ],
      "docstring": "Command-line entry point for independent cross-run bulk analysis.",
      "export_expressions": [
        "__all__ = ['main']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "SpectralLibraryPlotConfig": "spectralbridge.bulk.SpectralLibraryPlotConfig",
        "annotations": "__future__.annotations",
        "run_bulk_pipeline": "spectralbridge.pipelines.bulk.run_bulk_pipeline"
      },
      "module": "spectralbridge.cli.bulk_cli",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 14,
          "methods": [],
          "name": "_build_parser",
          "parameters": [],
          "path": "spectralbridge.cli.bulk_cli._build_parser",
          "signature": "_build_parser() -> argparse.ArgumentParser",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.cli.bulk_cli.main"
          ],
          "kind": "function",
          "line": 271,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.bulk_cli.main",
          "signature": "main(argv: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/cli/bulk_cli.py",
      "sha256": "625e59d8f9b9fa21111477366e6fa7ed708cd942bd943652a98a0bf5c5484a9a"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "main"
      ],
      "docstring": "Command-line interface for remote drone campaign production.",
      "export_expressions": [
        "__all__ = ['main']"
      ],
      "imports": {
        "DroneCampaignConfig": "spectralbridge.drone_production.DroneCampaignConfig",
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "inspect_drone_collection": "spectralbridge.drone_production.inspect_drone_collection",
        "run_drone_bulk_production": "spectralbridge.drone_production.run_drone_bulk_production",
        "run_drone_campaign": "spectralbridge.drone_production.run_drone_campaign"
      },
      "module": "spectralbridge.cli.drone_production_cli",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 18,
          "methods": [],
          "name": "_common_campaign_arguments",
          "parameters": [
            {
              "annotation": "argparse.ArgumentParser",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parser"
            }
          ],
          "path": "spectralbridge.cli.drone_production_cli._common_campaign_arguments",
          "signature": "_common_campaign_arguments(parser: argparse.ArgumentParser) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 41,
          "methods": [],
          "name": "_parser",
          "parameters": [],
          "path": "spectralbridge.cli.drone_production_cli._parser",
          "signature": "_parser() -> argparse.ArgumentParser",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 69,
          "methods": [],
          "name": "_config",
          "parameters": [
            {
              "annotation": "argparse.Namespace",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "args"
            }
          ],
          "path": "spectralbridge.cli.drone_production_cli._config",
          "signature": "_config(args: argparse.Namespace) -> DroneCampaignConfig",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.cli.drone_production_cli.main"
          ],
          "kind": "function",
          "line": 80,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.drone_production_cli.main",
          "signature": "main(argv: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/cli/drone_production_cli.py",
      "sha256": "93f657a52baee30324c5e639ca79a7cbcc3a8545ab5edd55e4146690a585d38d"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "main"
      ],
      "docstring": "Command line entry point for the cross-sensor pipeline.",
      "export_expressions": [
        "__all__ = ['main']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "go_forth_and_multiply": "spectralbridge.pipelines.pipeline.go_forth_and_multiply",
        "warn_if_legacy_command": "spectralbridge._cli_compat.warn_if_legacy_command"
      },
      "module": "spectralbridge.cli.pipeline_cli",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 12,
          "methods": [],
          "name": "_build_parser",
          "parameters": [],
          "path": "spectralbridge.cli.pipeline_cli._build_parser",
          "signature": "_build_parser() -> argparse.ArgumentParser",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.cli.pipeline_cli.main"
          ],
          "kind": "function",
          "line": 130,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.pipeline_cli.main",
          "signature": "main(argv: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/cli/pipeline_cli.py",
      "sha256": "85893243a55b4c9c37e53c80b4ba6ca416f1d42fcdfc3b4fb9056fb4da5355c5"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "main"
      ],
      "docstring": "Command line entry point for QA panel generation.",
      "export_expressions": [
        "__all__ = ['main']"
      ],
      "imports": {
        "Iterable": "typing.Iterable",
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "render_flightline_panel": "spectralbridge.qa_plots.render_flightline_panel",
        "warn_if_legacy_command": "spectralbridge._cli_compat.warn_if_legacy_command"
      },
      "module": "spectralbridge.cli.qa_cli",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 14,
          "methods": [],
          "name": "_iter_flightlines",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            }
          ],
          "path": "spectralbridge.cli.qa_cli._iter_flightlines",
          "signature": "_iter_flightlines(base_folder: Path) -> Iterable[Path]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 22,
          "methods": [],
          "name": "_build_parser",
          "parameters": [],
          "path": "spectralbridge.cli.qa_cli._build_parser",
          "signature": "_build_parser() -> argparse.ArgumentParser",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.cli.qa_cli.main"
          ],
          "kind": "function",
          "line": 68,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.qa_cli.main",
          "signature": "main(argv: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/cli/qa_cli.py",
      "sha256": "beeacdef13623e772c173acbd0c65ab47346e1e160ca8c7addb0c794afa9e0f5"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "main"
      ],
      "docstring": "CLI entry point for the aggregate drone QA PDF summary.",
      "export_expressions": [
        "__all__ = ['main']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "build_drone_qa_summary": "spectralbridge.utils.qa_summary.build_drone_qa_summary",
        "warn_if_legacy_command": "spectralbridge._cli_compat.warn_if_legacy_command"
      },
      "module": "spectralbridge.cli.qa_summary_cli",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 13,
          "methods": [],
          "name": "_build_parser",
          "parameters": [],
          "path": "spectralbridge.cli.qa_summary_cli._build_parser",
          "signature": "_build_parser() -> argparse.ArgumentParser",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.cli.qa_summary_cli.main"
          ],
          "kind": "function",
          "line": 36,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.qa_summary_cli.main",
          "signature": "main(argv: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/cli/qa_summary_cli.py",
      "sha256": "070b58884fe98bc684a67a27d7dbba9afab77aeab2c7b57f3bcbc80fd5fa2ade"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "configure_cli_logging": "spectralbridge.logging_utils.configure_cli_logging",
        "stage_export_envi_from_h5": "spectralbridge.pipelines.pipeline.stage_export_envi_from_h5",
        "warn_if_legacy_command": "spectralbridge._cli_compat.warn_if_legacy_command"
      },
      "module": "spectralbridge.cli.recover_cli",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Recover raw ENVI exports when corrected products already exist.",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 13,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.recover_cli.main",
          "signature": "main(argv: Sequence[str] | None=None) -> None",
          "summary": "Recover raw ENVI exports when corrected products already exist.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/cli/recover_cli.py",
      "sha256": "1ffe7c64c478d41c4d9070faa9b58ff7f7b8dc948e1f803c6194e670a2572191"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "main"
      ],
      "docstring": "CLI for deterministic stage-by-stage QA on completed flightlines.",
      "export_expressions": [
        "__all__ = ['main']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "run_completed_flightline_qa": "spectralbridge.qa.runner.run_completed_flightline_qa"
      },
      "module": "spectralbridge.cli.stage_qa_cli",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 12,
          "methods": [],
          "name": "_build_parser",
          "parameters": [],
          "path": "spectralbridge.cli.stage_qa_cli._build_parser",
          "signature": "_build_parser() -> argparse.ArgumentParser",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.cli.stage_qa_cli.main"
          ],
          "kind": "function",
          "line": 27,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.cli.stage_qa_cli.main",
          "signature": "main(argv: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/cli/stage_qa_cli.py",
      "sha256": "2f72a9e844ab590456be8899135e707b237e8d1603053e5a8c6f6c176baf57b6"
    },
    {
      "area": "corrections",
      "constants": [],
      "declared_exports": [
        "apply_brdf_correct",
        "apply_glint_correct",
        "apply_topo_correct",
        "calc_cosine_i",
        "calc_geom_kernel",
        "calc_volume_kernel",
        "fit_and_save_brdf_model",
        "fit_scs_c_coefficients",
        "load_brdf_model"
      ],
      "docstring": "BRDF and topographic correction helpers.\n\nPortions of this module are adapted from HyTools. The incidence-angle, Ross/Li\nkernel, and BRDF fitting/application lineage is detailed in\n``HYTOOLS_PROVENANCE.md``. The SCS+C implementation follows the published method\nof Soenen et al. (2005), DOI 10.1109/TGRS.2005.852480; it is classified\nseparately from the adapted incidence helper.\n\nHyTools: Hyperspectral image processing library\nCopyright (C) 2021 University of Wisconsin\nAuthors named in the relevant source notices: Adam Chlus, Zhiwei Ye, Philip Townsend.\nLicense: GNU General Public License, version 3\nUpstream: https://github.com/EnSpec/hytools\nAudited revision: 31286d64541791a9815d29443a33726fa4d54031\n\nModified and extended for SpectralBridge. See ``LICENSE``, ``NOTICE``, and\n``HYTOOLS_PROVENANCE.md``. The Ross/Li kernel equations are described by Wanner\net al. (1995), DOI 10.1029/95JD02371, and Lucht et al. (2000), DOI\n10.1109/36.841980.",
      "export_expressions": [
        "__all__ = ['calc_cosine_i', 'calc_volume_kernel', 'calc_geom_kernel', 'load_brdf_model', 'fit_and_save_brdf_model', 'fit_scs_c_coefficients', 'apply_topo_correct', 'apply_brdf_correct', 'apply_glint_correct']"
      ],
      "imports": {
        "NeonCube": "spectralbridge.neon_cube.NeonCube",
        "Path": "pathlib.Path",
        "TYPE_CHECKING": "typing.TYPE_CHECKING",
        "Tuple": "typing.Tuple",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "normalize_brdf_model_path": "spectralbridge.paths.normalize_brdf_model_path",
        "scene_prefix_from_dir": "spectralbridge.paths.scene_prefix_from_dir",
        "stored_to_unitless": "spectralbridge.io.neon.stored_to_unitless",
        "unitless_to_stored": "spectralbridge.io.neon.unitless_to_stored"
      },
      "module": "spectralbridge.corrections",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "bool",
              "default": "False",
              "name": "enabled"
            },
            {
              "annotation": "float",
              "default": "0.05",
              "name": "ndvi_min"
            },
            {
              "annotation": "float",
              "default": "1.0",
              "name": "ndvi_max"
            },
            {
              "annotation": "int",
              "default": "25",
              "name": "n_bins"
            },
            {
              "annotation": "float | None",
              "default": "10.0",
              "name": "perc_min"
            },
            {
              "annotation": "float | None",
              "default": "95.0",
              "name": "perc_max"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Configuration for NDVI binning used during BRDF fitting and application.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 58,
          "methods": [],
          "name": "NDVIBinningConfig",
          "parameters": [],
          "path": "spectralbridge.corrections.NDVIBinningConfig",
          "signature": null,
          "summary": "Configuration for NDVI binning used during BRDF fitting and application.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "float",
              "default": "45.0",
              "name": "solar_zenith_deg"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "name": "view_zenith_deg"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "name": "relative_azimuth_deg"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Reference geometry (degrees) for BRDF normalization.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 70,
          "methods": [],
          "name": "ReferenceGeometry",
          "parameters": [],
          "path": "spectralbridge.corrections.ReferenceGeometry",
          "signature": null,
          "summary": "Reference geometry (degrees) for BRDF normalization.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": "'RossThick'",
              "name": "volume_kernel"
            },
            {
              "annotation": "str",
              "default": "'LiSparseReciprocal'",
              "name": "geom_kernel"
            },
            {
              "annotation": "float",
              "default": "1.0",
              "name": "b_r"
            },
            {
              "annotation": "float",
              "default": "2.0",
              "name": "h_b"
            },
            {
              "annotation": "str",
              "default": "'pixel'",
              "name": "solar_zn_type"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Kernel and geometry settings for BRDF fitting/application.\n\nDefaults preserve the streamlined implementation's historical behaviour.\nPipelines that want closer HyTools-style kernel parity should pass an\nexplicit config.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 79,
          "methods": [],
          "name": "BRDFKernelConfig",
          "parameters": [],
          "path": "spectralbridge.corrections.BRDFKernelConfig",
          "signature": null,
          "summary": "Kernel and geometry settings for BRDF fitting/application.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Log min/max and validity fractions for quick debugging.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 103,
          "methods": [],
          "name": "log_stats",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "arr"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "mask"
            }
          ],
          "path": "spectralbridge.corrections.log_stats",
          "signature": "log_stats(name: str, arr: np.ndarray, mask: np.ndarray | None=None) -> None",
          "summary": "Log min/max and validity fractions for quick debugging.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Internal helper applying the SCS+C denominator guard.\n\nDenominators below ``min_denom`` are forced to a neutral ratio of 1.0 to\navoid exploding corrections. Non-finite or non-positive ratios are also\nforced to 1.0 so topographic correction cannot invent negative reflectance\nthat BRDF later collapses to no-data. Caller is responsible for any logging.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 126,
          "methods": [],
          "name": "_scs_c_ratio",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "numerator"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "denominator"
            },
            {
              "annotation": "float",
              "default": "MIN_SCS_C_DENOM",
              "kind": "positional-or-keyword",
              "name": "min_denom"
            }
          ],
          "path": "spectralbridge.corrections._scs_c_ratio",
          "signature": "_scs_c_ratio(numerator: np.ndarray, denominator: np.ndarray, min_denom: float=MIN_SCS_C_DENOM) -> np.ndarray",
          "summary": "Internal helper applying the SCS+C denominator guard.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Load the BRDF model JSON for ``flightline_dir`` after normalizing its name.",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.load_brdf_model"
          ],
          "kind": "function",
          "line": 148,
          "methods": [],
          "name": "load_brdf_model",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            }
          ],
          "path": "spectralbridge.corrections.load_brdf_model",
          "signature": "load_brdf_model(flightline_dir: Path) -> dict",
          "summary": "Load the BRDF model JSON for ``flightline_dir`` after normalizing its name.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Ensure all angle arrays are float32 with matching shapes.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 162,
          "methods": [],
          "name": "_validate_angles",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "variadic-positional",
              "name": "arrays"
            }
          ],
          "path": "spectralbridge.corrections._validate_angles",
          "signature": "_validate_angles(*arrays: np.ndarray) -> Tuple[np.ndarray, ...]",
          "summary": "Ensure all angle arrays are float32 with matching shapes.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the band index closest to ``target_nm``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 182,
          "methods": [],
          "name": "_select_band_for_wavelength",
          "parameters": [
            {
              "annotation": "'NeonCube'",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "target_nm"
            }
          ],
          "path": "spectralbridge.corrections._select_band_for_wavelength",
          "signature": "_select_band_for_wavelength(cube: 'NeonCube', target_nm: float) -> int",
          "summary": "Return the band index closest to ``target_nm``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 189,
          "methods": [],
          "name": "_normalize_volume_kernel_name",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "kernel_type"
            }
          ],
          "path": "spectralbridge.corrections._normalize_volume_kernel_name",
          "signature": "_normalize_volume_kernel_name(kernel_type: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 198,
          "methods": [],
          "name": "_normalize_geom_kernel_name",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "kernel_type"
            }
          ],
          "path": "spectralbridge.corrections._normalize_geom_kernel_name",
          "signature": "_normalize_geom_kernel_name(kernel_type: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 217,
          "methods": [],
          "name": "_default_geom_params",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "kernel_type"
            }
          ],
          "path": "spectralbridge.corrections._default_geom_params",
          "signature": "_default_geom_params(kernel_type: str) -> tuple[float, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 224,
          "methods": [],
          "name": "_resolve_scene_solar_zenith",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_zn"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "valid_mask"
            }
          ],
          "path": "spectralbridge.corrections._resolve_scene_solar_zenith",
          "signature": "_resolve_scene_solar_zenith(solar_zn: np.ndarray, valid_mask: np.ndarray | None=None) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Compute NDVI from unitless reflectance data.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 237,
          "methods": [],
          "name": "compute_ndvi",
          "parameters": [
            {
              "annotation": "'NeonCube'",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data_unitless"
            },
            {
              "annotation": "float",
              "default": "665.0",
              "kind": "positional-or-keyword",
              "name": "red_target_nm"
            },
            {
              "annotation": "float",
              "default": "865.0",
              "kind": "positional-or-keyword",
              "name": "nir_target_nm"
            }
          ],
          "path": "spectralbridge.corrections.compute_ndvi",
          "signature": "compute_ndvi(cube: 'NeonCube', data_unitless: np.ndarray, red_target_nm: float=665.0, nir_target_nm: float=865.0) -> np.ndarray",
          "summary": "Compute NDVI from unitless reflectance data.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return NDVI bin edges and bin indices.\n\nThe returned ``edges`` are the realized NDVI bin boundaries after applying\nthe configured clipping rules. They are written to the BRDF model JSON as\n``ndvi_edges`` so each coefficient row can be traced back to the NDVI\nstratum it was fit from. This is BRDF model metadata, not a standalone NDVI\nscience product.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 254,
          "methods": [],
          "name": "compute_ndvi_bins",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ndvi"
            },
            {
              "annotation": "NDVIBinningConfig",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.corrections.compute_ndvi_bins",
          "signature": "compute_ndvi_bins(ndvi: np.ndarray, config: NDVIBinningConfig) -> tuple[np.ndarray, np.ndarray]",
          "summary": "Return NDVI bin edges and bin indices.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a single BRDF bin spanning the full NDVI domain.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 279,
          "methods": [],
          "name": "_single_brdf_bin",
          "parameters": [
            {
              "annotation": "tuple[int, int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "shape"
            }
          ],
          "path": "spectralbridge.corrections._single_brdf_bin",
          "signature": "_single_brdf_bin(shape: tuple[int, int]) -> tuple[np.ndarray, np.ndarray]",
          "summary": "Return a single BRDF bin spanning the full NDVI domain.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Adapted from hytools.topo.calc_cosine_i (GPLv3; HyTools Authors:\nAdam Chlus, Zhiwei Ye, Philip Townsend). Simplified for NEON use.\n\nCompute the cosine of the solar incidence angle on a sloped surface.\n\nParameters\n----------\nsolar_zn : np.ndarray\n    Solar zenith angle [radians], shape (Y,X)\nsolar_az : np.ndarray\n    Solar azimuth angle [radians], shape (Y,X)\naspect : np.ndarray\n    Surface aspect [radians], shape (Y,X)\n    Aspect is typically clockwise from North.\nslope : np.ndarray\n    Surface slope [radians], shape (Y,X)\n\nReturns\n-------\nnp.ndarray\n    cos(i), shape (Y,X), float32\n\nNotes\n-----\nHyTools uses this quantity in topographic correction.\nThis is basically:\n    cos_i = cos(solar_zn)*cos(slope)\n            + sin(solar_zn)*sin(slope)*cos(solar_az - aspect)",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.calc_cosine_i"
          ],
          "kind": "function",
          "line": 287,
          "methods": [],
          "name": "calc_cosine_i",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_zn"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_az"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "aspect"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "slope"
            }
          ],
          "path": "spectralbridge.corrections.calc_cosine_i",
          "signature": "calc_cosine_i(solar_zn: np.ndarray, solar_az: np.ndarray, aspect: np.ndarray, slope: np.ndarray) -> np.ndarray",
          "summary": "Adapted from hytools.topo.calc_cosine_i (GPLv3; HyTools Authors:",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Adapted from hytools.brdf.kernels.calc_volume_kernel (GPLv3; HyTools Authors:\nAdam Chlus, Zhiwei Ye, Philip Townsend). Simplified for NEON use.\n\nCompute the BRDF volume scattering kernel for each pixel.",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.calc_volume_kernel"
          ],
          "kind": "function",
          "line": 337,
          "methods": [],
          "name": "calc_volume_kernel",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_az"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_zn"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_az"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_zn"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "kernel_type"
            }
          ],
          "path": "spectralbridge.corrections.calc_volume_kernel",
          "signature": "calc_volume_kernel(solar_az: np.ndarray, solar_zn: np.ndarray, sensor_az: np.ndarray, sensor_zn: np.ndarray, kernel_type: str) -> np.ndarray",
          "summary": "Adapted from hytools.brdf.kernels.calc_volume_kernel (GPLv3; HyTools Authors:",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Adapted from hytools.brdf.kernels.calc_geom_kernel (GPLv3; HyTools Authors:\nAdam Chlus, Zhiwei Ye, Philip Townsend). Simplified for NEON use.\n\nCompute the BRDF geometric scattering kernel for each pixel.",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.calc_geom_kernel"
          ],
          "kind": "function",
          "line": 378,
          "methods": [],
          "name": "calc_geom_kernel",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_az"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_zn"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_az"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_zn"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "kernel_type"
            },
            {
              "annotation": "float",
              "default": "1.0",
              "kind": "positional-or-keyword",
              "name": "b_r"
            },
            {
              "annotation": "float",
              "default": "2.0",
              "kind": "positional-or-keyword",
              "name": "h_b"
            }
          ],
          "path": "spectralbridge.corrections.calc_geom_kernel",
          "signature": "calc_geom_kernel(solar_az: np.ndarray, solar_zn: np.ndarray, sensor_az: np.ndarray, sensor_zn: np.ndarray, kernel_type: str, b_r: float=1.0, h_b: float=2.0) -> np.ndarray",
          "summary": "Adapted from hytools.brdf.kernels.calc_geom_kernel (GPLv3; HyTools Authors:",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fit per-band SCS+C ``C`` parameters over a full NeonCube footprint.\n\nImplements the method of Soenen et al. (2005), DOI\n10.1109/TGRS.2005.852480. The audit found no material source match between\nthis fitting/application code and HyTools' SCS+C implementation.\n\nStreams reflectance tiles and accumulates ordinary-least-squares sufficient\nstatistics so scene-wide topographic fits do not require holding a second\nfull corrected cube in memory.",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.fit_scs_c_coefficients"
          ],
          "kind": "function",
          "line": 467,
          "methods": [],
          "name": "fit_scs_c_coefficients",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "int",
              "default": "500",
              "kind": "keyword-only",
              "name": "chunk_y"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "chunk_x"
            }
          ],
          "path": "spectralbridge.corrections.fit_scs_c_coefficients",
          "signature": "fit_scs_c_coefficients(cube, *, chunk_y: int=500, chunk_x: int | None=None) -> np.ndarray",
          "summary": "Fit per-band SCS+C ``C`` parameters over a full NeonCube footprint.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Topographic (illumination) correction on a hyperspectral chunk.\n\nThe SCS+C branch implements Soenen et al. (2005), DOI\n10.1109/TGRS.2005.852480. ``calc_cosine_i``, used here, has separately\ndocumented HyTools implementation lineage.\n\nParameters\n----------\nscs_c :\n    Optional per-band SCS+C ``C`` values (length ``bands``). When provided,\n    the tile uses these coefficients instead of fitting locally. Pass scene\n    fits from :func:`fit_scs_c_coefficients` for HyTools-style behaviour\n    without loading the full flightline as one correction chunk.",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.apply_topo_correct"
          ],
          "kind": "function",
          "line": 556,
          "methods": [],
          "name": "apply_topo_correct",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "chunk_array"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ys"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ye"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "xs"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "xe"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "use_scs_c"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "scs_c"
            }
          ],
          "path": "spectralbridge.corrections.apply_topo_correct",
          "signature": "apply_topo_correct(cube, chunk_array: np.ndarray, ys: int, ye: int, xs: int, xe: int, use_scs_c: bool=True, scs_c: np.ndarray | None=None) -> np.ndarray",
          "summary": "Topographic (illumination) correction on a hyperspectral chunk.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Perform BRDF normalization on a hyperspectral chunk using FlexBRDF ratio.",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.apply_brdf_correct"
          ],
          "kind": "function",
          "line": 698,
          "methods": [],
          "name": "apply_brdf_correct",
          "parameters": [
            {
              "annotation": "'NeonCube'",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "chunk_array"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ys"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ye"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "xs"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "xe"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "coeff_path"
            },
            {
              "annotation": "NDVIBinningConfig | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "ndvi_config"
            },
            {
              "annotation": "ReferenceGeometry | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "reference_geometry"
            },
            {
              "annotation": "BRDFKernelConfig | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "brdf_kernel_config"
            }
          ],
          "path": "spectralbridge.corrections.apply_brdf_correct",
          "signature": "apply_brdf_correct(cube: 'NeonCube', chunk_array: np.ndarray, ys: int, ye: int, xs: int, xe: int, coeff_path: Path | None=None, ndvi_config: NDVIBinningConfig | None=None, reference_geometry: ReferenceGeometry | None=None, brdf_kernel_config: BRDFKernelConfig | None=None) -> np.ndarray",
          "summary": "Perform BRDF normalization on a hyperspectral chunk using FlexBRDF ratio.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Placeholder for sunglint correction.\n\nIn hytools.glint.apply_glint_correct (GPLv3), sunglint correction is used\nfor aquatic environments. We are not supporting that right now.",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.apply_glint_correct"
          ],
          "kind": "function",
          "line": 995,
          "methods": [],
          "name": "apply_glint_correct",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-positional",
              "name": "args"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-keyword",
              "name": "kwargs"
            }
          ],
          "path": "spectralbridge.corrections.apply_glint_correct",
          "signature": "apply_glint_correct(*args, **kwargs)",
          "summary": "Placeholder for sunglint correction.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Estimate and persist BRDF coefficients for a NEON flightline.\n\nParameters\n----------\ncube : NeonCube\n    Loaded NEON hyperspectral cube providing reflectance and ancillary angles.\nout_dir : Path\n    Directory where the fitted BRDF coefficient JSON should be stored.\n\nReturns\n-------\nPath\n    Path to the JSON file containing the BRDF model coefficients.",
          "examples": [],
          "exports": [
            "spectralbridge.corrections.fit_and_save_brdf_model"
          ],
          "kind": "function",
          "line": 1005,
          "methods": [],
          "name": "fit_and_save_brdf_model",
          "parameters": [
            {
              "annotation": "'NeonCube'",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_dir"
            },
            {
              "annotation": "NDVIBinningConfig | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "ndvi_config"
            },
            {
              "annotation": "BRDFKernelConfig | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "brdf_kernel_config"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "positional-or-keyword",
              "name": "rho_min"
            },
            {
              "annotation": "float | None",
              "default": "2.0",
              "kind": "positional-or-keyword",
              "name": "rho_max"
            }
          ],
          "path": "spectralbridge.corrections.fit_and_save_brdf_model",
          "signature": "fit_and_save_brdf_model(cube: 'NeonCube', out_dir: Path, ndvi_config: NDVIBinningConfig | None=None, brdf_kernel_config: BRDFKernelConfig | None=None, rho_min: float=0.0, rho_max: float | None=2.0) -> Path",
          "summary": "Estimate and persist BRDF coefficients for a NEON flightline.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/corrections.py",
      "sha256": "ece9bca2c17d4d17e70fcefd4d67b51f088ea2103e836b04f9b816e32a68aa7a"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {},
      "module": "spectralbridge.data",
      "objects": [],
      "path": "src/spectralbridge/data/__init__.py",
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "hytools"
      ],
      "docstring": "Deprecated compatibility modules retained for legacy workflows.",
      "export_expressions": [
        "__all__ = ['hytools']"
      ],
      "imports": {
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.deprecated",
      "objects": [],
      "path": "src/spectralbridge/deprecated/__init__.py",
      "sha256": "1bcce0b330117b3dbf9190341f8cb0c8c6b4eef70c18decc37273faee41559cc"
    },
    {
      "area": "utilities",
      "constants": [
        {
          "annotation": null,
          "name": "apply_brightness_offset_to_envi",
          "value": "apply_offset_to_envi"
        }
      ],
      "declared_exports": [
        "apply_brightness_offset_to_envi",
        "apply_corrections",
        "apply_offset_to_envi",
        "export_coeffs",
        "generate_config_json",
        "generate_correction_configs_for_directory",
        "topo_and_brdf_correction"
      ],
      "docstring": "Legacy HyTools-backed BRDF/topographic correction workflow.\n\nThis module is retained for compatibility with older config-driven workflows.\nThe active SpectralBridge NEON pipeline uses ``spectralbridge.brdf_topo`` instead.",
      "export_expressions": [
        "__all__ = ['topo_and_brdf_correction', 'apply_offset_to_envi', 'apply_brightness_offset_to_envi', 'export_coeffs', 'apply_corrections', 'generate_correction_configs_for_directory', 'generate_config_json']"
      ],
      "imports": {
        "Iterable": "typing.Iterable",
        "NEONReflectanceAncillaryENVIFile": "spectralbridge.file_types.NEONReflectanceAncillaryENVIFile",
        "NEONReflectanceBRDFCorrectedENVIFile": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIFile",
        "NEONReflectanceBRDFMaskENVIFile": "spectralbridge.file_types.NEONReflectanceBRDFMaskENVIFile",
        "NEONReflectanceCoefficientsFile": "spectralbridge.file_types.NEONReflectanceCoefficientsFile",
        "NEONReflectanceConfigFile": "spectralbridge.file_types.NEONReflectanceConfigFile",
        "NEONReflectanceENVIFile": "spectralbridge.file_types.NEONReflectanceENVIFile",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "_HyTools": "hytools.hytools.HyTools",
        "_calc_brdf_coeffs": "hytools.brdf.calc_brdf_coeffs",
        "_calc_topo_coeffs": "hytools.topo.calc_topo_coeffs",
        "_mask_create": "hytools.masks.mask_create",
        "_set_glint_parameters": "hytools.glint.set_glint_parameters",
        "annotations": "__future__.annotations",
        "get_write_envi": "spectralbridge.hytools_compat.get_write_envi",
        "init_ray": "spectralbridge.ray_utils.init_ray",
        "require_rasterio": "spectralbridge._optional.require_rasterio",
        "require_ray": "spectralbridge._optional.require_ray"
      },
      "module": "spectralbridge.deprecated.hytools",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Import HyTools and related helpers on-demand.\n\nRaises\n------\nModuleNotFoundError\n    If HyTools (and its supporting modules) are not installed.  The error message makes\n    it explicit how to install the dependency, instead of failing at module import time\n    for unrelated utilities.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 53,
          "methods": [],
          "name": "_import_hytools",
          "parameters": [],
          "path": "spectralbridge.deprecated.hytools._import_hytools",
          "signature": "_import_hytools() -> None",
          "summary": "Import HyTools and related helpers on-demand.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Apply TOPO and BRDF corrections using settings in the (HyTools-ready) config JSON file.",
          "examples": [],
          "exports": [
            "spectralbridge.deprecated.hytools.topo_and_brdf_correction"
          ],
          "kind": "function",
          "line": 102,
          "methods": [],
          "name": "topo_and_brdf_correction",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config_file"
            }
          ],
          "path": "spectralbridge.deprecated.hytools.topo_and_brdf_correction",
          "signature": "topo_and_brdf_correction(config_file: str)",
          "summary": "Apply TOPO and BRDF corrections using settings in the (HyTools-ready) config JSON file.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Yield (img_path, hdr_path) pairs for ENVI rasters under ``input_dir``.\nLooks for ``*.hdr`` with a sibling ``*.img``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 199,
          "methods": [],
          "name": "_iter_envi_pairs",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_dir"
            }
          ],
          "path": "spectralbridge.deprecated.hytools._iter_envi_pairs",
          "signature": "_iter_envi_pairs(input_dir: Path) -> Iterable[tuple[Path, Path]]",
          "summary": "Yield (img_path, hdr_path) pairs for ENVI rasters under ``input_dir``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Add a constant offset to all pixel values in ENVI rasters under ``input_dir``.\n\nThis applies an additive brightness/reflectance shift. Results can optionally be\nclipped to the ``[0, 1]`` range.\n\nParameters\n----------\ninput_dir : str | Path\n    Root folder to search for ENVI files (``*.hdr`` with sibling ``*.img``).\noffset : float\n    Value to **add** to every pixel (e.g., ``-0.005`` to shift down).\nclip_to_01 : bool, default ``True``\n    If ``True``, clip results to ``[0, 1]`` after adding the offset.\nonly_if_name_contains : list[str] | None\n    If provided, only modify files whose basename contains *any* of these\n    substrings (case-insensitive).\n\nReturns\n-------\nint\n    Number of ENVI images modified.",
          "examples": [],
          "exports": [
            "spectralbridge.deprecated.hytools.apply_offset_to_envi"
          ],
          "kind": "function",
          "line": 211,
          "methods": [],
          "name": "apply_offset_to_envi",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_dir"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "offset"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "clip_to_01"
            },
            {
              "annotation": "Optional[list[str]]",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "only_if_name_contains"
            }
          ],
          "path": "spectralbridge.deprecated.hytools.apply_offset_to_envi",
          "signature": "apply_offset_to_envi(input_dir: str | Path, offset: float, clip_to_01: bool=True, only_if_name_contains: Optional[list[str]]=None) -> int",
          "summary": "Add a constant offset to all pixel values in ENVI rasters under ``input_dir``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Export correction coefficients to JSON.",
          "examples": [],
          "exports": [
            "spectralbridge.deprecated.hytools.export_coeffs"
          ],
          "kind": "function",
          "line": 274,
          "methods": [],
          "name": "export_coeffs",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hy_obj"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "export_dict"
            }
          ],
          "path": "spectralbridge.deprecated.hytools.export_coeffs",
          "signature": "export_coeffs(hy_obj, export_dict)",
          "summary": "Export correction coefficients to JSON.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Apply corrections and export corrected ENVI imagery and masks.",
          "examples": [],
          "exports": [
            "spectralbridge.deprecated.hytools.apply_corrections"
          ],
          "kind": "function",
          "line": 302,
          "methods": [],
          "name": "apply_corrections",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hy_obj"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config_dict"
            }
          ],
          "path": "spectralbridge.deprecated.hytools.apply_corrections",
          "signature": "apply_corrections(hy_obj, config_dict)",
          "summary": "Apply corrections and export corrected ENVI imagery and masks.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Build a single HyTools-ready config JSON (next to the reflectance image)\nwith complete ancillary mapping and parameters.",
          "examples": [],
          "exports": [
            "spectralbridge.deprecated.hytools.generate_correction_configs_for_directory"
          ],
          "kind": "function",
          "line": 378,
          "methods": [],
          "name": "generate_correction_configs_for_directory",
          "parameters": [
            {
              "annotation": "NEONReflectanceENVIFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reflectance_file"
            }
          ],
          "path": "spectralbridge.deprecated.hytools.generate_correction_configs_for_directory",
          "signature": "generate_correction_configs_for_directory(reflectance_file: NEONReflectanceENVIFile)",
          "summary": "Build a single HyTools-ready config JSON (next to the reflectance image)",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Generate HyTools-ready config JSONs for all ENVI reflectance files under `directory`.",
          "examples": [],
          "exports": [
            "spectralbridge.deprecated.hytools.generate_config_json"
          ],
          "kind": "function",
          "line": 487,
          "methods": [],
          "name": "generate_config_json",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": "int",
              "default": "8",
              "kind": "positional-or-keyword",
              "name": "num_cpus"
            }
          ],
          "path": "spectralbridge.deprecated.hytools.generate_config_json",
          "signature": "generate_config_json(directory: str, num_cpus: int=8)",
          "summary": "Generate HyTools-ready config JSONs for all ENVI reflectance files under `directory`.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/deprecated/hytools.py",
      "sha256": "a16fe080273bb2b155edbdab9d92ecd749686c96761abf49465a2b1064d47a0c"
    },
    {
      "area": "drone",
      "constants": [
        {
          "annotation": null,
          "name": "DroneSource",
          "value": "str | Mapping[int, str]"
        }
      ],
      "declared_exports": [
        "BulkProductionResult",
        "BulkReadinessValidation",
        "DroneCampaignConfig",
        "DroneCampaignIncompleteError",
        "DroneCampaignResult",
        "DroneCollectionInventory",
        "DroneFlightStatus",
        "DroneSource",
        "DroneYearSource",
        "RemoteDronePackage",
        "StagedDroneInput",
        "inspect_drone_collection",
        "package_drone_bulk_results",
        "run_drone_bulk_production",
        "run_drone_campaign",
        "stage_drone_collection",
        "stage_drone_package",
        "validate_bulk_ready_flightline",
        "verify_uploaded_results"
      ],
      "docstring": "Restart-safe production orchestration above the drone and bulk pipelines.",
      "export_expressions": [
        "__all__ = ['BulkProductionResult', 'BulkReadinessValidation', 'DroneCampaignConfig', 'DroneCampaignIncompleteError', 'DroneCampaignResult', 'DroneCollectionInventory', 'DroneFlightStatus', 'DroneSource', 'DroneYearSource', 'RemoteDronePackage', 'StagedDroneInput', 'inspect_drone_collection', 'package_drone_bulk_results', 'run_drone_bulk_production', 'run_drone_campaign', 'stage_drone_collection', 'stage_drone_package', 'validate_bulk_ready_flightline', 'verify_uploaded_results']"
      ],
      "imports": {
        "Any": "typing.Any",
        "BulkResultsConfig": "spectralbridge.bulk.BulkResultsConfig",
        "GocmdRemoteBackend": "spectralbridge.remote.GocmdRemoteBackend",
        "Mapping": "typing.Mapping",
        "Path": "pathlib.Path",
        "RemoteCollectionBackend": "spectralbridge.remote.RemoteCollectionBackend",
        "RemoteEntry": "spectralbridge.remote.RemoteEntry",
        "Sequence": "typing.Sequence",
        "__version__": "spectralbridge.__version__",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "datetime": "datetime.datetime",
        "derive_drone_flight_stem": "spectralbridge.pipelines.drone.derive_drone_flight_stem",
        "discover_completed_flightlines": "spectralbridge.bulk.flightline_outputs.discover_completed_flightlines",
        "get_package_data_path": "spectralbridge.utils.paths.get_package_data_path",
        "load_drone_manifest": "spectralbridge.pipelines.drone.load_drone_manifest",
        "lookup_flight_datetime": "spectralbridge.pipelines.drone.lookup_flight_datetime",
        "normalize_remote_path": "spectralbridge.remote.normalize_remote_path",
        "remote_join": "spectralbridge.remote.remote_join",
        "remote_parent": "spectralbridge.remote.remote_parent",
        "remote_relative_path": "spectralbridge.remote.remote_relative_path",
        "replace": "dataclasses.replace",
        "run_bulk_pipeline": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
        "run_drone_pipeline": "spectralbridge.pipelines.drone.run_drone_pipeline",
        "sha256": "hashlib.sha256",
        "summarize_bulk_results": "spectralbridge.bulk.results.summarize_bulk_results",
        "timezone": "datetime.timezone"
      },
      "module": "spectralbridge.drone_production",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 48,
          "methods": [],
          "name": "_utc_now",
          "parameters": [],
          "path": "spectralbridge.drone_production._utc_now",
          "signature": "_utc_now() -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 52,
          "methods": [],
          "name": "_jsonable",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.drone_production._jsonable",
          "signature": "_jsonable(value: Any) -> Any",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 64,
          "methods": [],
          "name": "_atomic_json",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "payload"
            }
          ],
          "path": "spectralbridge.drone_production._atomic_json",
          "signature": "_atomic_json(path: Path, payload: Mapping[str, Any]) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 75,
          "methods": [],
          "name": "_write_rows_csv",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Sequence[Mapping[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            }
          ],
          "path": "spectralbridge.drone_production._write_rows_csv",
          "signature": "_write_rows_csv(path: Path, rows: Sequence[Mapping[str, Any]]) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 97,
          "methods": [],
          "name": "_sha256_file",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.drone_production._sha256_file",
          "signature": "_sha256_file(path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "remote_package_path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_root"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "package_name"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "remote_h5_path"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "h5_name"
            },
            {
              "annotation": "int | None",
              "default": null,
              "name": "size_bytes"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "checksum"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "flight_stem"
            },
            {
              "annotation": "int | None",
              "default": null,
              "name": "year"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "manifest_id"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "acquisition_datetime"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "manifest_matched"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "required_source_exists"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "completed_local_result"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "local_flightline_path"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "bulk_ready"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "eligibility"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "reason"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "One candidate ExportPackage discovered without downloading its H5.\n\nAttributes\n----------\nremote_package_path : str\n    Authoritative remote ExportPackage or HDF5 location; inventory does not imply it has been downloaded.\nsource_root : str\n    Requested or resolved remote collection location(s), retained to distinguish year-resolution strategy from scientific identity.\npackage_name : str\n    Original remote package/HDF5 basename preserved as source provenance.\nremote_h5_path : str | None\n    Authoritative remote ExportPackage or HDF5 location; inventory does not imply it has been downloaded.\nh5_name : str | None\n    Original remote package/HDF5 basename preserved as source provenance.\nsize_bytes : int | None\n    Size or estimated storage requirement in bytes; estimates describe planned artifacts rather than guaranteed disk use.\nchecksum : str | None\n    Optional source checksum used for transfer integrity; absence does not imply verification.\nflight_stem : str | None\n    Canonical scientific flightline identifier; histories from the same underlying flight must retain this identity.\nyear : int | None\n    Calendar acquisition year used for inventory grouping and completeness checks.\nmanifest_id : str | None\n    Flight identifier matched against the acquisition manifest.\nacquisition_datetime : str | None\n    Recorded acquisition timestamp, interpreted with the configured timezone convention.\nmanifest_matched : bool\n    Recorded manifest/source/local-result evidence used to decide package eligibility.\nrequired_source_exists : bool\n    Recorded manifest/source/local-result evidence used to decide package eligibility.\ncompleted_local_result : bool\n    Recorded manifest/source/local-result evidence used to decide package eligibility.\nlocal_flightline_path : str | None\n    Canonical local producer output directory; completed products are reused only after readiness validation.\nbulk_ready : bool\n    Whether the recorded product satisfies the corresponding translation availability/eligibility or producer-to-bulk gate; does not certify empirical sensor calibration.\neligibility : str\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nreason : str | None, default=None\n    Explicit reason for exclusion, failure or unavailable status; None when no reason applies.",
          "examples": [],
          "exports": [
            "spectralbridge.RemoteDronePackage",
            "spectralbridge.drone_production.RemoteDronePackage"
          ],
          "kind": "class",
          "line": 106,
          "methods": [
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 168,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "RemoteDronePackage",
          "parameters": [],
          "path": "spectralbridge.drone_production.RemoteDronePackage",
          "signature": null,
          "summary": "One candidate ExportPackage discovered without downloading its H5.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "int",
              "default": null,
              "name": "year"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "requested_source"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "name": "resolved_sources"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "resolution_strategy"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_status"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "name": "expected_manifest_flights"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "reason"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Resolved remote source and manifest expectation for one requested year.\n\nAttributes\n----------\nyear : int\n    Calendar acquisition year used for inventory grouping and completeness checks.\nrequested_source : str | None\n    Requested or resolved remote collection location(s), retained to distinguish year-resolution strategy from scientific identity.\nresolved_sources : tuple[str, ...]\n    Requested or resolved remote collection location(s), retained to distinguish year-resolution strategy from scientific identity.\nresolution_strategy : str\n    Recorded strategy used to resolve a requested remote root to explicit acquisition-year source locations.\nsource_status : str\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nexpected_manifest_flights : tuple[str, ...]\n    Expected flight identifiers for this requested year, derived from the manifest rather than discovered availability alone.\nreason : str | None, default=None\n    Explicit reason for exclusion, failure or unavailable status; None when no reason applies.",
          "examples": [],
          "exports": [
            "spectralbridge.DroneYearSource",
            "spectralbridge.drone_production.DroneYearSource"
          ],
          "kind": "class",
          "line": 181,
          "methods": [
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 210,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "DroneYearSource",
          "parameters": [],
          "path": "spectralbridge.drone_production.DroneYearSource",
          "signature": null,
          "summary": "Resolved remote source and manifest expectation for one requested year.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "source"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "backend"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "created_utc"
            },
            {
              "annotation": "tuple[RemoteDronePackage, ...]",
              "default": null,
              "name": "packages"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "manifest_path"
            },
            {
              "annotation": "tuple[int, ...]",
              "default": "()",
              "name": "requested_years"
            },
            {
              "annotation": "tuple[DroneYearSource, ...]",
              "default": "()",
              "name": "year_sources"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "result_parent"
            },
            {
              "annotation": "int",
              "default": "_INVENTORY_SCHEMA_VERSION",
              "name": "schema_version"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Serializable remote collection inventory and campaign expectation set.\n\nAttributes\n----------\nsource : str\n    Remote collection root, year-bound source mapping, or supported source specification; inspect_drone_collection resolves it before transfer.\nbackend : str\n    RemoteCollectionBackend implementation; None selects the normal noninteractive gocmd adapter.\ncreated_utc : str\n    Recorded UTC inventory/state/run timestamp; unavailable completion time remains explicit.\npackages : tuple[RemoteDronePackage, ...]\n    Immutable remote package inventory, including eligible and excluded records.\nmanifest_path : str\n    Existing acquisition manifest path, or None to follow supported discovery.\nrequested_years : tuple[int, ...], default=()\n    Requested acquisition years whose manifest expectations define campaign completeness.\nyear_sources : tuple[DroneYearSource, ...], default=()\n    Per-year source-resolution and expectation records.\nresult_parent : str | None, default=None\n    Resolved remote result parent or configured result package name; uploads remain explicit opt-in operations.\nschema_version : int, default=_INVENTORY_SCHEMA_VERSION\n    Serialized payload schema version; preserve it when storing or exchanging this record.",
          "examples": [],
          "exports": [
            "spectralbridge.DroneCollectionInventory",
            "spectralbridge.drone_production.DroneCollectionInventory"
          ],
          "kind": "class",
          "line": 223,
          "methods": [
            {
              "docstring": "Select package records marked eligible for staging.\n\nReturns\n-------\ntuple[RemoteDronePackage, ...]\n    Tuple of package records whose eligibility equals eligible; no transfer is performed.",
              "line": 259,
              "name": "eligible_packages",
              "parameters": [],
              "private": false,
              "signature": "eligible_packages(self) -> tuple[RemoteDronePackage, ...]"
            },
            {
              "docstring": "Select package records excluded from staging.\n\nReturns\n-------\ntuple[RemoteDronePackage, ...]\n    Tuple of package records whose eligibility is not eligible, retaining their recorded reasons.",
              "line": 271,
              "name": "excluded_packages",
              "parameters": [],
              "private": false,
              "signature": "excluded_packages(self) -> tuple[RemoteDronePackage, ...]"
            },
            {
              "docstring": "Return deterministic manifest-aware discovery evidence by year.",
              "line": 282,
              "name": "year_summaries",
              "parameters": [],
              "private": false,
              "signature": "year_summaries(self) -> dict[str, dict[str, Any]]"
            },
            {
              "docstring": "Report whether all requested-year source discovery is complete.\n\nReturns\n-------\nbool\n    Whether the recorded state satisfies this method's predicate; no source processing is performed.",
              "line": 323,
              "name": "discovery_complete",
              "parameters": [],
              "private": false,
              "signature": "discovery_complete(self) -> bool"
            },
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 339,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            },
            {
              "docstring": "Write inventory JSON and CSV tables.\n\nParameters\n----------\noutput_dir : str | Path\n    Directory for generated products; bulk outputs must be outside the read-only input tree.\n\nReturns\n-------\ntuple[Path, Path]\n    Inventory JSON path and package CSV path, in that order.",
              "line": 366,
              "name": "write",
              "parameters": [
                {
                  "annotation": "str | Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "output_dir"
                }
              ],
              "private": false,
              "signature": "write(self, output_dir: str | Path) -> tuple[Path, Path]"
            }
          ],
          "name": "DroneCollectionInventory",
          "parameters": [],
          "path": "spectralbridge.drone_production.DroneCollectionInventory",
          "signature": null,
          "summary": "Serializable remote collection inventory and campaign expectation set.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "path"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "bulk_ready"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "canonical_flightline_id"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "candidate_count"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "accepted_count"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "translation_available"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "translation_eligible"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "()",
              "name": "exclusion_reasons"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "error"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Result of classifying one producer directory with bulk's own discovery.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_production.BulkReadinessValidation"
          ],
          "kind": "class",
          "line": 390,
          "methods": [
            {
              "docstring": "",
              "line": 403,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "BulkReadinessValidation",
          "parameters": [],
          "path": "spectralbridge.drone_production.BulkReadinessValidation",
          "signature": null,
          "summary": "Result of classifying one producer directory with bulk's own discovery.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "package_path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "local_path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "remote_path"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "size_bytes"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "status"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "checksum"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validated local copy of one required remote H5.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_production.StagedDroneInput"
          ],
          "kind": "class",
          "line": 408,
          "methods": [
            {
              "docstring": "",
              "line": 418,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "StagedDroneInput",
          "parameters": [],
          "path": "spectralbridge.drone_production.StagedDroneInput",
          "signature": null,
          "summary": "Validated local copy of one required remote H5.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "tuple[int, ...]",
              "default": "()",
              "name": "years"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "name": "manifest_path"
            },
            {
              "annotation": "str | None",
              "default": "'UTC'",
              "name": "manifest_timezone"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "cleanup_inputs"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "resume"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "require_complete_campaign"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "apply_topo"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "apply_brdf"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "apply_brightness_adjustment"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "require_solar_geometry"
            },
            {
              "annotation": "str",
              "default": "'full'",
              "name": "extraction_mode"
            },
            {
              "annotation": "int",
              "default": "2048",
              "name": "parquet_chunk_size"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "apply_translation"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "translation_strict"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "landsat_qa"
            },
            {
              "annotation": "int",
              "default": "1",
              "name": "extraction_workers"
            },
            {
              "annotation": "int",
              "default": "8",
              "name": "max_remote_depth"
            },
            {
              "annotation": "int",
              "default": "100000",
              "name": "max_remote_entries"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "result_name"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Explicit production settings for independent drone flight checkpoints.\n\nAttributes\n----------\nyears : tuple[int, ...], default=()\n    Requested acquisition years used to resolve sources and verify campaign completeness.\nmanifest_path : str | Path | None, default=None\n    Existing acquisition manifest path, or None to follow supported discovery.\nmanifest_timezone : str | None, default='UTC'\n    Timezone used to interpret manifest acquisition timestamps.\ncleanup_inputs : bool, default=True\n    Remove staged inputs only after the established producer/readiness checkpoint has completed.\nresume : bool, default=True\n    Reuse valid durable per-flight checkpoints on restart.\nrequire_complete_campaign : bool, default=True\n    Require all expected eligible flights to be bulk-ready before population analysis; prevents silent partial-population claims.\napply_topo : bool, default=True\n    Enable the existing topographic correction when required terrain/geometry metadata are available.\napply_brdf : bool, default=True\n    Enable the existing BRDF correction when required angular metadata are available.\napply_brightness_adjustment : bool, default=False\n    Opt into the established brightness adjustment; does not change the packaged coefficients.\nrequire_solar_geometry : bool, default=True\n    Require scientifically usable solar geometry before correction rather than silently proceeding without it.\nextraction_mode : str, default='full'\n    'full' writes pixel Parquet, 'polygon' requires polygons; None preserves the entry point's documented default extraction behavior.\nparquet_chunk_size : int, default=2048\n    Positive pixel/window processing budget for bounded extraction; the default and interpretation follow the selected producer.\napply_translation : bool, default=True\n    Create separate Landsat-like application products using the reviewed coefficient registry; does not overwrite corrected native MicaSense.\ntranslation_strict : bool, default=False\n    Treat unsupported/flagged translation conditions as blocking rather than returning the configured non-strict status.\nlandsat_qa : bool, default=True\n    Enable actual Landsat comparison QA for translated products; requires apply_translation=True and appropriate data/dependencies.\nextraction_workers : int, default=1\n    Positive number of independent flightline extraction workers; storage bandwidth can limit useful concurrency.\nmax_remote_depth : int, default=8\n    Positive remote traversal limit controlling inventory depth or inspected-entry budget.\nmax_remote_entries : int, default=100000\n    Positive remote traversal limit controlling inventory depth or inspected-entry budget.\nresult_name : str | None, default=None\n    Resolved remote result parent or configured result package name; uploads remain explicit opt-in operations.",
          "examples": [],
          "exports": [
            "spectralbridge.DroneCampaignConfig",
            "spectralbridge.drone_production.DroneCampaignConfig"
          ],
          "kind": "class",
          "line": 423,
          "methods": [
            {
              "docstring": "Validate configuration ranges and supported option combinations.\n\nReturns\n-------\nNone\n    No return value; validation raises on unsupported configuration and directory creation persists the canonical hierarchy.\n\nRaises\n------\nValueError\n    If option values violate the configuration or relationship-selection contract.",
              "line": 488,
              "name": "validate",
              "parameters": [],
              "private": false,
              "signature": "validate(self) -> None"
            },
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 514,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "DroneCampaignConfig",
          "parameters": [],
          "path": "spectralbridge.drone_production.DroneCampaignConfig",
          "signature": null,
          "summary": "Explicit production settings for independent drone flight checkpoints.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "remote_package_path"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "flight_stem"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "state"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "updated_utc"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "local_input_path"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "local_flightline_path"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "transfer_status"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "bulk_ready"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "reused"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "input_removed"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "reason"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Durable campaign state for one expected remote flight package.\n\nAttributes\n----------\nremote_package_path : str\n    Authoritative remote ExportPackage or HDF5 location; inventory does not imply it has been downloaded.\nflight_stem : str | None\n    Canonical scientific flightline identifier; histories from the same underlying flight must retain this identity.\nstate : str\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nupdated_utc : str\n    Recorded UTC inventory/state/run timestamp; unavailable completion time remains explicit.\nlocal_input_path : str | None, default=None\n    Backing input product path retained for traceability and restart checks.\nlocal_flightline_path : str | None, default=None\n    Canonical local producer output directory; completed products are reused only after readiness validation.\ntransfer_status : str | None, default=None\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nbulk_ready : bool, default=False\n    Whether the recorded product satisfies the corresponding translation availability/eligibility or producer-to-bulk gate; does not certify empirical sensor calibration.\nreused : bool, default=False\n    Recorded checkpoint reuse or staged-input cleanup outcome; inspect flight state for scientific success.\ninput_removed : bool, default=False\n    Recorded checkpoint reuse or staged-input cleanup outcome; inspect flight state for scientific success.\nreason : str | None, default=None\n    Explicit reason for exclusion, failure or unavailable status; None when no reason applies.",
          "examples": [],
          "exports": [
            "spectralbridge.DroneFlightStatus",
            "spectralbridge.drone_production.DroneFlightStatus"
          ],
          "kind": "class",
          "line": 527,
          "methods": [
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 568,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "DroneFlightStatus",
          "parameters": [],
          "path": "spectralbridge.drone_production.DroneFlightStatus",
          "signature": null,
          "summary": "Durable campaign state for one expected remote flight package.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "DroneCollectionInventory",
              "default": null,
              "name": "inventory"
            },
            {
              "annotation": "tuple[DroneFlightStatus, ...]",
              "default": null,
              "name": "flights"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "work_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "flight_outputs"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "state_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "status"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "started_utc"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "completed_utc"
            },
            {
              "annotation": "DroneCampaignConfig",
              "default": null,
              "name": "config"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Completed, partial, or failed per-flight campaign outcome.\n\nAttributes\n----------\ninventory : DroneCollectionInventory\n    DroneCollectionInventory produced by inspect_drone_collection, including eligibility and resolved source provenance.\nflights : tuple[DroneFlightStatus, ...]\n    Per-flight durable outcomes, including failed, blocked and completed states.\nwork_dir : str\n    Local campaign workspace containing staging, flight outputs and restart/status records.\nflight_outputs : str\n    Local producer-output or durable restart/status directory.\nstate_dir : str\n    Local producer-output or durable restart/status directory.\nstatus : str\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\nstarted_utc : str\n    Recorded UTC inventory/state/run timestamp; unavailable completion time remains explicit.\ncompleted_utc : str\n    Recorded UTC inventory/state/run timestamp; unavailable completion time remains explicit.\nconfig : DroneCampaignConfig\n    Configuration object for this workflow; None selects the documented defaults of its configuration class.",
          "examples": [],
          "exports": [
            "spectralbridge.DroneCampaignResult",
            "spectralbridge.drone_production.DroneCampaignResult"
          ],
          "kind": "class",
          "line": 581,
          "methods": [
            {
              "docstring": "Select producer flight records currently marked bulk-ready.\n\nReturns\n-------\ntuple[DroneFlightStatus, ...]\n    Tuple of producer flight records marked bulk_ready; this property does not rerun readiness validation.",
              "line": 617,
              "name": "completed_flights",
              "parameters": [],
              "private": false,
              "signature": "completed_flights(self) -> tuple[DroneFlightStatus, ...]"
            },
            {
              "docstring": "Select failed or scientifically blocked flight records.\n\nReturns\n-------\ntuple[DroneFlightStatus, ...]\n    Tuple of flight records whose state is failed or blocked.",
              "line": 629,
              "name": "failed_flights",
              "parameters": [],
              "private": false,
              "signature": "failed_flights(self) -> tuple[DroneFlightStatus, ...]"
            },
            {
              "docstring": "Combine inventory evidence and durable processing state by year.",
              "line": 640,
              "name": "year_summaries",
              "parameters": [],
              "private": false,
              "signature": "year_summaries(self) -> dict[str, dict[str, Any]]"
            },
            {
              "docstring": "Report whether every requested year satisfies its manifest expectation.\n\nReturns\n-------\nbool\n    Whether the recorded state satisfies this method's predicate; no source processing is performed.",
              "line": 694,
              "name": "requested_years_complete",
              "parameters": [],
              "private": false,
              "signature": "requested_years_complete(self) -> bool"
            },
            {
              "docstring": "Summarize recorded flight/campaign states without rerunning processing.\n\nReturns\n-------\ndict[str, Any]\n    Recorded campaign counts, per-year completeness and output locations; this summary does not regenerate source products.",
              "line": 706,
              "name": "summary",
              "parameters": [],
              "private": false,
              "signature": "summary(self) -> dict[str, Any]"
            },
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 753,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "DroneCampaignResult",
          "parameters": [],
          "path": "spectralbridge.drone_production.DroneCampaignResult",
          "signature": null,
          "summary": "Completed, partial, or failed per-flight campaign outcome.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "DroneCollectionInventory",
              "default": null,
              "name": "inventory"
            },
            {
              "annotation": "DroneCampaignResult",
              "default": null,
              "name": "campaign"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "bulk_result"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "summary_result"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "local_result_path"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "remote_result_path"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "preflight_result"
            },
            {
              "annotation": "str",
              "default": "'complete'",
              "name": "status"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Top-level campaign, bulk, summary, package, and upload result.\n\nAttributes\n----------\ninventory : DroneCollectionInventory\n    DroneCollectionInventory produced by inspect_drone_collection, including eligibility and resolved source provenance.\ncampaign : DroneCampaignResult\n    DroneCampaignResult retaining producer inventory, completeness and per-flight outcomes.\nbulk_result : Mapping[str, Any]\n    Structured result returned by the corresponding compact bulk, interpretation or eligibility-preflight stage.\nsummary_result : Mapping[str, Any]\n    Structured result returned by the corresponding compact bulk, interpretation or eligibility-preflight stage.\nlocal_result_path : str\n    Final compact result package path; remote location may be absent when upload is disabled.\nremote_result_path : str | None\n    Final compact result package path; remote location may be absent when upload is disabled.\npreflight_result : Mapping[str, Any]\n    Structured result returned by the corresponding compact bulk, interpretation or eligibility-preflight stage.\nstatus : str, default='complete'\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.",
          "examples": [],
          "exports": [
            "spectralbridge.BulkProductionResult",
            "spectralbridge.drone_production.BulkProductionResult"
          ],
          "kind": "class",
          "line": 778,
          "methods": [
            {
              "docstring": "Select producer flight records currently marked bulk-ready.\n\nReturns\n-------\ntuple[DroneFlightStatus, ...]\n    Tuple of producer flight records marked bulk_ready; this property does not rerun readiness validation.",
              "line": 811,
              "name": "completed_flights",
              "parameters": [],
              "private": false,
              "signature": "completed_flights(self) -> tuple[DroneFlightStatus, ...]"
            },
            {
              "docstring": "Select failed or scientifically blocked flight records.\n\nReturns\n-------\ntuple[DroneFlightStatus, ...]\n    Tuple of flight records whose state is failed or blocked.",
              "line": 823,
              "name": "failed_flights",
              "parameters": [],
              "private": false,
              "signature": "failed_flights(self) -> tuple[DroneFlightStatus, ...]"
            },
            {
              "docstring": "Summarize recorded flight/campaign states without rerunning processing.\n\nReturns\n-------\ndict[str, Any]\n    Recorded campaign counts, per-year completeness and output locations; this summary does not regenerate source products.",
              "line": 834,
              "name": "summary",
              "parameters": [],
              "private": false,
              "signature": "summary(self) -> dict[str, Any]"
            },
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 854,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "BulkProductionResult",
          "parameters": [],
          "path": "spectralbridge.drone_production.BulkProductionResult",
          "signature": null,
          "summary": "Top-level campaign, bulk, summary, package, and upload result.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "The intended eligible population was not fully bulk-ready.\n\nParameters\n----------\nmessage : str\n    Explanation of the failed campaign completeness or readiness gate.\nresult : DroneCampaignResult\n    Durable per-flight outcomes retained as ``exception.result`` for inspection.",
          "examples": [],
          "exports": [
            "spectralbridge.DroneCampaignIncompleteError",
            "spectralbridge.drone_production.DroneCampaignIncompleteError"
          ],
          "kind": "class",
          "line": 875,
          "methods": [
            {
              "docstring": "",
              "line": 886,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "message"
                },
                {
                  "annotation": "DroneCampaignResult",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "result"
                }
              ],
              "private": true,
              "signature": "__init__(self, message: str, result: DroneCampaignResult)"
            }
          ],
          "name": "DroneCampaignIncompleteError",
          "parameters": [],
          "path": "spectralbridge.drone_production.DroneCampaignIncompleteError",
          "signature": null,
          "summary": "The intended eligible population was not fully bulk-ready.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/run_drone_pipeline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 891,
          "methods": [],
          "name": "_manifest_path",
          "parameters": [
            {
              "annotation": "str | Path | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.drone_production._manifest_path",
          "signature": "_manifest_path(path: str | Path | None) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the common remote collection containing resolved source roots.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 899,
          "methods": [],
          "name": "_remote_common_parent",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            }
          ],
          "path": "spectralbridge.drone_production._remote_common_parent",
          "signature": "_remote_common_parent(paths: Sequence[str]) -> str",
          "summary": "Return the common remote collection containing resolved source roots.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 916,
          "methods": [],
          "name": "_manifest_expectations",
          "parameters": [
            {
              "annotation": "Mapping[str, datetime]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "manifest_rows"
            },
            {
              "annotation": "Sequence[int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "requested_years"
            }
          ],
          "path": "spectralbridge.drone_production._manifest_expectations",
          "signature": "_manifest_expectations(manifest_rows: Mapping[str, datetime], requested_years: Sequence[int]) -> dict[int, tuple[str, ...]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 932,
          "methods": [],
          "name": "_match_manifest_flight",
          "parameters": [
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            },
            {
              "annotation": "Mapping[str, datetime]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "manifest_rows"
            }
          ],
          "path": "spectralbridge.drone_production._match_manifest_flight",
          "signature": "_match_manifest_flight(flight_stem: str | None, manifest_rows: Mapping[str, datetime]) -> tuple[str | None, datetime | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Resolve campaign-root, year-sibling, or explicit year-bound sources.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 952,
          "methods": [],
          "name": "_resolve_drone_sources",
          "parameters": [
            {
              "annotation": "DroneSource",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": "Sequence[int]",
              "default": null,
              "kind": "keyword-only",
              "name": "requested_years"
            },
            {
              "annotation": "Mapping[str, datetime]",
              "default": null,
              "kind": "keyword-only",
              "name": "manifest_rows"
            },
            {
              "annotation": "RemoteCollectionBackend",
              "default": null,
              "kind": "keyword-only",
              "name": "backend"
            }
          ],
          "path": "spectralbridge.drone_production._resolve_drone_sources",
          "signature": "_resolve_drone_sources(source: DroneSource, *, requested_years: Sequence[int], manifest_rows: Mapping[str, datetime], backend: RemoteCollectionBackend) -> tuple[str, tuple[DroneYearSource, ...], tuple[str, ...], str]",
          "summary": "Resolve campaign-root, year-sibling, or explicit year-bound sources.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1051,
          "methods": [],
          "name": "_remote_package_path",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "remote_h5"
            }
          ],
          "path": "spectralbridge.drone_production._remote_package_path",
          "signature": "_remote_package_path(remote_h5: str) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1061,
          "methods": [],
          "name": "_inventory_entries",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": "RemoteCollectionBackend",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "backend"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "max_depth"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "max_entries"
            }
          ],
          "path": "spectralbridge.drone_production._inventory_entries",
          "signature": "_inventory_entries(source: str, backend: RemoteCollectionBackend, *, max_depth: int, max_entries: int) -> list[RemoteEntry]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Apply bulk's real discovery/classification contract to one producer output.\n\nParameters\n----------\npath : str | Path\n    Existing producer flightline directory to validate using the actual bulk discovery and product-classification contract.\n\nReturns\n-------\nBulkReadinessValidation\n    Structured readiness result, canonical identity, accepted counts, availability and any captured discovery error.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.validate_bulk_ready_flightline",
            "spectralbridge.drone_production.validate_bulk_ready_flightline"
          ],
          "kind": "function",
          "line": 1091,
          "methods": [],
          "name": "validate_bulk_ready_flightline",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.drone_production.validate_bulk_ready_flightline",
          "signature": "validate_bulk_ready_flightline(path: str | Path) -> BulkReadinessValidation",
          "summary": "Apply bulk's real discovery/classification contract to one producer output.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Inventory remote ExportPackages and required H5s before large transfer.\n\nParameters\n----------\nsource : DroneSource\n    Remote collection root, year-bound source mapping, or supported source specification; inspect_drone_collection resolves it before transfer.\nbackend : RemoteCollectionBackend | None, default=None\n    RemoteCollectionBackend implementation; None selects the normal noninteractive gocmd adapter.\nmanifest : str | Path | None, default=None\n    Existing flight manifest providing acquisition identity/time; None uses supported discovery or embedded metadata.\nyears : Sequence[int] | None, default=None\n    Requested acquisition years used to resolve sources and verify campaign completeness.\nlocal_output_dir : str | Path | None, default=None\n    Existing local flight-output root used to recognize completed, bulk-ready flights during remote inventory.\nmax_depth : int, default=8\n    Maximum recursive remote inventory depth; bounds traversal cost.\nmax_entries : int, default=100000\n    Maximum entries inspected during remote inventory; bounds unintentional collection-wide traversal.\ninventory_output_dir : str | Path | None, default=None\n    Optional directory for inventory JSON/CSV artifacts; None returns the inventory without those files.\n\nReturns\n-------\nDroneCollectionInventory\n    Serializable resolved remote/local inventory with per-package eligibility and source/year provenance.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\nRequires an authorized remote source and configured backend; this inventories metadata before large transfer.\n\n>>> from spectralbridge import inspect_drone_collection\n>>> inventory = inspect_drone_collection(remote_source, years=(2025,))  # doctest: +SKIP",
          "examples": [],
          "exports": [
            "spectralbridge.inspect_drone_collection",
            "spectralbridge.drone_production.inspect_drone_collection"
          ],
          "kind": "function",
          "line": 1161,
          "methods": [],
          "name": "inspect_drone_collection",
          "parameters": [
            {
              "annotation": "DroneSource",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": "RemoteCollectionBackend | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "backend"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "manifest"
            },
            {
              "annotation": "Sequence[int] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "years"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "local_output_dir"
            },
            {
              "annotation": "int",
              "default": "8",
              "kind": "keyword-only",
              "name": "max_depth"
            },
            {
              "annotation": "int",
              "default": "100000",
              "kind": "keyword-only",
              "name": "max_entries"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "inventory_output_dir"
            }
          ],
          "path": "spectralbridge.drone_production.inspect_drone_collection",
          "signature": "inspect_drone_collection(source: DroneSource, *, backend: RemoteCollectionBackend | None=None, manifest: str | Path | None=None, years: Sequence[int] | None=None, local_output_dir: str | Path | None=None, max_depth: int=8, max_entries: int=100000, inventory_output_dir: str | Path | None=None) -> DroneCollectionInventory",
          "summary": "Inventory remote ExportPackages and required H5s before large transfer.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Download or reuse one complete H5 while preserving ExportPackage layout.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_production.stage_drone_package"
          ],
          "kind": "function",
          "line": 1343,
          "methods": [],
          "name": "stage_drone_package",
          "parameters": [
            {
              "annotation": "RemoteDronePackage",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "package"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "source"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "staging_dir"
            },
            {
              "annotation": "RemoteCollectionBackend",
              "default": null,
              "kind": "keyword-only",
              "name": "backend"
            }
          ],
          "path": "spectralbridge.drone_production.stage_drone_package",
          "signature": "stage_drone_package(package: RemoteDronePackage, *, source: str, staging_dir: str | Path, backend: RemoteCollectionBackend) -> StagedDroneInput",
          "summary": "Download or reuse one complete H5 while preserving ExportPackage layout.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Stage every eligible H5; campaign runners normally stage one at a time.\n\nParameters\n----------\ninventory : DroneCollectionInventory\n    DroneCollectionInventory produced by inspect_drone_collection, including eligibility and resolved source provenance.\nstaging_dir : str | Path\n    Local directory for downloaded input packages; stage_drone_collection stages all eligible inputs, unlike the bounded campaign runner.\nbackend : RemoteCollectionBackend | None, default=None\n    RemoteCollectionBackend implementation; None selects the normal noninteractive gocmd adapter.\n\nReturns\n-------\ntuple[StagedDroneInput, ...]\n    StagedDroneInput records for every eligible package; unlike the campaign runner, this stages the full eligible inventory.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.stage_drone_collection",
            "spectralbridge.drone_production.stage_drone_collection"
          ],
          "kind": "function",
          "line": 1412,
          "methods": [],
          "name": "stage_drone_collection",
          "parameters": [
            {
              "annotation": "DroneCollectionInventory",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "inventory"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "staging_dir"
            },
            {
              "annotation": "RemoteCollectionBackend | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "backend"
            }
          ],
          "path": "spectralbridge.drone_production.stage_drone_collection",
          "signature": "stage_drone_collection(inventory: DroneCollectionInventory, *, staging_dir: str | Path, backend: RemoteCollectionBackend | None=None) -> tuple[StagedDroneInput, ...]",
          "summary": "Stage every eligible H5; campaign runners normally stage one at a time.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1451,
          "methods": [],
          "name": "_write_campaign_state",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "state_dir"
            },
            {
              "annotation": "Sequence[DroneFlightStatus]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "statuses"
            }
          ],
          "path": "spectralbridge.drone_production._write_campaign_state",
          "signature": "_write_campaign_state(state_dir: Path, statuses: Sequence[DroneFlightStatus]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Stage and run independent restart-safe drone producer checkpoints.\n\nParameters\n----------\nsource : DroneSource\n    Remote collection root, year-bound source mapping, or supported source specification; inspect_drone_collection resolves it before transfer.\nwork_dir : str | Path\n    Local campaign workspace containing staging, flight outputs and restart/status records.\nyears : Sequence[int] | None, default=None\n    Requested acquisition years used to resolve sources and verify campaign completeness.\nmanifest : str | Path | None, default=None\n    Existing flight manifest providing acquisition identity/time; None uses supported discovery or embedded metadata.\nbackend : RemoteCollectionBackend | None, default=None\n    RemoteCollectionBackend implementation; None selects the normal noninteractive gocmd adapter.\nconfig : DroneCampaignConfig | None, default=None\n    Configuration object for this workflow; None selects the documented defaults of its configuration class.\n\nReturns\n-------\nDroneCampaignResult\n    Per-flight outcomes, inventory, status and restart/output locations; inspect completeness before population analysis.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\nRequires a configured remote source, acquisition manifest and suitable local storage; source packages are staged one at a time.\n\n>>> from spectralbridge import run_drone_campaign\n>>> result = run_drone_campaign(remote_source, work_dir=work_dir, years=(2025,))  # doctest: +SKIP",
          "examples": [],
          "exports": [
            "spectralbridge.run_drone_campaign",
            "spectralbridge.drone_production.run_drone_campaign"
          ],
          "kind": "function",
          "line": 1460,
          "methods": [],
          "name": "run_drone_campaign",
          "parameters": [
            {
              "annotation": "DroneSource",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "work_dir"
            },
            {
              "annotation": "Sequence[int] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "years"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "manifest"
            },
            {
              "annotation": "RemoteCollectionBackend | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "backend"
            },
            {
              "annotation": "DroneCampaignConfig | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.drone_production.run_drone_campaign",
          "signature": "run_drone_campaign(source: DroneSource, *, work_dir: str | Path, years: Sequence[int] | None=None, manifest: str | Path | None=None, backend: RemoteCollectionBackend | None=None, config: DroneCampaignConfig | None=None) -> DroneCampaignResult",
          "summary": "Stage and run independent restart-safe drone producer checkpoints.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1695,
          "methods": [],
          "name": "_copy_result_tree",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "destination"
            }
          ],
          "path": "spectralbridge.drone_production._copy_result_tree",
          "signature": "_copy_result_tree(source: Path, destination: Path) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1713,
          "methods": [],
          "name": "_default_result_name",
          "parameters": [
            {
              "annotation": "DroneSource",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": "Sequence[int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "years"
            }
          ],
          "path": "spectralbridge.drone_production._default_result_name",
          "signature": "_default_result_name(source: DroneSource, years: Sequence[int]) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1725,
          "methods": [],
          "name": "_package_is_valid",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "package_dir"
            }
          ],
          "path": "spectralbridge.drone_production._package_is_valid",
          "signature": "_package_is_valid(package_dir: Path) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1741,
          "methods": [],
          "name": "_campaign_identity_sha256",
          "parameters": [
            {
              "annotation": "DroneCampaignResult",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "campaign"
            }
          ],
          "path": "spectralbridge.drone_production._campaign_identity_sha256",
          "signature": "_campaign_identity_sha256(campaign: DroneCampaignResult) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1762,
          "methods": [],
          "name": "_package_matches_campaign",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "package_dir"
            },
            {
              "annotation": "DroneCampaignResult",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "campaign"
            }
          ],
          "path": "spectralbridge.drone_production._package_matches_campaign",
          "signature": "_package_matches_campaign(package_dir: Path, campaign: DroneCampaignResult) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1778,
          "methods": [],
          "name": "_archive_stale_package",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "package_dir"
            }
          ],
          "path": "spectralbridge.drone_production._archive_stale_package",
          "signature": "_archive_stale_package(package_dir: Path) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Build a compact, checksummed closeout package without raw or cache data.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_production.package_drone_bulk_results"
          ],
          "kind": "function",
          "line": 1791,
          "methods": [],
          "name": "package_drone_bulk_results",
          "parameters": [
            {
              "annotation": "DroneCampaignResult",
              "default": null,
              "kind": "keyword-only",
              "name": "campaign"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "preflight_output"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "bulk_output"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "package_dir"
            }
          ],
          "path": "spectralbridge.drone_production.package_drone_bulk_results",
          "signature": "package_drone_bulk_results(*, campaign: DroneCampaignResult, preflight_output: str | Path, bulk_output: str | Path, package_dir: str | Path) -> Path",
          "summary": "Build a compact, checksummed closeout package without raw or cache data.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1874,
          "methods": [],
          "name": "_recursive_remote_files",
          "parameters": [
            {
              "annotation": "RemoteCollectionBackend",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "backend"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.drone_production._recursive_remote_files",
          "signature": "_recursive_remote_files(backend: RemoteCollectionBackend, root: str) -> dict[str, RemoteEntry]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Verify every packaged file remotely by presence and size/checksum metadata.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_production.verify_uploaded_results"
          ],
          "kind": "function",
          "line": 1890,
          "methods": [],
          "name": "verify_uploaded_results",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "local_package"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "remote_path"
            },
            {
              "annotation": "RemoteCollectionBackend",
              "default": null,
              "kind": "keyword-only",
              "name": "backend"
            }
          ],
          "path": "spectralbridge.drone_production.verify_uploaded_results",
          "signature": "verify_uploaded_results(local_package: str | Path, remote_path: str, *, backend: RemoteCollectionBackend) -> dict[str, Any]",
          "summary": "Verify every packaged file remotely by presence and size/checksum metadata.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1931,
          "methods": [],
          "name": "_incomplete_campaign_message",
          "parameters": [
            {
              "annotation": "DroneCampaignResult",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "campaign"
            }
          ],
          "path": "spectralbridge.drone_production._incomplete_campaign_message",
          "signature": "_incomplete_campaign_message(campaign: DroneCampaignResult) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Require bulk discovery to see exactly the campaign's validated identities.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1957,
          "methods": [],
          "name": "_validate_campaign_bulk_population",
          "parameters": [
            {
              "annotation": "DroneCampaignResult",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "campaign"
            }
          ],
          "path": "spectralbridge.drone_production._validate_campaign_bulk_population",
          "signature": "_validate_campaign_bulk_population(campaign: DroneCampaignResult) -> None",
          "summary": "Require bulk discovery to see exactly the campaign's validated identities.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Run remote inventory through producer, bulk, reporting, and optional upload.\n\nParameters\n----------\nsource : DroneSource\n    Remote collection root, year-bound source mapping, or supported source specification; inspect_drone_collection resolves it before transfer.\nyears : Sequence[int]\n    Requested acquisition years used to resolve sources and verify campaign completeness.\nwork_dir : str | Path\n    Local campaign workspace containing staging, flight outputs and restart/status records.\nmanifest : str | Path | None, default=None\n    Existing flight manifest providing acquisition identity/time; None uses supported discovery or embedded metadata.\nbackend : RemoteCollectionBackend | None, default=None\n    RemoteCollectionBackend implementation; None selects the normal noninteractive gocmd adapter.\nconfig : DroneCampaignConfig | None, default=None\n    Configuration object for this workflow; None selects the documented defaults of its configuration class.\nupload_results : bool, default=False\n    Upload and verify the completed compact result package at its resolved remote destination; False keeps results local.\nrequire_complete_campaign : bool, default=True\n    Require all expected eligible flights to be bulk-ready before population analysis; prevents silent partial-population claims.\n\nReturns\n-------\nBulkProductionResult\n    Inventory/campaign, preflight, bulk and summary results plus local/remote package locations.\n\nRaises\n------\nDroneCampaignIncompleteError\n    If required campaign completeness or the producer-to-bulk population gate fails.\nFileExistsError\n    If a protected destination already exists or conflicts with the requested product.\nRuntimeError\n    If required processing or artifact validation cannot complete.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\nRequires real remote source data and complete producer inputs. Upload is an explicit separate choice.\n\n>>> from spectralbridge import run_drone_bulk_production\n>>> result = run_drone_bulk_production(source=remote_source, years=(2025,), work_dir=work_dir, upload_results=False)  # doctest: +SKIP",
          "examples": [],
          "exports": [
            "spectralbridge.run_drone_bulk_production",
            "spectralbridge.drone_production.run_drone_bulk_production"
          ],
          "kind": "function",
          "line": 1984,
          "methods": [],
          "name": "run_drone_bulk_production",
          "parameters": [
            {
              "annotation": "DroneSource",
              "default": null,
              "kind": "keyword-only",
              "name": "source"
            },
            {
              "annotation": "Sequence[int]",
              "default": null,
              "kind": "keyword-only",
              "name": "years"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "work_dir"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "manifest"
            },
            {
              "annotation": "RemoteCollectionBackend | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "backend"
            },
            {
              "annotation": "DroneCampaignConfig | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "upload_results"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "require_complete_campaign"
            }
          ],
          "path": "spectralbridge.drone_production.run_drone_bulk_production",
          "signature": "run_drone_bulk_production(*, source: DroneSource, years: Sequence[int], work_dir: str | Path, manifest: str | Path | None=None, backend: RemoteCollectionBackend | None=None, config: DroneCampaignConfig | None=None, upload_results: bool=False, require_complete_campaign: bool=True) -> BulkProductionResult",
          "summary": "Run remote inventory through producer, bulk, reporting, and optional upload.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/drone_production.py",
      "sha256": "3f4a5de9a7e4ef43a95d95a65551693fb24bae6fa59d92d36da68fd0246895a6"
    },
    {
      "area": "drone",
      "constants": [
        {
          "annotation": null,
          "name": "DRONE_TRANSLATION_PUBLICATION_PANEL_COUNT",
          "value": "3"
        }
      ],
      "declared_exports": [
        "DRONE_TRANSLATION_PUBLICATION_PANEL_COUNT",
        "render_common_support_comparison",
        "render_drone_translation_publication",
        "render_drone_translation_qa"
      ],
      "docstring": "Standalone translation and optional common-support QA for drone runs.",
      "export_expressions": [
        "__all__ = ['DRONE_TRANSLATION_PUBLICATION_PANEL_COUNT', 'render_common_support_comparison', 'render_drone_translation_publication', 'render_drone_translation_qa']"
      ],
      "imports": {
        "Any": "typing.Any",
        "DEFAULT_QA_STYLE": "spectralbridge.qa_style.DEFAULT_QA_STYLE",
        "DroneTranslationPlan": "spectralbridge.drone_translation.DroneTranslationPlan",
        "Path": "pathlib.Path",
        "SENSOR_COLORS": "spectralbridge.qa_style.SENSOR_COLORS",
        "STATUS_COLORS": "spectralbridge.qa_style.STATUS_COLORS",
        "annotations": "__future__.annotations",
        "apply_qa_axis_style": "spectralbridge.qa_style.apply_qa_axis_style",
        "datetime": "datetime.datetime",
        "hdr_to_dict": "spectralbridge.envi.hdr_to_dict",
        "memmap_bsq": "spectralbridge.envi.memmap_bsq",
        "sensor_display_label": "spectralbridge.qa_style.sensor_display_label",
        "timezone": "datetime.timezone"
      },
      "module": "spectralbridge.drone_qa",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 31,
          "methods": [],
          "name": "_finite_without_nodata",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "nodata"
            }
          ],
          "path": "spectralbridge.drone_qa._finite_without_nodata",
          "signature": "_finite_without_nodata(values: np.ndarray, nodata: float) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 40,
          "methods": [],
          "name": "_bounded_pair_sample",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "target"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "valid"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "maximum"
            }
          ],
          "path": "spectralbridge.drone_qa._bounded_pair_sample",
          "signature": "_bounded_pair_sample(source: np.ndarray, target: np.ndarray, valid: np.ndarray, *, maximum: int=50000) -> tuple[np.ndarray, np.ndarray]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render native-corrected versus Landsat-like translated band QA.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_qa.render_drone_translation_qa"
          ],
          "kind": "function",
          "line": 54,
          "methods": [],
          "name": "render_drone_translation_qa",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_img"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "translated_img"
            },
            {
              "annotation": "DroneTranslationPlan",
              "default": null,
              "kind": "keyword-only",
              "name": "plan"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_result"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_png"
            }
          ],
          "path": "spectralbridge.drone_qa.render_drone_translation_qa",
          "signature": "render_drone_translation_qa(*, corrected_img: str | Path, translated_img: str | Path, plan: DroneTranslationPlan, translation_result: dict[str, Any], output_png: str | Path) -> tuple[Path, Path, dict[str, Any]]",
          "summary": "Render native-corrected versus Landsat-like translated band QA.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render compact actual-Landsat and optional three-way metric summaries.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_qa.render_common_support_comparison"
          ],
          "kind": "function",
          "line": 244,
          "methods": [],
          "name": "render_common_support_comparison",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparison"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_png"
            }
          ],
          "path": "spectralbridge.drone_qa.render_common_support_comparison",
          "signature": "render_common_support_comparison(comparison: dict[str, Any], *, output_png: str | Path) -> tuple[Path, Path]",
          "summary": "Render compact actual-Landsat and optional three-way metric summaries.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render a compact three-panel translation figure from QA JSON values.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_qa.render_drone_translation_publication"
          ],
          "kind": "function",
          "line": 307,
          "methods": [],
          "name": "render_drone_translation_publication",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "translation_qa"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_stem"
            }
          ],
          "path": "spectralbridge.drone_qa.render_drone_translation_publication",
          "signature": "render_drone_translation_publication(translation_qa: dict[str, Any], *, output_stem: str | Path) -> dict[str, str]",
          "summary": "Render a compact three-panel translation figure from QA JSON values.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/drone_qa.py",
      "sha256": "6604a484d9d89c4902425914f7de0176c16ba236b3f2337ffcf26516031b8673"
    },
    {
      "area": "drone",
      "constants": [
        {
          "annotation": null,
          "name": "TRANSLATION_EQUATION",
          "value": "'target = slope * source + intercept'"
        },
        {
          "annotation": null,
          "name": "SUPPORTED_WEIGHTINGS",
          "value": "('pixel_pooled', 'flightline_balanced', 'site_balanced')"
        }
      ],
      "declared_exports": [
        "DroneTranslationBand",
        "DroneTranslationPlan",
        "SUPPORTED_WEIGHTINGS",
        "TRANSLATION_EQUATION",
        "apply_drone_translation",
        "coefficient_rows_for_parquet",
        "enrich_translated_spectral_library",
        "ensure_matched_source_product",
        "load_drone_translation_plans",
        "matched_source_output_stem",
        "translated_output_stem"
      ],
      "docstring": "Wavelength-aware application of reviewed bulk translation coefficients.\n\nThis module is deliberately downstream of drone correction and downstream of\nbulk coefficient estimation.  It never fits coefficients and never performs\nspectral convolution.",
      "export_expressions": [
        "__all__ = ['DroneTranslationBand', 'DroneTranslationPlan', 'SUPPORTED_WEIGHTINGS', 'TRANSLATION_EQUATION', 'apply_drone_translation', 'coefficient_rows_for_parquet', 'ensure_matched_source_product', 'enrich_translated_spectral_library', 'load_drone_translation_plans', 'matched_source_output_stem', 'translated_output_stem']"
      ],
      "imports": {
        "Any": "typing.Any",
        "DEFAULT_PRODUCT_REGISTRY": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
        "EnviWriter": "spectralbridge.envi_writer.EnviWriter",
        "Iterable": "typing.Iterable",
        "PRODUCTION_TRANSLATION_WEIGHTING": "spectralbridge.drone_translation_registry.PRODUCTION_TRANSLATION_WEIGHTING",
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "__version__": "spectralbridge.__version__",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "datetime": "datetime.datetime",
        "get_package_data_path": "spectralbridge.utils.paths.get_package_data_path",
        "hdr_to_dict": "spectralbridge.envi.hdr_to_dict",
        "is_valid_envi_pair": "spectralbridge.utils_checks.is_valid_envi_pair",
        "load_drone_translation_coefficients": "spectralbridge.drone_translation_registry.load_drone_translation_coefficients",
        "memmap_bsq": "spectralbridge.envi.memmap_bsq",
        "packaged_drone_translation_coefficients_path": "spectralbridge.drone_translation_registry.packaged_drone_translation_coefficients_path",
        "sensor_band_identity": "spectralbridge.sensor_pairs.sensor_band_identity",
        "timezone": "datetime.timezone"
      },
      "module": "spectralbridge.drone_translation",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "translation_pair"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "target_sensor"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "coefficient_band_index"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "coefficient_source_band_index"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "native_source_band_index"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "target_band_index"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_spectral_identity"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "target_spectral_identity"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "source_wavelength_nm"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "native_source_wavelength_nm"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "target_wavelength_nm"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "target_fwhm_nm"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "slope"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "intercept"
            },
            {
              "annotation": "float | None",
              "default": null,
              "name": "x_min"
            },
            {
              "annotation": "float | None",
              "default": null,
              "name": "x_max"
            },
            {
              "annotation": "float | None",
              "default": null,
              "name": "x_mean"
            },
            {
              "annotation": "float | None",
              "default": null,
              "name": "r2"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "name": "rmse"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "name": "fitted_correction_percent"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "name": "flightline_slope_iqr"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "name": "site_slope_range"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "name": "worst_loso_r2"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "name": "worst_loso_rmse"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "worst_loso_site"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "()",
              "name": "attention_flags"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "coefficient_status"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "()",
              "name": "coefficient_warnings"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "coefficient_set_version"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "One validated source-band to target-band affine relationship.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.DroneTranslationBand"
          ],
          "kind": "class",
          "line": 65,
          "methods": [],
          "name": "DroneTranslationBand",
          "parameters": [],
          "path": "spectralbridge.drone_translation.DroneTranslationBand",
          "signature": null,
          "summary": "One validated source-band to target-band affine relationship.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "analysis_run_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "analysis_level"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "weighting_description"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "target_sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "translation_pair"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "coefficient_path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "coefficient_sha256"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "evidence_boundary"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "candidate_status"
            },
            {
              "annotation": "tuple[DroneTranslationBand, ...]",
              "default": null,
              "name": "bands"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "coefficient_set_version"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validated coefficients and band mapping for one Landsat target sensor.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.DroneTranslationPlan"
          ],
          "kind": "class",
          "line": 101,
          "methods": [
            {
              "docstring": "",
              "line": 118,
              "name": "output_slug",
              "parameters": [],
              "private": false,
              "signature": "output_slug(self) -> str"
            }
          ],
          "name": "DroneTranslationPlan",
          "parameters": [],
          "path": "spectralbridge.drone_translation.DroneTranslationPlan",
          "signature": null,
          "summary": "Validated coefficients and band mapping for one Landsat target sensor.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/publication_figures/validate_figures.py",
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 122,
          "methods": [],
          "name": "_sha256",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.drone_translation._sha256",
          "signature": "_sha256(path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 130,
          "methods": [],
          "name": "_optional_number",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.drone_translation._optional_number",
          "signature": "_optional_number(value: Any) -> float | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 137,
          "methods": [],
          "name": "_load_parameter_definitions",
          "parameters": [],
          "path": "spectralbridge.drone_translation._load_parameter_definitions",
          "signature": "_load_parameter_definitions() -> dict[str, dict[str, list[float]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 142,
          "methods": [],
          "name": "_load_coefficient_rows",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.drone_translation._load_coefficient_rows",
          "signature": "_load_coefficient_rows(path: Path) -> tuple[pd.DataFrame, dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 212,
          "methods": [],
          "name": "_registry_pairs",
          "parameters": [],
          "path": "spectralbridge.drone_translation._registry_pairs",
          "signature": "_registry_pairs() -> dict[str, TranslationPair]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 216,
          "methods": [],
          "name": "_nearest_native_band",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_wavelengths"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "expected_wavelength"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "expected_fwhm"
            }
          ],
          "path": "spectralbridge.drone_translation._nearest_native_band",
          "signature": "_nearest_native_band(source_wavelengths: np.ndarray, expected_wavelength: float, expected_fwhm: float) -> tuple[int, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 241,
          "methods": [],
          "name": "_validate_required_columns",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "frame"
            }
          ],
          "path": "spectralbridge.drone_translation._validate_required_columns",
          "signature": "_validate_required_columns(frame: pd.DataFrame) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Load and scientifically validate bulk coefficients for drone application.\n\n``weighting`` selects the bulk ``analysis_level`` and defaults to the fixed\nproduction policy, ``site_balanced``. When ``coefficient_path`` is omitted,\nthe packaged versioned production registry is used. When ``target_sensors``\nis omitted, every complete built-in target present in the artifact is\nreturned; the function never dynamically chooses a sensor or weighting.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.load_drone_translation_plans"
          ],
          "kind": "function",
          "line": 265,
          "methods": [],
          "name": "load_drone_translation_plans",
          "parameters": [
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "coefficient_path"
            },
            {
              "annotation": "str",
              "default": "PRODUCTION_TRANSLATION_WEIGHTING",
              "kind": "keyword-only",
              "name": "weighting"
            },
            {
              "annotation": "Sequence[float] | np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "source_wavelengths_nm"
            },
            {
              "annotation": "Iterable[str] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "target_sensors"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "strict"
            }
          ],
          "path": "spectralbridge.drone_translation.load_drone_translation_plans",
          "signature": "load_drone_translation_plans(coefficient_path: str | Path | None=None, *, weighting: str=PRODUCTION_TRANSLATION_WEIGHTING, source_wavelengths_nm: Sequence[float] | np.ndarray, target_sensors: Iterable[str] | None=None, strict: bool=False) -> tuple[DroneTranslationPlan, ...]",
          "summary": "Load and scientifically validate bulk coefficients for drone application.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return a precise, sensor-specific Landsat-like translated ENVI stem.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.translated_output_stem"
          ],
          "kind": "function",
          "line": 499,
          "methods": [],
          "name": "translated_output_stem",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "target_sensor"
            }
          ],
          "path": "spectralbridge.drone_translation.translated_output_stem",
          "signature": "translated_output_stem(flight_dir: str | Path, flight_stem: str, target_sensor: str) -> Path",
          "summary": "Return a precise, sensor-specific Landsat-like translated ENVI stem.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return the canonical matched-MicaSense product stem used by bulk.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.matched_source_output_stem"
          ],
          "kind": "function",
          "line": 513,
          "methods": [],
          "name": "matched_source_output_stem",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_sensor"
            }
          ],
          "path": "spectralbridge.drone_translation.matched_source_output_stem",
          "signature": "matched_source_output_stem(flight_dir: str | Path, flight_stem: str, source_sensor: str) -> Path",
          "summary": "Return the canonical matched-MicaSense product stem used by bulk.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Persist the plan's wavelength-selected source bands for bulk analysis.\n\nThis is a distinct scientific product, not a copy for staging: it is the\nexact source-side band subset paired with the translated Landsat-like\nraster by the existing bulk translation registry.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.ensure_matched_source_product"
          ],
          "kind": "function",
          "line": 527,
          "methods": [],
          "name": "ensure_matched_source_product",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corrected_img"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corrected_hdr"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_stem"
            },
            {
              "annotation": "DroneTranslationPlan",
              "default": null,
              "kind": "keyword-only",
              "name": "plan"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            },
            {
              "annotation": "int",
              "default": "256",
              "kind": "keyword-only",
              "name": "chunk_lines"
            }
          ],
          "path": "spectralbridge.drone_translation.ensure_matched_source_product",
          "signature": "ensure_matched_source_product(corrected_img: str | Path, corrected_hdr: str | Path, *, output_stem: str | Path, plan: DroneTranslationPlan, overwrite: bool=False, chunk_lines: int=256) -> dict[str, Any]",
          "summary": "Persist the plan's wavelength-selected source bands for bulk analysis.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 635,
          "methods": [],
          "name": "_source_fingerprint",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.drone_translation._source_fingerprint",
          "signature": "_source_fingerprint(img_path: Path, hdr_path: Path) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 645,
          "methods": [],
          "name": "_translation_signature",
          "parameters": [
            {
              "annotation": "DroneTranslationPlan",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plan"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_hdr"
            }
          ],
          "path": "spectralbridge.drone_translation._translation_signature",
          "signature": "_translation_signature(plan: DroneTranslationPlan, source_img: Path, source_hdr: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 660,
          "methods": [],
          "name": "_range_compatibility",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": "DroneTranslationBand",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "valid"
            }
          ],
          "path": "spectralbridge.drone_translation._range_compatibility",
          "signature": "_range_compatibility(source: np.ndarray, band: DroneTranslationBand, valid: np.ndarray) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Apply one validated affine plan to a corrected native MicaSense ENVI.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.apply_drone_translation"
          ],
          "kind": "function",
          "line": 691,
          "methods": [],
          "name": "apply_drone_translation",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corrected_img"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corrected_hdr"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_stem"
            },
            {
              "annotation": "DroneTranslationPlan",
              "default": null,
              "kind": "keyword-only",
              "name": "plan"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            },
            {
              "annotation": "int",
              "default": "256",
              "kind": "keyword-only",
              "name": "chunk_lines"
            }
          ],
          "path": "spectralbridge.drone_translation.apply_drone_translation",
          "signature": "apply_drone_translation(corrected_img: str | Path, corrected_hdr: str | Path, *, output_stem: str | Path, plan: DroneTranslationPlan, overwrite: bool=False, chunk_lines: int=256) -> dict[str, Any]",
          "summary": "Apply one validated affine plan to a corrected native MicaSense ENVI.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return compact band-level provenance records for table enrichment.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.coefficient_rows_for_parquet"
          ],
          "kind": "function",
          "line": 945,
          "methods": [],
          "name": "coefficient_rows_for_parquet",
          "parameters": [
            {
              "annotation": "DroneTranslationPlan",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plan"
            }
          ],
          "path": "spectralbridge.drone_translation.coefficient_rows_for_parquet",
          "signature": "coefficient_rows_for_parquet(plan: DroneTranslationPlan) -> list[dict[str, Any]]",
          "summary": "Return compact band-level provenance records for table enrichment.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Attach constant translation/provenance fields without loading pixel rows.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation.enrich_translated_spectral_library"
          ],
          "kind": "function",
          "line": 983,
          "methods": [],
          "name": "enrich_translated_spectral_library",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": "DroneTranslationPlan",
              "default": null,
              "kind": "keyword-only",
              "name": "plan"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_result"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "source_package_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "working_h5_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_micasense_path"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.drone_translation.enrich_translated_spectral_library",
          "signature": "enrich_translated_spectral_library(parquet_path: str | Path, *, plan: DroneTranslationPlan, translation_result: dict[str, Any], source_package_path: str, working_h5_path: str, corrected_micasense_path: str, acquisition_datetime: str | None, overwrite: bool=False) -> Path",
          "summary": "Attach constant translation/provenance fields without loading pixel rows.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/drone_translation.py",
      "sha256": "ca3b65f6745c033ad9f1ea31cc63a8ef27b38a0c24ee204ecb72f26e7bf2a7c0"
    },
    {
      "area": "drone",
      "constants": [
        {
          "annotation": null,
          "name": "DRONE_TRANSLATION_REGISTRY_SCHEMA_VERSION",
          "value": "1"
        },
        {
          "annotation": null,
          "name": "DRONE_TRANSLATION_COEFFICIENT_SET_VERSION",
          "value": "'v1'"
        },
        {
          "annotation": null,
          "name": "DRONE_TRANSLATION_COEFFICIENT_RESOURCE",
          "value": "'drone_translation_coefficients_v1.json'"
        },
        {
          "annotation": null,
          "name": "PRODUCTION_TRANSLATION_WEIGHTING",
          "value": "'site_balanced'"
        },
        {
          "annotation": null,
          "name": "COEFFICIENT_STATUSES",
          "value": "frozenset({'validated', 'caution', 'reject'})"
        },
        {
          "annotation": "Mapping[str, tuple[int, ...]]",
          "name": "EXPECTED_TARGET_BANDS",
          "value": "{'Landsat_5_TM': (1, 2, 3, 4), 'Landsat_7_ETM+': (1, 2, 3, 4), 'Landsat_8_OLI': (1, 2, 3, 4, 5), 'Landsat_9_OLI-2': (1, 2, 3, 4, 5)}"
        },
        {
          "annotation": null,
          "name": "L5_TM_B3_CAUTION",
          "value": "'Bulk-derived translation for MicaSense 668 nm -> Landsat 5 TM B3 showed strong site dependence and poor WREF leave-one-site-out transferability. Treat this band as lower-confidence.'"
        }
      ],
      "declared_exports": [
        "COEFFICIENT_STATUSES",
        "DRONE_TRANSLATION_COEFFICIENT_RESOURCE",
        "DRONE_TRANSLATION_COEFFICIENT_SET_VERSION",
        "DRONE_TRANSLATION_REGISTRY_SCHEMA_VERSION",
        "EXPECTED_TARGET_BANDS",
        "L5_TM_B3_CAUTION",
        "PRODUCTION_TRANSLATION_WEIGHTING",
        "build_drone_translation_coefficient_registry",
        "get_drone_translation_coefficient",
        "load_drone_translation_coefficients",
        "packaged_drone_translation_coefficients_path",
        "validate_drone_translation_coefficients"
      ],
      "docstring": "Build and validate versioned production drone-translation registries.\n\nThe builder consumes only completed compact bulk outputs. It never opens source\nrasters, estimates coefficients, or changes the selected production weighting.",
      "export_expressions": [
        "__all__ = ['COEFFICIENT_STATUSES', 'DRONE_TRANSLATION_COEFFICIENT_RESOURCE', 'DRONE_TRANSLATION_COEFFICIENT_SET_VERSION', 'DRONE_TRANSLATION_REGISTRY_SCHEMA_VERSION', 'EXPECTED_TARGET_BANDS', 'L5_TM_B3_CAUTION', 'PRODUCTION_TRANSLATION_WEIGHTING', 'build_drone_translation_coefficient_registry', 'get_drone_translation_coefficient', 'load_drone_translation_coefficients', 'packaged_drone_translation_coefficients_path', 'validate_drone_translation_coefficients']"
      ],
      "imports": {
        "Any": "typing.Any",
        "DEFAULT_PRODUCT_REGISTRY": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
        "Mapping": "typing.Mapping",
        "Path": "pathlib.Path",
        "SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY": "spectralbridge.sensor_pairs.SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
        "annotations": "__future__.annotations",
        "get_package_data_path": "spectralbridge.utils.paths.get_package_data_path",
        "sensor_band_identity": "spectralbridge.sensor_pairs.sensor_band_identity",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.drone_translation_registry",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/publication_figures/validate_figures.py",
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 110,
          "methods": [],
          "name": "_sha256",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.drone_translation_registry._sha256",
          "signature": "_sha256(path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 118,
          "methods": [],
          "name": "_finite",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "field"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "allow_none"
            }
          ],
          "path": "spectralbridge.drone_translation_registry._finite",
          "signature": "_finite(value: Any, *, field: str, allow_none: bool=False) -> float | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 129,
          "methods": [],
          "name": "_integer",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "field"
            }
          ],
          "path": "spectralbridge.drone_translation_registry._integer",
          "signature": "_integer(value: Any, *, field: str) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 138,
          "methods": [],
          "name": "_key",
          "parameters": [
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            }
          ],
          "path": "spectralbridge.drone_translation_registry._key",
          "signature": "_key(row: Mapping[str, Any]) -> tuple[str, int, int]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 146,
          "methods": [],
          "name": "_rows_by_key",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "frame"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "label"
            }
          ],
          "path": "spectralbridge.drone_translation_registry._rows_by_key",
          "signature": "_rows_by_key(frame: pd.DataFrame, *, label: str) -> dict[tuple[str, int, int], dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 156,
          "methods": [],
          "name": "_expected_pairs",
          "parameters": [],
          "path": "spectralbridge.drone_translation_registry._expected_pairs",
          "signature": "_expected_pairs() -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Require every compact QA row to describe the same physical pairing.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 164,
          "methods": [],
          "name": "_validate_compact_table_identities",
          "parameters": [
            {
              "annotation": "Mapping[tuple[str, int, int], Mapping[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "label"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "expected_pairs"
            }
          ],
          "path": "spectralbridge.drone_translation_registry._validate_compact_table_identities",
          "signature": "_validate_compact_table_identities(rows: Mapping[tuple[str, int, int], Mapping[str, Any]], *, label: str, expected_pairs: Mapping[str, Any]) -> None",
          "summary": "Require every compact QA row to describe the same physical pairing.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return the packaged production registry or an actionable error.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation_registry.packaged_drone_translation_coefficients_path"
          ],
          "kind": "function",
          "line": 190,
          "methods": [],
          "name": "packaged_drone_translation_coefficients_path",
          "parameters": [],
          "path": "spectralbridge.drone_translation_registry.packaged_drone_translation_coefficients_path",
          "signature": "packaged_drone_translation_coefficients_path() -> Path",
          "summary": "Return the packaged production registry or an actionable error.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validate a complete static production coefficient registry.",
          "examples": [],
          "exports": [
            "spectralbridge.drone_translation_registry.validate_drone_translation_coefficients"
          ],
          "kind": "function",
          "line": 204,
          "methods": [],
          "name": "validate_drone_translation_coefficients",
          "parameters": [
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "payload"
            }
          ],
          "path": "spectralbridge.drone_translation_registry.validate_drone_translation_coefficients",
          "signature": "validate_drone_translation_coefficients(payload: Mapping[str, Any]) -> dict[str, Any]",
          "summary": "Validate a complete static production coefficient registry.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Load the packaged or explicitly supplied static production registry.\n\nParameters\n----------\npath : str | Path | None, default=None\n    Optional coefficient-registry JSON path; None loads the packaged reviewed static registry.\n\nReturns\n-------\ndict[str, Any]\n    Validated versioned registry payload with coefficient records, statuses and provenance.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.load_drone_translation_coefficients",
            "spectralbridge.drone_translation_registry.load_drone_translation_coefficients"
          ],
          "kind": "function",
          "line": 356,
          "methods": [],
          "name": "load_drone_translation_coefficients",
          "parameters": [
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.drone_translation_registry.load_drone_translation_coefficients",
          "signature": "load_drone_translation_coefficients(path: str | Path | None=None) -> dict[str, Any]",
          "summary": "Load the packaged or explicitly supplied static production registry.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Return one unambiguous production target-band coefficient.\n\nParameters\n----------\ntarget_sensor : str\n    Canonical target sensor key present in the reviewed drone coefficient registry.\ntarget_band : int\n    One-based target sensor band number in the registry; this is not a zero-based array index.\npath : str | Path | None, default=None\n    Optional coefficient-registry JSON path; None loads the packaged reviewed static registry.\n\nReturns\n-------\ndict[str, Any]\n    Exactly one matching target-band coefficient record, including equation, weighting and status metadata.\n\nRaises\n------\nKeyError\n    If the requested sensor/band does not identify exactly one coefficient.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.get_drone_translation_coefficient",
            "spectralbridge.drone_translation_registry.get_drone_translation_coefficient"
          ],
          "kind": "function",
          "line": 397,
          "methods": [],
          "name": "get_drone_translation_coefficient",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "target_sensor"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "target_band"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "path"
            }
          ],
          "path": "spectralbridge.drone_translation_registry.get_drone_translation_coefficient",
          "signature": "get_drone_translation_coefficient(target_sensor: str, target_band: int, *, path: str | Path | None=None) -> dict[str, Any]",
          "summary": "Return one unambiguous production target-band coefficient.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Build a static registry from exact compact bulk result artifacts.\n\nParameters\n----------\nbulk_output : str | Path\n    Root of an existing completed bulk run, containing its manifest and compact model tables.\noutput_path : str | Path\n    Destination JSON registry path; existing files are protected unless overwrite is enabled.\ncoefficient_set_version : str, default=DRONE_TRANSLATION_COEFFICIENT_SET_VERSION\n    Version string embedded in the newly built coefficient set and its provenance.\noverwrite : bool, default=False\n    Replace existing requested products; False preserves reusable products or rejects a conflicting destination.\nartifact_paths : Mapping[str, str | Path] | None, default=None\n    Optional mapping overriding known compact bulk artifact paths; unknown keys or mismatched provenance are rejected.\n\nReturns\n-------\nPath\n    Written registry path; coefficients retain compact-source hashes and attention flags.\n\nRaises\n------\nFileExistsError\n    If a protected destination already exists or conflicts with the requested product.\nFileNotFoundError\n    If a required source or completed artifact is absent.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.build_drone_translation_coefficient_registry",
            "spectralbridge.drone_translation_registry.build_drone_translation_coefficient_registry"
          ],
          "kind": "function",
          "line": 443,
          "methods": [],
          "name": "build_drone_translation_coefficient_registry",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bulk_output"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": "DRONE_TRANSLATION_COEFFICIENT_SET_VERSION",
              "kind": "keyword-only",
              "name": "coefficient_set_version"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            },
            {
              "annotation": "Mapping[str, str | Path] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "artifact_paths"
            }
          ],
          "path": "spectralbridge.drone_translation_registry.build_drone_translation_coefficient_registry",
          "signature": "build_drone_translation_coefficient_registry(bulk_output: str | Path, output_path: str | Path, *, coefficient_set_version: str=DRONE_TRANSLATION_COEFFICIENT_SET_VERSION, overwrite: bool=False, artifact_paths: Mapping[str, str | Path] | None=None) -> Path",
          "summary": "Build a static registry from exact compact bulk result artifacts.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/drone_translation_registry.py",
      "sha256": "407bf5d41590e2739305b5cc11d2bd2e09c3a92f91e7e2f4248a04fb8bda381b"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [
        "band_axis_from_header",
        "hdr_to_dict",
        "memmap_bsq",
        "read_envi_cube",
        "to_unitless_reflectance",
        "wavelength_array"
      ],
      "docstring": "Lightweight ENVI header parsing and cube reading utilities.",
      "export_expressions": [
        "__all__ = ['hdr_to_dict', 'band_axis_from_header', 'wavelength_array', 'read_envi_cube', 'memmap_bsq', 'to_unitless_reflectance']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.envi",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 10,
          "methods": [],
          "name": "_coerce_scalar",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.envi._coerce_scalar",
          "signature": "_coerce_scalar(value: str)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 25,
          "methods": [],
          "name": "_parse_wavelength_list",
          "parameters": [
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "val"
            }
          ],
          "path": "spectralbridge.envi._parse_wavelength_list",
          "signature": "_parse_wavelength_list(val: str | None) -> list[float] | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 48,
          "methods": [],
          "name": "_split_envi_block",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.envi._split_envi_block",
          "signature": "_split_envi_block(value: str) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 59,
          "methods": [],
          "name": "_parse_envi_header_tolerant",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.envi._parse_envi_header_tolerant",
          "signature": "_parse_envi_header_tolerant(hdr_path: Path) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Parse an ENVI header, tolerating absent or unparseable wavelength lists where supported.",
          "examples": [],
          "exports": [
            "spectralbridge.envi.hdr_to_dict"
          ],
          "kind": "function",
          "line": 136,
          "methods": [],
          "name": "hdr_to_dict",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.envi.hdr_to_dict",
          "signature": "hdr_to_dict(hdr_path: Path) -> dict[str, Any]",
          "summary": "Parse an ENVI header, tolerating absent or unparseable wavelength lists where supported.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Locate a band-count-matching axis, falling back to the last axis for unmatched three-dimensional arrays.",
          "examples": [],
          "exports": [
            "spectralbridge.envi.band_axis_from_header"
          ],
          "kind": "function",
          "line": 156,
          "methods": [],
          "name": "band_axis_from_header",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "arr"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr"
            }
          ],
          "path": "spectralbridge.envi.band_axis_from_header",
          "signature": "band_axis_from_header(arr: np.ndarray, hdr: dict[str, Any]) -> int",
          "summary": "Locate a band-count-matching axis, falling back to the last axis for unmatched three-dimensional arrays.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read numeric wavelength metadata as an array, returning None when absent or unparseable.",
          "examples": [],
          "exports": [
            "spectralbridge.envi.wavelength_array"
          ],
          "kind": "function",
          "line": 171,
          "methods": [],
          "name": "wavelength_array",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header_dict"
            }
          ],
          "path": "spectralbridge.envi.wavelength_array",
          "signature": "wavelength_array(header_dict: dict[str, Any]) -> np.ndarray | None",
          "summary": "Read numeric wavelength metadata as an array, returning None when absent or unparseable.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 198,
          "methods": [],
          "name": "_dtype_from_header",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.envi._dtype_from_header",
          "signature": "_dtype_from_header(header: dict[str, Any], hdr_path: Path) -> np.dtype",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Open a read-only BSQ memory map shaped (bands, lines, samples) with header-declared dtype and byte order.",
          "examples": [],
          "exports": [
            "spectralbridge.envi.memmap_bsq"
          ],
          "kind": "function",
          "line": 230,
          "methods": [],
          "name": "memmap_bsq",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            }
          ],
          "path": "spectralbridge.envi.memmap_bsq",
          "signature": "memmap_bsq(img_path: Path, header: dict[str, Any]) -> np.memmap",
          "summary": "Open a read-only BSQ memory map shaped (bands, lines, samples) with header-declared dtype and byte order.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read a BSQ ENVI image as float32 in (bands, lines, samples) order without reflectance rescaling.",
          "examples": [],
          "exports": [
            "spectralbridge.envi.read_envi_cube"
          ],
          "kind": "function",
          "line": 249,
          "methods": [],
          "name": "read_envi_cube",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "header"
            }
          ],
          "path": "spectralbridge.envi.read_envi_cube",
          "signature": "read_envi_cube(img_path: Path, header: dict[str, Any] | None=None) -> np.ndarray",
          "summary": "Read a BSQ ENVI image as float32 in (bands, lines, samples) order without reflectance rescaling.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Apply the legacy median heuristic: divide by 10000 when the finite median exceeds 1.5.",
          "examples": [],
          "exports": [
            "spectralbridge.envi.to_unitless_reflectance"
          ],
          "kind": "function",
          "line": 274,
          "methods": [],
          "name": "to_unitless_reflectance",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "arr"
            }
          ],
          "path": "spectralbridge.envi.to_unitless_reflectance",
          "signature": "to_unitless_reflectance(arr: np.ndarray) -> np.ndarray",
          "summary": "Apply the legacy median heuristic: divide by 10000 when the finite median exceeds 1.5.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 293,
          "methods": [],
          "name": "_parse_envi_header",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.envi._parse_envi_header",
          "signature": "_parse_envi_header(hdr_path: Path) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/envi.py",
      "sha256": "09f7c68b629e111a1dd8fc50df71fd1a2da8ea9c4b82708e719415b618144e55"
    },
    {
      "area": "pipelines",
      "constants": [],
      "declared_exports": [],
      "docstring": "Helpers for downloading NEON hyperspectral flight line products.",
      "export_expressions": [],
      "imports": {
        "Iterable": "typing.Iterable",
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "tqdm": "tqdm.tqdm"
      },
      "module": "spectralbridge.envi_download",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Print the available NEON products (utility/debug helper).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 23,
          "methods": [],
          "name": "list_neon_products",
          "parameters": [],
          "path": "spectralbridge.envi_download.list_neon_products",
          "signature": "list_neon_products() -> None",
          "summary": "Print the available NEON products (utility/debug helper).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the file record matching ``flight_line`` (preferring .h5 entries).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 33,
          "methods": [],
          "name": "_find_matching_file",
          "parameters": [
            {
              "annotation": "Iterable[dict]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_line"
            }
          ],
          "path": "spectralbridge.envi_download._find_matching_file",
          "signature": "_find_matching_file(records: Iterable[dict], flight_line: str) -> dict | None",
          "summary": "Return the file record matching ``flight_line`` (preferring .h5 entries).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Download a single NEON flight line HDF5.\n\nParameters\n----------\nsite_code, product_code, year_month, flight_line\n    Identify the desired NEON hyperspectral flight line.\nout_dir\n    Directory where downloads should be written when ``output_path`` is not\n    provided. Created if necessary.\noutput_path\n    Optional explicit destination path for the downloaded file. When\n    provided, the file will always be written to this location.\nsession\n    Optional ``requests.Session`` to reuse HTTP connections.\napi_token\n    Optional NEON Data API token. When omitted, ``NEON_API_TOKEN`` and\n    then ``NEON_TOKEN`` are checked. The token is sent only in the\n    ``X-API-Token`` request header and is never written to disk.\n\nReturns\n-------\n(path, was_downloaded)\n    ``path`` is the on-disk ``Path`` to the flight line. ``was_downloaded``\n    is ``True`` if a new download occurred, ``False`` if the existing file\n    was reused.\n\nRaises\n------\nFileNotFoundError\n    If the requested flight line could not be located in the NEON API\n    response.\nRuntimeError\n    If an HTTP error occurs or the downloaded file is empty.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 48,
          "methods": [],
          "name": "download_neon_file",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "site_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "year_month"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_line"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_dir"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "output_path"
            },
            {
              "annotation": "requests.Session | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "session"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "api_token"
            }
          ],
          "path": "spectralbridge.envi_download.download_neon_file",
          "signature": "download_neon_file(site_code: str, product_code: str, year_month: str, flight_line: str, out_dir: str | Path, *, output_path: str | Path | None=None, session: requests.Session | None=None, api_token: str | None=None) -> tuple[Path, bool]",
          "summary": "Download a single NEON flight line HDF5.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Download one or more NEON flight lines into ``out_dir``.\n\nReturns a list of ``Path`` objects pointing to the downloaded (or reused)\nfiles.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 228,
          "methods": [],
          "name": "download_neon_flight_lines",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "site_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "year_month"
            },
            {
              "annotation": "Sequence[str] | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_lines"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_dir"
            },
            {
              "annotation": "str",
              "default": "'DP1.30006.001'",
              "kind": "positional-or-keyword",
              "name": "product_code"
            }
          ],
          "path": "spectralbridge.envi_download.download_neon_flight_lines",
          "signature": "download_neon_flight_lines(site_code: str, year_month: str, flight_lines: Sequence[str] | str, out_dir: str | Path, product_code: str='DP1.30006.001') -> list[Path]",
          "summary": "Download one or more NEON flight lines into ``out_dir``.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/envi_download.py",
      "sha256": "ff1327ed7165d33f8495c33f445423fdc34bf66f7b37a3b6e63eb92ad0a480e8"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [],
      "docstring": "ENVI header and float32 BSQ writing helpers adapted from HyTools.\n\nThe current implementation is modified and narrowed to SpectralBridge's output\ncontracts; its implementation lineage remains documented.\n\nHyTools: Hyperspectral image processing library\nCopyright (C) 2021 University of Wisconsin\nAuthors named in the relevant source notices: Adam Chlus, Zhiwei Ye, Philip Townsend.\nLicense: GNU General Public License, version 3\nUpstream: https://github.com/EnSpec/hytools\nAudited revision: 31286d64541791a9815d29443a33726fa4d54031\n\nModified for SpectralBridge. See ``LICENSE``, ``NOTICE``, and\n``HYTOOLS_PROVENANCE.md``.",
      "export_expressions": [],
      "imports": {
        "Any": "typing.Any",
        "Dict": "typing.Dict",
        "List": "typing.List",
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "Union": "typing.Union",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.envi_writer",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Convert numpy scalar types into native Python numbers or strings.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 24,
          "methods": [],
          "name": "_to_python_scalar",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.envi_writer._to_python_scalar",
          "signature": "_to_python_scalar(value: Any) -> Union[int, float, str]",
          "summary": "Convert numpy scalar types into native Python numbers or strings.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Format a sequence of values into an ENVI-style list string.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 31,
          "methods": [],
          "name": "_format_envi_list",
          "parameters": [
            {
              "annotation": "Sequence[Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.envi_writer._format_envi_list",
          "signature": "_format_envi_list(values: Sequence[Any]) -> str",
          "summary": "Format a sequence of values into an ENVI-style list string.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Build the ENVI .hdr file text from a header_dict.\n\nAttribution:\n    Adapted from hytools.io.envi.write_envi_header() and\n    hytools.io.envi.envi_header_from_neon() (GPLv3).\n    HyTools Authors: Adam Chlus, Zhiwei Ye, Philip Townsend.\n    This simplified version is NEON-only and assumes BSQ float32 output.\n\nParameters\n----------\nheader_dict : dict\n    A dictionary with at least the following keys:\n        'samples'            int\n        'lines'              int\n        'bands'              int\n        'interleave'         str   (must be 'bsq' or 'BSQ')\n        'data type'          int   (ENVI code 4 -> float32)\n        'byte order'         int   (0 for little endian)\n        'wavelength'         list[float]\n        'fwhm'               list[float]\n        'wavelength units'   str\n        'map info'           list or str\n        'projection'         str\n\n    You may also include optional keys like:\n        'description'\n        'transform'\n        'ulx'\n        'uly'\n\nReturns\n-------\nstr\n    A string containing the full .hdr contents to be written to disk.\n\nBehavior\n--------\n    - You MUST write a header that ENVI (and typical GDAL ENVI readers)\n      understand.\n    - The header should begin with \"ENVI\" on the first line.\n    - Then list key/value lines in ENVI style, for example:\n\n        samples = 1000\n        lines   = 500\n        bands   = 426\n        data type = 4\n        interleave = bsq\n        byte order = 0\n        map info = {UTM, 1.0, 1.0, 500000.0, 4420000.0, 1.0, -1.0, 13, North, WGS-84}\n        projection = <...WKT or similar...>\n        wavelength = { 400.0, 401.0, ... }\n        fwhm = { ... }\n        wavelength units = Nanometers\n\n    - You MUST serialize lists (like wavelength, fwhm) into ENVI-style\n      curly-brace lists separated by commas.\n    - You MUST serialize \"map info\" consistently with how hytools writes it.\n      \"map info\" in ENVI is written as:\n\n          map info = {UTM, 1.0, 1.0, <ulx>, <uly>, <xres>, <yres>, <utm zone>, North, WGS-84}\n\n      If header_dict['map info'] is already such a list, just join it.\n\n    - Include 'description' in the header if header_dict has it. Wrap it\n      ENVI-style like:\n          description = { BRDF+topographic corrected reflectance ... }\n\nImplementation details:\n    - Make sure numeric types are converted to Python floats/ints\n      before string join, so numpy scalars don't show up weird.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 43,
          "methods": [],
          "name": "build_envi_header_text",
          "parameters": [
            {
              "annotation": "Dict",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header_dict"
            }
          ],
          "path": "spectralbridge.envi_writer.build_envi_header_text",
          "signature": "build_envi_header_text(header_dict: Dict) -> str",
          "summary": "Build the ENVI .hdr file text from a header_dict.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "EnviWriter assembles a corrected hyperspectral cube into a BSQ ENVI file.\n\nPortions adapted from hytools.io.envi (GPLv3).\nHyTools Authors: Adam Chlus, Zhiwei Ye, Philip Townsend.\nThis version is NEON-only (no GLT, no NetCDF).\n\nUsage pattern:\n\n    header = cube.build_envi_header()\n    # optionally edit header['description'] before writing\n\n    writer = EnviWriter(out_stem=Path(\"/path/to/output_stem\"),\n                        header_dict=header)\n\n    for (ys, ye, xs, xe, chunk) in cube.iter_chunks(...):\n        corrected = ... # run apply_topo_correct(), apply_brdf_correct(), etc.\n        corrected = corrected.astype(\"float32\", copy=False)\n        writer.write_chunk(corrected, ys, xs)\n\n    writer.close()\n\nAfter close(), you'll have:\n    /path/to/output_stem.img\n    /path/to/output_stem.hdr",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 198,
          "methods": [
            {
              "docstring": "Parameters\n----------\nout_stem : Path\n    Output path WITHOUT extension.\n    We will create:\n        <out_stem>.img\n        <out_stem>.hdr\n\nheader_dict : dict\n    The header dict produced by NeonCube.build_envi_header(), possibly\n    updated to include a human-readable description like\n    \"BRDF+topographic corrected reflectance\".\n\nBehavior\n--------\n- Extract:\n      samples = header_dict[\"samples\"]\n      lines   = header_dict[\"lines\"]\n      bands   = header_dict[\"bands\"]\n\n- Allocate a memory-mapped array shaped:\n      (bands, lines, samples)\n  dtype float32, order='C'.\n\n  This is a BSQ layout: band-major on disk.\n\n- Store that memmap in self._mm so we can fill it incrementally.\n- Store header_dict and out_stem so we can write the .hdr in close().\n\nImplementation detail:\n    Use numpy.memmap with mode='w+'.\n    The filename MUST be f\"{out_stem}.img\".",
              "line": 226,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "out_stem"
                },
                {
                  "annotation": "Dict",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "header_dict"
                }
              ],
              "private": true,
              "signature": "__init__(self, out_stem: Path, header_dict: Dict) -> None"
            },
            {
              "docstring": "Write a corrected reflectance chunk into the BSQ memmap.\n\nParameters\n----------\ncorrected_chunk : np.ndarray\n    Shape (y_size, x_size, bands), float32.\n    This chunk is aligned with cube.data[ys:ys+y_size, xs:xs+x_size, :].\n\nys : int\n    Row offset (top of chunk in full image coordinates).\n\nxs : int\n    Column offset (left of chunk in full image coordinates).\n\nBehavior\n--------\nFor each band index b:\n    self._mm[b,\n             ys:ys+y_size,\n             xs:xs+x_size] = corrected_chunk[:, :, b]\n\nYou MUST do band-major assignment to match BSQ layout.\n\nThis method should NOT flush to disk; flushing happens in close().\n\nAssumptions:\n    - corrected_chunk is already float32\n    - corrected_chunk has no-data values already handled",
              "line": 280,
              "name": "write_chunk",
              "parameters": [
                {
                  "annotation": "np.ndarray",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "corrected_chunk"
                },
                {
                  "annotation": "int",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "ys"
                },
                {
                  "annotation": "int",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "xs"
                }
              ],
              "private": false,
              "signature": "write_chunk(self, corrected_chunk: np.ndarray, ys: int, xs: int) -> None"
            },
            {
              "docstring": "Finalize the ENVI output:\n\nBehavior\n--------\n- Flush/close the memmap.\n- Write the .hdr file next to the .img file using the\n  build_envi_header_text() function.\n\nImplementation detail:\n    - .img path is f\"{self.out_stem}.img\"\n    - .hdr path is f\"{self.out_stem}.hdr\"\n    - build the header string via build_envi_header_text(self.header_dict)\n      and write it as ASCII/UTF-8 text.",
              "line": 330,
              "name": "close",
              "parameters": [],
              "private": false,
              "signature": "close(self) -> None"
            }
          ],
          "name": "EnviWriter",
          "parameters": [],
          "path": "spectralbridge.envi_writer.EnviWriter",
          "signature": null,
          "summary": "EnviWriter assembles a corrected hyperspectral cube into a BSQ ENVI file.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/envi_writer.py",
      "sha256": "8abf2a40a3e81f40c0f7406bd7620aebbbc82ec29b19e0a1a19f71ff4b1ccd98"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [],
      "docstring": "ENVI/Parquet export support and geospatial metadata helpers.",
      "export_expressions": [],
      "imports": {},
      "module": "spectralbridge.exports",
      "objects": [],
      "path": "src/spectralbridge/exports/__init__.py",
      "sha256": "9ae18ac71b06a352787c8a70113e5832854ca35cfe854578dd603fa299d3f46e"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "Tuple": "typing.Tuple",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "import_module": "importlib.import_module"
      },
      "module": "spectralbridge.exports.geo_utils",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 10,
          "methods": [
            {
              "docstring": "",
              "line": 11,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "module_path"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "attr"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "install_hint"
                }
              ],
              "private": true,
              "signature": "__init__(self, module_path: str, *, attr: str | None=None, install_hint: str)"
            },
            {
              "docstring": "",
              "line": 17,
              "name": "_load",
              "parameters": [],
              "private": true,
              "signature": "_load(self)"
            },
            {
              "docstring": "",
              "line": 29,
              "name": "__getattr__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "name"
                }
              ],
              "private": true,
              "signature": "__getattr__(self, name)"
            }
          ],
          "name": "_LazyModule",
          "parameters": [],
          "path": "spectralbridge.exports.geo_utils._LazyModule",
          "signature": null,
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [
            {
              "annotation": "Optional[int]",
              "default": null,
              "name": "crs_epsg"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "a"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "e"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "c"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "f"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Store EPSG and affine pixel geometry needed for export-coordinate columns.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 37,
          "methods": [],
          "name": "GeoContext",
          "parameters": [],
          "path": "spectralbridge.exports.geo_utils.GeoContext",
          "signature": null,
          "summary": "Store EPSG and affine pixel geometry needed for export-coordinate columns.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 47,
          "methods": [],
          "name": "_get_val",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "block"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "key"
            }
          ],
          "path": "spectralbridge.exports.geo_utils._get_val",
          "signature": "_get_val(block: str, key: str) -> Optional[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 52,
          "methods": [],
          "name": "_parse_map_info",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "block"
            }
          ],
          "path": "spectralbridge.exports.geo_utils._parse_map_info",
          "signature": "_parse_map_info(block: str) -> Optional[Tuple[float, float, float, float]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 69,
          "methods": [],
          "name": "_guess_epsg",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "block"
            }
          ],
          "path": "spectralbridge.exports.geo_utils._guess_epsg",
          "signature": "_guess_epsg(block: str) -> Optional[int]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Extract pixel size, origin and an inferred EPSG code from an existing ENVI header; return None without map information.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 90,
          "methods": [],
          "name": "load_geo_from_hdr",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.exports.geo_utils.load_geo_from_hdr",
          "signature": "load_geo_from_hdr(hdr_path: Path) -> Optional[GeoContext]",
          "summary": "Extract pixel size, origin and an inferred EPSG code from an existing ENVI header; return None without map information.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fill x,y from row/col + affine if needed; then lon,lat from x,y + CRS.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 106,
          "methods": [],
          "name": "add_lonlat_inplace",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df"
            },
            {
              "annotation": "Optional[GeoContext]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "geo"
            }
          ],
          "path": "spectralbridge.exports.geo_utils.add_lonlat_inplace",
          "signature": "add_lonlat_inplace(df, geo: Optional[GeoContext])",
          "summary": "Fill x,y from row/col + affine if needed; then lon,lat from x,y + CRS.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Write a dataframe to parquet after enriching lon/lat from an ENVI header.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 121,
          "methods": [],
          "name": "write_parquet_with_lonlat",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df_long"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_parquet"
            },
            {
              "annotation": "Optional[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.exports.geo_utils.write_parquet_with_lonlat",
          "signature": "write_parquet_with_lonlat(df_long, out_parquet: Path, hdr_path: Optional[Path])",
          "summary": "Write a dataframe to parquet after enriching lon/lat from an ENVI header.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/exports/geo_utils.py",
      "sha256": "dfe490f936e05f4f3ab5f6ecd01977c632ef9dc8575524b2fc60712087c2067e"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "GeoContext": "spectralbridge.exports.geo_utils.GeoContext",
        "List": "typing.List",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "Tuple": "typing.Tuple",
        "add_lonlat_inplace": "spectralbridge.exports.geo_utils.add_lonlat_inplace",
        "annotations": "__future__.annotations",
        "import_module": "importlib.import_module",
        "write_parquet_with_lonlat": "spectralbridge.exports.geo_utils.write_parquet_with_lonlat"
      },
      "module": "spectralbridge.exports.schema_utils",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Delay importing optional heavy dependencies until they are accessed.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 15,
          "methods": [
            {
              "docstring": "",
              "line": 18,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "module_path"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "attr"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "install_hint"
                }
              ],
              "private": true,
              "signature": "__init__(self, module_path: str, *, attr: str | None=None, install_hint: str)"
            },
            {
              "docstring": "",
              "line": 24,
              "name": "_load",
              "parameters": [],
              "private": true,
              "signature": "_load(self)"
            },
            {
              "docstring": "",
              "line": 36,
              "name": "__getattr__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "name"
                }
              ],
              "private": true,
              "signature": "__getattr__(self, name)"
            }
          ],
          "name": "_LazyModule",
          "parameters": [],
          "path": "spectralbridge.exports.schema_utils._LazyModule",
          "signature": null,
          "summary": "Delay importing optional heavy dependencies until they are accessed.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Infer stage from a filename (without undarkened handling).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 56,
          "methods": [],
          "name": "_infer_base_stage",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.exports.schema_utils._infer_base_stage",
          "signature": "_infer_base_stage(name: str) -> str",
          "summary": "Infer stage from a filename (without undarkened handling).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Infer the stage key (column prefix) from a filename.\n\nFiles with an ``_undarkened_envi`` suffix are treated as convolution-only\ncubes (no brightness offset). They inherit the base stage key and append\n``_undarkened`` so they remain distinct from the darkened products.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 86,
          "methods": [],
          "name": "infer_stage_from_name",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.exports.schema_utils.infer_stage_from_name",
          "signature": "infer_stage_from_name(name: str) -> str",
          "summary": "Infer the stage key (column prefix) from a filename.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Rebuild DataFrame with non-spectral first, then spectral columns sorted by wavelength\nand renamed as: <stage>_b###_wl####nm",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 104,
          "methods": [],
          "name": "sort_and_rename_spectral_columns",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage_key"
            },
            {
              "annotation": "List[int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths_nm"
            }
          ],
          "path": "spectralbridge.exports.schema_utils.sort_and_rename_spectral_columns",
          "signature": "sort_and_rename_spectral_columns(df: pd.DataFrame, stage_key: str, wavelengths_nm: List[int]) -> pd.DataFrame",
          "summary": "Rebuild DataFrame with non-spectral first, then spectral columns sorted by wavelength",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Parse ENVI header text for numeric wavelengths, return nm ints or None.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 139,
          "methods": [],
          "name": "parse_envi_wavelengths_nm",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_text"
            }
          ],
          "path": "spectralbridge.exports.schema_utils.parse_envi_wavelengths_nm",
          "signature": "parse_envi_wavelengths_nm(hdr_text: str) -> Optional[List[int]]",
          "summary": "Parse ENVI header text for numeric wavelengths, return nm ints or None.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Transform planar x,y to lon,lat. Returns (lon, lat).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 165,
          "methods": [],
          "name": "compute_lonlat",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "xs"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ys"
            },
            {
              "annotation": "int | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "src_epsg"
            }
          ],
          "path": "spectralbridge.exports.schema_utils.compute_lonlat",
          "signature": "compute_lonlat(xs: np.ndarray, ys: np.ndarray, src_epsg: int | str) -> Tuple[np.ndarray, np.ndarray]",
          "summary": "Transform planar x,y to lon,lat. Returns (lon, lat).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 173,
          "methods": [],
          "name": "_maybe_epsg_int",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.exports.schema_utils._maybe_epsg_int",
          "signature": "_maybe_epsg_int(value) -> Optional[int]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 183,
          "methods": [],
          "name": "_geo_from_transform",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "transform"
            },
            {
              "annotation": "int | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "crs_epsg"
            }
          ],
          "path": "spectralbridge.exports.schema_utils._geo_from_transform",
          "signature": "_geo_from_transform(transform, crs_epsg: int | str) -> Optional[GeoContext]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Make sure df has x, y, lon, lat columns. If missing, compute from row/col with affine transform and the CRS.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 196,
          "methods": [],
          "name": "ensure_coord_columns",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "transform"
            },
            {
              "annotation": "int | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "crs_epsg"
            }
          ],
          "path": "spectralbridge.exports.schema_utils.ensure_coord_columns",
          "signature": "ensure_coord_columns(df: pd.DataFrame, transform, crs_epsg: int | str) -> pd.DataFrame",
          "summary": "Make sure df has x, y, lon, lat columns. If missing, compute from row/col with affine transform and the CRS.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Standardized Parquet writer:\n  - ensures x,y,lon,lat present\n  - ensures spectral columns sorted and renamed as <stage>_b###_wl####nm",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 221,
          "methods": [],
          "name": "write_parquet_standardized",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "transform"
            },
            {
              "annotation": "int | str",
              "default": "32613",
              "kind": "positional-or-keyword",
              "name": "crs_epsg"
            }
          ],
          "path": "spectralbridge.exports.schema_utils.write_parquet_standardized",
          "signature": "write_parquet_standardized(df: pd.DataFrame, out_path: Path, hdr_path: Path, transform=None, crs_epsg: int | str=32613)",
          "summary": "Standardized Parquet writer:",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/exports/schema_utils.py",
      "sha256": "b9b855cc5d2e17e143d66f99efc3585c7a974d952dfa1ff62ea6568b86813ddd"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "DataFile": "spectralbridge.file_types.DataFile",
        "EndmembersCSVFile": "spectralbridge.file_types.EndmembersCSVFile",
        "List": "typing.List",
        "MaskedSpectralCSVFile": "spectralbridge.file_types.MaskedSpectralCSVFile",
        "NEONReflectanceAncillaryENVIFile": "spectralbridge.file_types.NEONReflectanceAncillaryENVIFile",
        "NEONReflectanceAncillaryENVIHDRFile": "spectralbridge.file_types.NEONReflectanceAncillaryENVIHDRFile",
        "NEONReflectanceBRDFCorrectedENVIFile": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIFile",
        "NEONReflectanceBRDFCorrectedENVIHDRFile": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIHDRFile",
        "NEONReflectanceBRDFMaskENVIFile": "spectralbridge.file_types.NEONReflectanceBRDFMaskENVIFile",
        "NEONReflectanceBRDFMaskENVIHDRFile": "spectralbridge.file_types.NEONReflectanceBRDFMaskENVIHDRFile",
        "NEONReflectanceCoefficientsFile": "spectralbridge.file_types.NEONReflectanceCoefficientsFile",
        "NEONReflectanceConfigFile": "spectralbridge.file_types.NEONReflectanceConfigFile",
        "NEONReflectanceENVIFile": "spectralbridge.file_types.NEONReflectanceENVIFile",
        "NEONReflectanceENVIHDRFile": "spectralbridge.file_types.NEONReflectanceENVIHDRFile",
        "NEONReflectanceFile": "spectralbridge.file_types.NEONReflectanceFile",
        "NEONReflectanceResampledENVIFile": "spectralbridge.file_types.NEONReflectanceResampledENVIFile",
        "NEONReflectanceResampledHDRFile": "spectralbridge.file_types.NEONReflectanceResampledHDRFile",
        "NEONReflectanceResampledMaskENVIFile": "spectralbridge.file_types.NEONReflectanceResampledMaskENVIFile",
        "NEONReflectanceResampledMaskHDRFile": "spectralbridge.file_types.NEONReflectanceResampledMaskHDRFile",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "SensorType": "spectralbridge.file_types.SensorType",
        "SpectralDataParquetFile": "spectralbridge.file_types.SpectralDataParquetFile",
        "Type": "typing.Type",
        "UnmixingModelBestTIF": "spectralbridge.file_types.UnmixingModelBestTIF",
        "UnmixingModelFractionsTIF": "spectralbridge.file_types.UnmixingModelFractionsTIF",
        "UnmixingModelRMSETIF": "spectralbridge.file_types.UnmixingModelRMSETIF"
      },
      "module": "spectralbridge.file_sort",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 41,
          "methods": [],
          "name": "_require_pandas",
          "parameters": [],
          "path": "spectralbridge.file_sort._require_pandas",
          "signature": "_require_pandas()",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 56,
          "methods": [],
          "name": "_extract_sensor_from_name",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path_str"
            }
          ],
          "path": "spectralbridge.file_sort._extract_sensor_from_name",
          "signature": "_extract_sensor_from_name(path_str: str) -> Optional[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 61,
          "methods": [],
          "name": "_normalize_sensor_label",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor"
            }
          ],
          "path": "spectralbridge.file_sort._normalize_sensor_label",
          "signature": "_normalize_sensor_label(sensor: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 65,
          "methods": [],
          "name": "_is_masked",
          "parameters": [
            {
              "annotation": "DataFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "file_obj"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name_lower"
            }
          ],
          "path": "spectralbridge.file_sort._is_masked",
          "signature": "_is_masked(file_obj: DataFile, name_lower: str) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 88,
          "methods": [],
          "name": "_category_to_folder",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "category"
            }
          ],
          "path": "spectralbridge.file_sort._category_to_folder",
          "signature": "_category_to_folder(category: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return the destination category name for ``file_obj``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 94,
          "methods": [],
          "name": "categorize_file",
          "parameters": [
            {
              "annotation": "DataFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "file_obj"
            }
          ],
          "path": "spectralbridge.file_sort.categorize_file",
          "signature": "categorize_file(file_obj: DataFile) -> str",
          "summary": "Return the destination category name for ``file_obj``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Scans base_folder recursively to find all files matching the defined file types\nand generates a move list with local and iRODS paths.\n\nParameters:\n- base_folder: The path to the base directory to scan\n- destination_folder: The path to the destination folder for sorted files\n- remote_path_prefix: Optional custom path to add after i:/iplant/ for remote paths\n\nReturns:\n- DataFrame with columns ['Source Path', 'Destination Path'] where Source Path is local\nand Destination Path is the iRODS remote path",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 139,
          "methods": [],
          "name": "generate_file_move_list",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "destination_folder"
            },
            {
              "annotation": "str",
              "default": "''",
              "kind": "positional-or-keyword",
              "name": "remote_path_prefix"
            }
          ],
          "path": "spectralbridge.file_sort.generate_file_move_list",
          "signature": "generate_file_move_list(base_folder: str, destination_folder: str, remote_path_prefix: str='') -> 'pd.DataFrame'",
          "summary": "Scans base_folder recursively to find all files matching the defined file types",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/file_sort.py",
      "sha256": "a11fece3aa322f8068e44efb28c58f17244923a58c48126236c9f7c6f4fa4242"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "classify_name": "spectralbridge.sort_core.classify_name"
      },
      "module": "spectralbridge.file_sort_adapter",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Recursively scan a directory and group files by category using classify_name().\nSafe for tests with tmp dirs; no network or external deps.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 5,
          "methods": [],
          "name": "scan_and_categorize",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.file_sort_adapter.scan_and_categorize",
          "signature": "scan_and_categorize(root: Path) -> dict[str, list[Path]]",
          "summary": "Recursively scan a directory and group files by category using classify_name().",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/file_sort_adapter.py",
      "sha256": "a9732294be29baf88584542d82c888cbb9ecf88b82428c97529d55be62a41c7e"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [
        "__all__ = []"
      ],
      "imports": {
        "ClassVar": "typing.ClassVar",
        "Enum": "enum.Enum",
        "List": "typing.List",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "Self": "typing_extensions.Self",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "field": "dataclasses.field"
      },
      "module": "spectralbridge.file_types",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Enumerate sensor-name strings used by the legacy typed filename conventions.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 19,
          "methods": [],
          "name": "SensorType",
          "parameters": [],
          "path": "spectralbridge.file_types.SensorType",
          "signature": null,
          "summary": "Enumerate sensor-name strings used by the legacy typed filename conventions.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "path"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "domain"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "site"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "date"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "time"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "sensor"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "masked"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "convolution"
            },
            {
              "annotation": "re.Pattern",
              "default": "field(default=re.compile('^NEON_(?P<domain>D\\\\d{2})_(?P<site>[A-Z0-9]+)_DP1(?:\\\\.(?P<product>\\\\d{5}\\\\.\\\\d{3}))?_(?:(?P<tile>L\\\\d{3}-\\\\d)_)?(?P<date>\\\\d{8})(?:_(?P<time>\\\\d{6}))?'), init=False, repr=False)",
              "name": "_CANON_RE"
            },
            {
              "annotation": "ClassVar[re.Pattern]",
              "default": "re.compile('')",
              "name": "pattern"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Base class for NEON data files.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 36,
          "methods": [
            {
              "docstring": "",
              "line": 64,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 93,
              "name": "name",
              "parameters": [],
              "private": false,
              "signature": "name(self) -> str"
            },
            {
              "docstring": "",
              "line": 97,
              "name": "directory",
              "parameters": [],
              "private": false,
              "signature": "directory(self) -> Path"
            },
            {
              "docstring": "Return the concrete :class:`Path` for this data file.",
              "line": 101,
              "name": "file_path",
              "parameters": [],
              "private": false,
              "signature": "file_path(self) -> Path"
            },
            {
              "docstring": "",
              "line": 106,
              "name": "match",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "filename"
                }
              ],
              "private": false,
              "signature": "match(cls, filename: str) -> Optional[re.Match]"
            },
            {
              "docstring": "",
              "line": 110,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> Self"
            },
            {
              "docstring": "Recursively find all matching files in a directory.",
              "line": 117,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, directory: Path) -> List[Self]"
            }
          ],
          "name": "DataFile",
          "parameters": [],
          "path": "spectralbridge.file_types.DataFile",
          "signature": null,
          "summary": "Base class for NEON data files.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 126,
          "methods": [],
          "name": "_normalize_product_value",
          "parameters": [
            {
              "annotation": "Optional[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "product"
            }
          ],
          "path": "spectralbridge.file_types._normalize_product_value",
          "signature": "_normalize_product_value(product: Optional[str]) -> Optional[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 132,
          "methods": [],
          "name": "_sensor_from_stem",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.file_types._sensor_from_stem",
          "signature": "_sensor_from_stem(path: Path) -> Optional[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Mixin to handle optional '_masked' suffixes in filenames.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 140,
          "methods": [
            {
              "docstring": "Adjust the class's regex pattern to allow optional '_masked' before file extensions.\nAssumes the original pattern ends with: \\.img$ or \\.hdr$",
              "line": 144,
              "name": "masked_pattern",
              "parameters": [],
              "private": false,
              "signature": "masked_pattern(cls) -> re.Pattern"
            },
            {
              "docstring": "Return True if the filename indicates a masked file.",
              "line": 154,
              "name": "is_masked",
              "parameters": [],
              "private": false,
              "signature": "is_masked(self) -> bool"
            },
            {
              "docstring": "Override match to use the masked-aware pattern.",
              "line": 159,
              "name": "match",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "filename"
                }
              ],
              "private": false,
              "signature": "match(cls, filename: str) -> Optional[re.Match]"
            },
            {
              "docstring": "Return a new Path with '_masked' inserted before the file extension.",
              "line": 164,
              "name": "masked_path",
              "parameters": [],
              "private": false,
              "signature": "masked_path(self) -> Path"
            },
            {
              "docstring": "Return a new instance pointing to the masked version of the file.",
              "line": 170,
              "name": "masked_version",
              "parameters": [],
              "private": false,
              "signature": "masked_version(self) -> Self"
            }
          ],
          "name": "MaskedFileMixin",
          "parameters": [],
          "path": "spectralbridge.file_types.MaskedFileMixin",
          "signature": null,
          "summary": "Mixin to handle optional '_masked' suffixes in filenames.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "str",
              "default": "'reflectance'",
              "name": "descriptor"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "suffix"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a raw reflectance HDF5 product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 180,
          "methods": [
            {
              "docstring": "",
              "line": 231,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 244,
              "name": "_build_instance",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "product"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "tile"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "descriptor"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "date"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "time"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "suffix"
                }
              ],
              "private": true,
              "signature": "_build_instance(cls, *, path: Path, domain: str, site: str, product: str, tile: str, descriptor: str, date: str | None=None, time: str | None=None, suffix: str | None=None) -> 'NEONReflectanceFile'"
            },
            {
              "docstring": "",
              "line": 271,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path | str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path | str) -> 'NEONReflectanceFile'"
            },
            {
              "docstring": "",
              "line": 337,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "positional-or-keyword",
                  "name": "product"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, folder: Path, time: Optional[str]=None, suffix: Optional[str]=None, tile: Optional[str]=None, directional: bool=False, product: str='30006.001') -> 'NEONReflectanceFile'"
            }
          ],
          "name": "NEONReflectanceFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a raw reflectance HDF5 product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Base (uncorrected) NEON reflectance ENVI image.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 364,
          "methods": [
            {
              "docstring": "",
              "line": 370,
              "name": "parse_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "parse_filename(cls, path: Path)"
            },
            {
              "docstring": "",
              "line": 430,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceENVIFile'"
            },
            {
              "docstring": "",
              "line": 448,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": "'DP1.30006.001'",
                  "kind": "keyword-only",
                  "name": "product"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "tile"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "date"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "time"
                },
                {
                  "annotation": "bool",
                  "default": "True",
                  "kind": "keyword-only",
                  "name": "directional"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "descriptor"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "folder"
                }
              ],
              "private": false,
              "signature": "from_components(cls, *, domain: str, site: str, product: str='DP1.30006.001', tile: str, date: Optional[str]=None, time: Optional[str]=None, directional: bool=True, descriptor: str | None=None, folder: Path) -> 'NEONReflectanceENVIFile'"
            },
            {
              "docstring": "",
              "line": 483,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "root"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, root: Path) -> List['NEONReflectanceENVIFile']"
            }
          ],
          "name": "NEONReflectanceENVIFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceENVIFile",
          "signature": null,
          "summary": "Base (uncorrected) NEON reflectance ENVI image.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a raw reflectance ENVI header product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 495,
          "methods": [
            {
              "docstring": "",
              "line": 508,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 543,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceENVIHDRFile'"
            },
            {
              "docstring": "",
              "line": 553,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "product"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "descriptor"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, product: str, date: str, folder: Path, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False, descriptor: str | None=None) -> 'NEONReflectanceENVIHDRFile'"
            }
          ],
          "name": "NEONReflectanceENVIHDRFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceENVIHDRFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a raw reflectance ENVI header product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Ancillary ENVI image stack, e.g.\n  NEON_D10_R10C_DP1.30006.001_L003-1_20210915_directional_reflectance_ancillary_envi.img\n  NEON_D10_R10C_DP1.30006.001_L003-1_20210915_reflectance_ancillary_envi.img",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 603,
          "methods": [
            {
              "docstring": "",
              "line": 626,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceAncillaryENVIFile'"
            },
            {
              "docstring": "Build a filename like:\n``NEON_{domain}_{site}_{product}_{tile}_{date}[_HHMMSS][_directional]_reflectance_ancillary_envi.img``",
              "line": 642,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": "'DP1.30006.001'",
                  "kind": "keyword-only",
                  "name": "product"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "tile"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "date"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "time"
                },
                {
                  "annotation": "bool",
                  "default": "True",
                  "kind": "keyword-only",
                  "name": "directional"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "folder"
                }
              ],
              "private": false,
              "signature": "from_components(cls, *, domain: str, site: str, product: str='DP1.30006.001', tile: str, date: str, time: Optional[str]=None, directional: bool=True, folder: Path) -> 'NEONReflectanceAncillaryENVIFile'"
            },
            {
              "docstring": "",
              "line": 667,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "root"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, root: Path) -> List['NEONReflectanceAncillaryENVIFile']"
            }
          ],
          "name": "NEONReflectanceAncillaryENVIFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceAncillaryENVIFile",
          "signature": null,
          "summary": "Ancillary ENVI image stack, e.g.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a ancillary ENVI header product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 679,
          "methods": [
            {
              "docstring": "",
              "line": 689,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "product"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, domain: str, site: str, product: str, date: str, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False)"
            },
            {
              "docstring": "",
              "line": 703,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceAncillaryENVIHDRFile'"
            },
            {
              "docstring": "",
              "line": 711,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "product"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, product: str, date: str, folder: Path, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False) -> 'NEONReflectanceAncillaryENVIHDRFile'"
            }
          ],
          "name": "NEONReflectanceAncillaryENVIHDRFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceAncillaryENVIHDRFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a ancillary ENVI header product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "suffix"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a correction configuration JSON product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 730,
          "methods": [
            {
              "docstring": "",
              "line": 746,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 752,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceConfigFile'"
            },
            {
              "docstring": "",
              "line": 760,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, directory: Path, suffix: Optional[str]=None) -> List['NEONReflectanceConfigFile']"
            },
            {
              "docstring": "",
              "line": 769,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "product"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "tile"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "date"
                },
                {
                  "annotation": "Optional[str]",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "time"
                },
                {
                  "annotation": "bool",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "directional"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "folder"
                }
              ],
              "private": false,
              "signature": "from_components(cls, *, domain: str, site: str, product: str, tile: str, date: str, time: Optional[str], directional: bool, folder: Path) -> 'NEONReflectanceConfigFile'"
            }
          ],
          "name": "NEONReflectanceConfigFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceConfigFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a correction configuration JSON product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "suffix"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a BRDF/topographically corrected ENVI image product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 795,
          "methods": [
            {
              "docstring": "",
              "line": 812,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 841,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceBRDFCorrectedENVIFile'"
            },
            {
              "docstring": "",
              "line": 847,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "positional-or-keyword",
                  "name": "product"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, suffix: str, folder: Path, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False, product: str='30006.001') -> 'NEONReflectanceBRDFCorrectedENVIFile'"
            },
            {
              "docstring": "",
              "line": 870,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "root"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "suffix"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "keyword-only",
                  "name": "include_masks"
                },
                {
                  "annotation": "object",
                  "default": null,
                  "kind": "variadic-keyword",
                  "name": "_"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, root: Path, *, suffix: str | None=None, include_masks: bool=False, **_: object) -> List['NEONReflectanceBRDFCorrectedENVIFile']"
            }
          ],
          "name": "NEONReflectanceBRDFCorrectedENVIFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a BRDF/topographically corrected ENVI image product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "suffix"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a BRDF/topographically corrected ENVI header product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 893,
          "methods": [
            {
              "docstring": "",
              "line": 910,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 939,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceBRDFCorrectedENVIHDRFile'"
            },
            {
              "docstring": "",
              "line": 945,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "root"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "suffix"
                },
                {
                  "annotation": "object",
                  "default": null,
                  "kind": "variadic-keyword",
                  "name": "_"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, root: Path, *, suffix: str | None=None, **_: object) -> List['NEONReflectanceBRDFCorrectedENVIHDRFile']"
            }
          ],
          "name": "NEONReflectanceBRDFCorrectedENVIHDRFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIHDRFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a BRDF/topographically corrected ENVI header product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "suffix"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a BRDF mask ENVI image product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 962,
          "methods": [
            {
              "docstring": "",
              "line": 979,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 1005,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceBRDFMaskENVIFile'"
            },
            {
              "docstring": "",
              "line": 1011,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "keyword-only",
                  "name": "product"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "keyword-only",
                  "name": "directional"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, suffix: str, folder: Path, *, product: str='30006.001', time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False) -> 'NEONReflectanceBRDFMaskENVIFile'"
            },
            {
              "docstring": "",
              "line": 1035,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "root"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "suffix"
                },
                {
                  "annotation": "object",
                  "default": null,
                  "kind": "variadic-keyword",
                  "name": "_"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, root: Path, *, suffix: str | None=None, **_: object) -> List['NEONReflectanceBRDFMaskENVIFile']"
            }
          ],
          "name": "NEONReflectanceBRDFMaskENVIFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceBRDFMaskENVIFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a BRDF mask ENVI image product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "suffix"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a BRDF mask ENVI header product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1053,
          "methods": [
            {
              "docstring": "",
              "line": 1070,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 1096,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceBRDFMaskENVIHDRFile'"
            },
            {
              "docstring": "",
              "line": 1102,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "keyword-only",
                  "name": "product"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "keyword-only",
                  "name": "directional"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, suffix: str, folder: Path, *, product: str='30006.001', time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False) -> 'NEONReflectanceBRDFMaskENVIHDRFile'"
            },
            {
              "docstring": "",
              "line": 1126,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "root"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "suffix"
                },
                {
                  "annotation": "object",
                  "default": null,
                  "kind": "variadic-keyword",
                  "name": "_"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, root: Path, *, suffix: str | None=None, **_: object) -> List['NEONReflectanceBRDFMaskENVIHDRFile']"
            }
          ],
          "name": "NEONReflectanceBRDFMaskENVIHDRFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceBRDFMaskENVIHDRFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a BRDF mask ENVI header product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str | None",
              "default": "None",
              "name": "correction"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "suffix"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "product"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a correction coefficient product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1148,
          "methods": [
            {
              "docstring": "",
              "line": 1166,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 1205,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceCoefficientsFile'"
            },
            {
              "docstring": "",
              "line": 1211,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "correction"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "positional-or-keyword",
                  "name": "product"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, correction: str, suffix: str, folder: Path, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False, product: str='30006.001') -> 'NEONReflectanceCoefficientsFile'"
            },
            {
              "docstring": "",
              "line": 1226,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "correction"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "suffix"
                },
                {
                  "annotation": "object",
                  "default": null,
                  "kind": "variadic-keyword",
                  "name": "_"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, directory: Path, *, correction: Optional[str]=None, suffix: Optional[str]=None, **_: object) -> List['NEONReflectanceCoefficientsFile']"
            }
          ],
          "name": "NEONReflectanceCoefficientsFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceCoefficientsFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a correction coefficient product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": "'envi'",
              "name": "suffix"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a resampled sensor ENVI image product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1250,
          "methods": [
            {
              "docstring": "",
              "line": 1266,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 1286,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceResampledENVIFile'"
            },
            {
              "docstring": "",
              "line": 1300,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "positional-or-keyword",
                  "name": "product"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, sensor: str, suffix: str, folder: Path, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False, product: str='30006.001') -> 'NEONReflectanceResampledENVIFile'"
            },
            {
              "docstring": "",
              "line": 1316,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, directory: Path, sensor: Optional[str]=None, suffix: Optional[str]=None) -> List['NEONReflectanceResampledENVIFile']"
            },
            {
              "docstring": "",
              "line": 1327,
              "name": "find_all_sensors_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                }
              ],
              "private": false,
              "signature": "find_all_sensors_in_directory(cls, directory: Path, suffix: Optional[str]=None) -> List['NEONReflectanceResampledENVIFile']"
            }
          ],
          "name": "NEONReflectanceResampledENVIFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceResampledENVIFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a resampled sensor ENVI image product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a resampled sensor ENVI header product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1334,
          "methods": [
            {
              "docstring": "",
              "line": 1346,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "product"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "str",
                  "default": "'envi'",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, domain: str, site: str, date: str, product: Optional[str]=None, time: Optional[str]=None, sensor: Optional[str]=None, suffix: str='envi', tile: Optional[str]=None, directional: bool=False)"
            },
            {
              "docstring": "",
              "line": 1383,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceResampledHDRFile'"
            },
            {
              "docstring": "",
              "line": 1397,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "positional-or-keyword",
                  "name": "product"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, sensor: str, suffix: str, folder: Path, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False, product: str='30006.001') -> 'NEONReflectanceResampledHDRFile'"
            },
            {
              "docstring": "",
              "line": 1413,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, directory: Path, sensor: Optional[str]=None, suffix: Optional[str]=None) -> List['NEONReflectanceResampledHDRFile']"
            }
          ],
          "name": "NEONReflectanceResampledHDRFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceResampledHDRFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a resampled sensor ENVI header product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": "'envi'",
              "name": "suffix"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "tile"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "directional"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a resampled sensor mask ENVI image product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1425,
          "methods": [
            {
              "docstring": "",
              "line": 1441,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 1461,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceResampledMaskENVIFile'"
            },
            {
              "docstring": "",
              "line": 1475,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "positional-or-keyword",
                  "name": "product"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, sensor: str, suffix: str, folder: Path, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False, product: str='30006.001') -> 'NEONReflectanceResampledMaskENVIFile'"
            },
            {
              "docstring": "",
              "line": 1491,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, directory: Path, sensor: Optional[str]=None, suffix: Optional[str]=None) -> List['NEONReflectanceResampledMaskENVIFile']"
            }
          ],
          "name": "NEONReflectanceResampledMaskENVIFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceResampledMaskENVIFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a resampled sensor mask ENVI image product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a resampled sensor mask ENVI header product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1502,
          "methods": [
            {
              "docstring": "",
              "line": 1514,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "product"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "str",
                  "default": "'envi'",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, domain: str, site: str, date: str, product: Optional[str]=None, time: Optional[str]=None, sensor: Optional[str]=None, suffix: str='envi', tile: Optional[str]=None, directional: bool=False)"
            },
            {
              "docstring": "",
              "line": 1551,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'NEONReflectanceResampledMaskHDRFile'"
            },
            {
              "docstring": "",
              "line": 1565,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                },
                {
                  "annotation": "bool",
                  "default": "False",
                  "kind": "positional-or-keyword",
                  "name": "directional"
                },
                {
                  "annotation": "str",
                  "default": "'30006.001'",
                  "kind": "positional-or-keyword",
                  "name": "product"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, sensor: str, suffix: str, folder: Path, time: Optional[str]=None, tile: Optional[str]=None, directional: bool=False, product: str='30006.001') -> 'NEONReflectanceResampledMaskHDRFile'"
            },
            {
              "docstring": "",
              "line": 1581,
              "name": "find_in_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "directory"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "sensor"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "suffix"
                }
              ],
              "private": false,
              "signature": "find_in_directory(cls, directory: Path, sensor: Optional[str]=None, suffix: Optional[str]=None) -> List['NEONReflectanceResampledMaskHDRFile']"
            }
          ],
          "name": "NEONReflectanceResampledMaskHDRFile",
          "parameters": [],
          "path": "spectralbridge.file_types.NEONReflectanceResampledMaskHDRFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a resampled sensor mask ENVI header product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represent the legacy typed filename contract for a spectral-data Parquet product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1596,
          "methods": [
            {
              "docstring": "",
              "line": 1601,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "base"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, base: str)"
            },
            {
              "docstring": "",
              "line": 1606,
              "name": "from_raster_file",
              "parameters": [
                {
                  "annotation": "DataFile",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "raster_file"
                }
              ],
              "private": false,
              "signature": "from_raster_file(cls, raster_file: DataFile) -> 'SpectralDataParquetFile'"
            },
            {
              "docstring": "",
              "line": 1614,
              "name": "from_filename",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "from_filename(cls, path: Path) -> 'SpectralDataParquetFile'"
            }
          ],
          "name": "SpectralDataParquetFile",
          "parameters": [],
          "path": "spectralbridge.file_types.SpectralDataParquetFile",
          "signature": null,
          "summary": "Represent the legacy typed filename contract for a spectral-data Parquet product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represents masked spectral data CSV files like NEON_D13_NIWO_DP1_*_with_mask_and_all_spectra.csv",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1621,
          "methods": [
            {
              "docstring": "",
              "line": 1630,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "product"
                },
                {
                  "annotation": "Optional[str]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "tile"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, domain: str, site: str, date: str, time: str, product: Optional[str]=None, tile: Optional[str]=None)"
            },
            {
              "docstring": "",
              "line": 1641,
              "name": "from_components",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "time"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "base_name"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "folder"
                }
              ],
              "private": false,
              "signature": "from_components(cls, domain: str, site: str, date: str, time: str, base_name: str, folder: Path) -> 'MaskedSpectralCSVFile'"
            }
          ],
          "name": "MaskedSpectralCSVFile",
          "parameters": [],
          "path": "spectralbridge.file_types.MaskedSpectralCSVFile",
          "signature": null,
          "summary": "Represents masked spectral data CSV files like NEON_D13_NIWO_DP1_*_with_mask_and_all_spectra.csv",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represents endmembers CSV output from unmixing process",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1648,
          "methods": [
            {
              "docstring": "",
              "line": 1655,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "time"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, domain: str, site: str, date: str, time: str)"
            },
            {
              "docstring": "",
              "line": 1663,
              "name": "from_signatures_file",
              "parameters": [
                {
                  "annotation": "MaskedSpectralCSVFile",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "signatures_file"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "output_dir"
                }
              ],
              "private": false,
              "signature": "from_signatures_file(cls, signatures_file: MaskedSpectralCSVFile, output_dir: Path) -> 'EndmembersCSVFile'"
            }
          ],
          "name": "EndmembersCSVFile",
          "parameters": [],
          "path": "spectralbridge.file_types.EndmembersCSVFile",
          "signature": null,
          "summary": "Represents endmembers CSV output from unmixing process",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represents model_best.tif output from unmixing",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1671,
          "methods": [
            {
              "docstring": "",
              "line": 1678,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "time"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, domain: str, site: str, date: str, time: str)"
            },
            {
              "docstring": "",
              "line": 1686,
              "name": "from_signatures_file",
              "parameters": [
                {
                  "annotation": "MaskedSpectralCSVFile",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "signatures_file"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "output_dir"
                }
              ],
              "private": false,
              "signature": "from_signatures_file(cls, signatures_file: MaskedSpectralCSVFile, output_dir: Path) -> 'UnmixingModelBestTIF'"
            }
          ],
          "name": "UnmixingModelBestTIF",
          "parameters": [],
          "path": "spectralbridge.file_types.UnmixingModelBestTIF",
          "signature": null,
          "summary": "Represents model_best.tif output from unmixing",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represents model_fractions.tif output from unmixing",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1694,
          "methods": [
            {
              "docstring": "",
              "line": 1701,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "time"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, domain: str, site: str, date: str, time: str)"
            },
            {
              "docstring": "",
              "line": 1709,
              "name": "from_signatures_file",
              "parameters": [
                {
                  "annotation": "MaskedSpectralCSVFile",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "signatures_file"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "output_dir"
                }
              ],
              "private": false,
              "signature": "from_signatures_file(cls, signatures_file: MaskedSpectralCSVFile, output_dir: Path) -> 'UnmixingModelFractionsTIF'"
            }
          ],
          "name": "UnmixingModelFractionsTIF",
          "parameters": [],
          "path": "spectralbridge.file_types.UnmixingModelFractionsTIF",
          "signature": null,
          "summary": "Represents model_fractions.tif output from unmixing",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Represents model_rmse.tif output from unmixing",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1717,
          "methods": [
            {
              "docstring": "",
              "line": 1724,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "domain"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "site"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "date"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "time"
                }
              ],
              "private": true,
              "signature": "__init__(self, path: Path, domain: str, site: str, date: str, time: str)"
            },
            {
              "docstring": "",
              "line": 1732,
              "name": "from_signatures_file",
              "parameters": [
                {
                  "annotation": "MaskedSpectralCSVFile",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "signatures_file"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "output_dir"
                }
              ],
              "private": false,
              "signature": "from_signatures_file(cls, signatures_file: MaskedSpectralCSVFile, output_dir: Path) -> 'UnmixingModelRMSETIF'"
            }
          ],
          "name": "UnmixingModelRMSETIF",
          "parameters": [],
          "path": "spectralbridge.file_types.UnmixingModelRMSETIF",
          "signature": null,
          "summary": "Represents model_rmse.tif output from unmixing",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/file_types.py",
      "sha256": "6547dd8b7f7e4d074e44d6ac5b1e74bf95e0824902524365c9471a473a97130f"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "Opt-in half-flight helpers for ``split_across_track=True``.\n\nDefault full-flightline processing does not use this module. When\n``split_across_track=True``, one original H5 is shared and two renamed\nflight folders receive heading-aware half-route windows. Folder names are\nalways ``_left`` / ``_right``:\n\n* North\u2013south elongated footprints \u2192 line windows\n  (``left`` = northern/first lines, ``right`` = southern/second lines)\n* East\u2013west elongated footprints \u2192 sample windows\n  (``left`` = western/first samples, ``right`` = eastern/second samples)\n\nThis matches half of the flight *route* (not half of the sensor swath).",
      "export_expressions": [],
      "imports": {
        "Literal": "typing.Literal",
        "Path": "pathlib.Path",
        "_map_info_core": "spectralbridge.io.neon._map_info_core",
        "_prepare_map_info": "spectralbridge.io.neon._prepare_map_info",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "peek_neon_raster_shape": "spectralbridge.io.neon.peek_neon_raster_shape"
      },
      "module": "spectralbridge.half_flight",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "HalfSide",
              "default": null,
              "name": "side"
            },
            {
              "annotation": "FootprintOrientation",
              "default": null,
              "name": "orientation"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "sample_start"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "sample_stop"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "line_start"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "line_stop"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "full_samples"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "full_lines"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Half-open raster window for one half-flight product.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 37,
          "methods": [
            {
              "docstring": "",
              "line": 50,
              "name": "sample_slice",
              "parameters": [],
              "private": false,
              "signature": "sample_slice(self) -> slice | None"
            },
            {
              "docstring": "",
              "line": 56,
              "name": "line_slice",
              "parameters": [],
              "private": false,
              "signature": "line_slice(self) -> slice | None"
            }
          ],
          "name": "HalfWindow",
          "parameters": [],
          "path": "spectralbridge.half_flight.HalfWindow",
          "signature": null,
          "summary": "Half-open raster window for one half-flight product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Classify corridor orientation from geographic footprint extents.\n\nNorth\u2013south corridors are taller in northing and are halved along lines.\nEast\u2013west corridors are wider in easting and are halved along samples.\nBoth modes still name products ``left`` / ``right``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 62,
          "methods": [],
          "name": "classify_footprint_orientation",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "n_lines"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "n_samples"
            },
            {
              "annotation": "float",
              "default": "1.0",
              "kind": "keyword-only",
              "name": "pixel_x"
            },
            {
              "annotation": "float",
              "default": "1.0",
              "kind": "keyword-only",
              "name": "pixel_y"
            }
          ],
          "path": "spectralbridge.half_flight.classify_footprint_orientation",
          "signature": "classify_footprint_orientation(*, n_lines: int, n_samples: int, pixel_x: float=1.0, pixel_y: float=1.0) -> FootprintOrientation",
          "summary": "Classify corridor orientation from geographic footprint extents.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 85,
          "methods": [],
          "name": "_halve_axis",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "n"
            }
          ],
          "path": "spectralbridge.half_flight._halve_axis",
          "signature": "_halve_axis(n: int) -> tuple[tuple[int, int], tuple[int, int]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return left/right column windows (east\u2013west half-route mode).\n\nThe right half receives the extra column when ``n_samples`` is odd.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 92,
          "methods": [],
          "name": "across_track_slices",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "n_samples"
            }
          ],
          "path": "spectralbridge.half_flight.across_track_slices",
          "signature": "across_track_slices(n_samples: int) -> dict[HalfSide, tuple[int, int]]",
          "summary": "Return left/right column windows (east\u2013west half-route mode).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return left/right line windows (north\u2013south half-route mode).\n\n``left`` is lines ``[0:mid]`` (north in standard NEON north-up map info).\n``right`` is lines ``[mid:n]`` and receives the extra line when odd.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 102,
          "methods": [],
          "name": "along_track_slices",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "n_lines"
            }
          ],
          "path": "spectralbridge.half_flight.along_track_slices",
          "signature": "along_track_slices(n_lines: int) -> dict[HalfSide, tuple[int, int]]",
          "summary": "Return left/right line windows (north\u2013south half-route mode).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Append a validated left/right half-route suffix to the original flight identifier.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 113,
          "methods": [],
          "name": "half_flight_id",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "original_flight_id"
            },
            {
              "annotation": "HalfSide",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "side"
            }
          ],
          "path": "spectralbridge.half_flight.half_flight_id",
          "signature": "half_flight_id(original_flight_id: str, side: HalfSide) -> str",
          "summary": "Append a validated left/right half-route suffix to the original flight identifier.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return ``(pixel_x, |pixel_y|)`` from Map_Info when present.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 121,
          "methods": [],
          "name": "_peek_pixel_sizes",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.half_flight._peek_pixel_sizes",
          "signature": "_peek_pixel_sizes(h5_path: Path) -> tuple[float, float]",
          "summary": "Return ``(pixel_x, |pixel_y|)`` from Map_Info when present.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Plan heading-aware half-route windows for one NEON H5.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 145,
          "methods": [],
          "name": "plan_half_flight",
          "parameters": [
            {
              "annotation": "Path | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.half_flight.plan_half_flight",
          "signature": "plan_half_flight(h5_path: Path | str) -> tuple[FootprintOrientation, tuple[HalfWindow, HalfWindow]]",
          "summary": "Plan heading-aware half-route windows for one NEON H5.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/half_flight.py",
      "sha256": "475b17d80e7af54691b2724325d6ab701555561226634e3092c4b3f0e295014b"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "_parse_numeric_list",
        "wavelengths_from_hdr"
      ],
      "docstring": "",
      "export_expressions": [
        "__all__ = ['_parse_numeric_list', 'wavelengths_from_hdr']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Dict": "typing.Dict",
        "Optional": "typing.Optional",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.header_utils",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 8,
          "methods": [],
          "name": "_parse_numeric_list",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.header_utils._parse_numeric_list",
          "signature": "_parse_numeric_list(value: str) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return header wavelength values and their provenance, with an explicitly supplied sensor fallback.",
          "examples": [],
          "exports": [
            "spectralbridge.header_utils.wavelengths_from_hdr"
          ],
          "kind": "function",
          "line": 25,
          "methods": [],
          "name": "wavelengths_from_hdr",
          "parameters": [
            {
              "annotation": "Dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr"
            },
            {
              "annotation": "Optional[np.ndarray]",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "sensor_default"
            }
          ],
          "path": "spectralbridge.header_utils.wavelengths_from_hdr",
          "signature": "wavelengths_from_hdr(hdr: Dict[str, Any], sensor_default: Optional[np.ndarray]=None) -> tuple[np.ndarray, str]",
          "summary": "Return header wavelength values and their provenance, with an explicitly supplied sensor fallback.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/header_utils.py",
      "sha256": "c46bc9267d5d3d0d7af588857d6f5a7c90209c0dee3f6de09b31a6a6569b3c58"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "Compatibility helpers for importing HyTools components across versions.\n\nHyTools' internal module layout has changed across releases (e.g., ``WriteENVI``\nwas historically located at ``hytools.io.envi`` but can appear in other modules\nin more recent versions).  Downstream code in this repository only needs the\n``WriteENVI`` class, so we centralise the import logic here and try a handful of\nknown locations before surfacing a helpful error message.",
      "export_expressions": [],
      "imports": {
        "Iterable": "typing.Iterable",
        "ModuleType": "types.ModuleType",
        "TypeVar": "typing.TypeVar",
        "annotations": "__future__.annotations",
        "import_module": "importlib.import_module",
        "walk_packages": "pkgutil.walk_packages"
      },
      "module": "spectralbridge.hytools_compat",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Attempt to load ``attribute`` from the first importable module.\n\nParameters\n----------\nmodule_paths\n    Candidate module import paths to try (in order).\nattribute\n    Name of the attribute to fetch once the module imports successfully.\n\nReturns\n-------\nAny\n    The requested attribute.\n\nRaises\n------\nModuleNotFoundError\n    If none of the candidate modules can be imported or the attribute is\n    missing from the imported module.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 19,
          "methods": [],
          "name": "_load_attribute",
          "parameters": [
            {
              "annotation": "Iterable[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "module_paths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "attribute"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "error_hint"
            }
          ],
          "path": "spectralbridge.hytools_compat._load_attribute",
          "signature": "_load_attribute(module_paths: Iterable[str], attribute: str, *, error_hint: str) -> T",
          "summary": "Attempt to load ``attribute`` from the first importable module.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the ``WriteENVI`` class from HyTools regardless of version.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 113,
          "methods": [],
          "name": "get_write_envi",
          "parameters": [],
          "path": "spectralbridge.hytools_compat.get_write_envi",
          "signature": "get_write_envi() -> T",
          "summary": "Return the ``WriteENVI`` class from HyTools regardless of version.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the ``HyTools`` class across supported package layouts.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 131,
          "methods": [],
          "name": "get_hytools_class",
          "parameters": [],
          "path": "spectralbridge.hytools_compat.get_hytools_class",
          "signature": "get_hytools_class() -> T",
          "summary": "Return the ``HyTools`` class across supported package layouts.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/hytools_compat.py",
      "sha256": "ed2e765698a8609f66a6fb65a2633c006646e9ec3bbe6b594b984f662fb0b758"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [
        "is_pre_2021",
        "peek_neon_raster_shape",
        "peek_neon_sample_count",
        "read_neon_cube"
      ],
      "docstring": "I/O helpers for NEON products.",
      "export_expressions": [
        "__all__ = ['is_pre_2021', 'peek_neon_raster_shape', 'peek_neon_sample_count', 'read_neon_cube']"
      ],
      "imports": {
        "is_pre_2021": "spectralbridge.io.neon.is_pre_2021",
        "peek_neon_raster_shape": "spectralbridge.io.neon.peek_neon_raster_shape",
        "peek_neon_sample_count": "spectralbridge.io.neon.peek_neon_sample_count",
        "read_neon_cube": "spectralbridge.io.neon.read_neon_cube"
      },
      "module": "spectralbridge.io",
      "objects": [],
      "path": "src/spectralbridge/io/__init__.py",
      "sha256": "e127f2ee26b411522083a1cd9a89c5f2b0924eaf5303f0673d6807ee199029bd"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [
        "_map_info_core",
        "_prepare_map_info",
        "is_pre_2021",
        "peek_neon_raster_shape",
        "peek_neon_sample_count",
        "read_neon_cube",
        "read_neon_reflectance_unitless"
      ],
      "docstring": "Helpers for reading NEON reflectance HDF5 products across layout versions.\n\nThe new-layout reader was factored from SpectralBridge's HyTools-adapted\n``NeonCube`` path and then extended for historical schemas, bounded reads,\norientation, and reflectance scaling.\n\nHyTools: Hyperspectral image processing library\nCopyright (C) 2021 University of Wisconsin\nAuthors named in the relevant source notices: Adam Chlus, Zhiwei Ye, Philip Townsend.\nLicense: GNU General Public License, version 3\nUpstream: https://github.com/EnSpec/hytools\nAudited revision: 31286d64541791a9815d29443a33726fa4d54031\n\nModified and extended for SpectralBridge. See ``LICENSE``, ``NOTICE``, and\n``HYTOOLS_PROVENANCE.md``.",
      "export_expressions": [
        "__all__ = ['is_pre_2021', 'peek_neon_sample_count', 'peek_neon_raster_shape', 'read_neon_cube', 'read_neon_reflectance_unitless', '_prepare_map_info', '_map_info_core']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Dict": "typing.Dict",
        "Iterable": "typing.Iterable",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "canonical_vectors": "spectralbridge.io.neon_schema.canonical_vectors",
        "resolve": "spectralbridge.io.neon_schema.resolve"
      },
      "module": "spectralbridge.io.neon",
      "objects": [
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Return ``True`` when ``h5_path`` appears to be a pre-2021 NEON export.\n\nParameters\n----------\nh5_path : Path\n    Existing NEON reflectance HDF5 file; layout is detected from file metadata rather than assumed from array dimensions.\n\nReturns\n-------\nbool\n    Whether a year parsed from the filename is earlier than 2021; False when no year is recognized. This is not the schema resolver.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.io.is_pre_2021",
            "spectralbridge.io.neon.is_pre_2021"
          ],
          "kind": "function",
          "line": 45,
          "methods": [],
          "name": "is_pre_2021",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.io.neon.is_pre_2021",
          "signature": "is_pre_2021(h5_path: Path) -> bool",
          "summary": "Return ``True`` when ``h5_path`` appears to be a pre-2021 NEON export.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Parse the NEON map info dataset into an ENVI-style list of strings.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 71,
          "methods": [],
          "name": "_prepare_map_info",
          "parameters": [
            {
              "annotation": "np.ndarray | bytes | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "map_info"
            }
          ],
          "path": "spectralbridge.io.neon._prepare_map_info",
          "signature": "_prepare_map_info(map_info: np.ndarray | bytes | str) -> list[str]",
          "summary": "Parse the NEON map info dataset into an ENVI-style list of strings.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Extract numeric components from the map info list for transforms.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 97,
          "methods": [],
          "name": "_map_info_core",
          "parameters": [
            {
              "annotation": "list[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "map_info_list"
            }
          ],
          "path": "spectralbridge.io.neon._map_info_core",
          "signature": "_map_info_core(map_info_list: list[str]) -> tuple[float, float, float, float, float, float]",
          "summary": "Extract numeric components from the map info list for transforms.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 119,
          "methods": [],
          "name": "_as_str",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.io.neon._as_str",
          "signature": "_as_str(value: Any) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 125,
          "methods": [],
          "name": "_extract_units",
          "parameters": [
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelength_ds"
            },
            {
              "annotation": "Optional[h5py.Group]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectral_group"
            }
          ],
          "path": "spectralbridge.io.neon._extract_units",
          "signature": "_extract_units(wavelength_ds: h5py.Dataset, spectral_group: Optional[h5py.Group]) -> Optional[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 136,
          "methods": [],
          "name": "_extract_no_data",
          "parameters": [
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dataset"
            }
          ],
          "path": "spectralbridge.io.neon._extract_no_data",
          "signature": "_extract_no_data(dataset: h5py.Dataset) -> float",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the reflectance scale factor for a NEON dataset, defaulting to 1.0.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 148,
          "methods": [],
          "name": "_extract_scale_factor",
          "parameters": [
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dataset"
            }
          ],
          "path": "spectralbridge.io.neon._extract_scale_factor",
          "signature": "_extract_scale_factor(dataset: h5py.Dataset) -> float",
          "summary": "Return the reflectance scale factor for a NEON dataset, defaulting to 1.0.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return ``m`` such that ``unitless = stored * m``.\n\nAccepts both common packaging conventions:\n\n* Multiply style (``0.0001``): ``unitless = DN * 0.0001``\n* NEON / ENVI divisor style (``10000``): ``unitless = DN / 10000``\n* Already unitless (``1.0``): ``unitless = DN``\n\nThe raw attribute is still stored on cubes / ENVI headers for QA; this helper\nis only for converting between storage units and physical reflectance.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 170,
          "methods": [],
          "name": "reflectance_to_unitless_multiplier",
          "parameters": [
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scale_factor"
            }
          ],
          "path": "spectralbridge.io.neon.reflectance_to_unitless_multiplier",
          "signature": "reflectance_to_unitless_multiplier(scale_factor: float) -> float",
          "summary": "Return ``m`` such that ``unitless = stored * m``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Convert stored reflectance values to unitless reflectance.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 195,
          "methods": [],
          "name": "stored_to_unitless",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scale_factor"
            }
          ],
          "path": "spectralbridge.io.neon.stored_to_unitless",
          "signature": "stored_to_unitless(data: np.ndarray, scale_factor: float) -> np.ndarray",
          "summary": "Convert stored reflectance values to unitless reflectance.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Convert unitless reflectance back to the cube's storage scale.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 202,
          "methods": [],
          "name": "unitless_to_stored",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scale_factor"
            }
          ],
          "path": "spectralbridge.io.neon.unitless_to_stored",
          "signature": "unitless_to_stored(data: np.ndarray, scale_factor: float) -> np.ndarray",
          "summary": "Convert unitless reflectance back to the cube's storage scale.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return unitless reflectance scaled by the NEON factor with ignore masked.\n\nParameters\n----------\nreflectance_ds : h5py.Dataset\n    The NEON reflectance dataset (``/Reflectance/Reflectance_Data`` or similar).\n\nReturns\n-------\ntuple[np.ndarray, float, float]\n    ``(data_unitless, scale_factor, ignore_value)`` where ``data_unitless`` is a\n    float32 array scaled into 0\u20131 reflectance with ignore values set to ``NaN``.\n    ``scale_factor`` is the raw dataset attribute (for example ``10000`` or\n    ``1e-4``); conversion to unitless always goes through\n    :func:`reflectance_to_unitless_multiplier`.",
          "examples": [],
          "exports": [
            "spectralbridge.io.neon.read_neon_reflectance_unitless"
          ],
          "kind": "function",
          "line": 211,
          "methods": [],
          "name": "read_neon_reflectance_unitless",
          "parameters": [
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reflectance_ds"
            }
          ],
          "path": "spectralbridge.io.neon.read_neon_reflectance_unitless",
          "signature": "read_neon_reflectance_unitless(reflectance_ds: h5py.Dataset) -> tuple[np.ndarray, float, float]",
          "summary": "Return unitless reflectance scaled by the NEON factor with ignore masked.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 241,
          "methods": [],
          "name": "_find_dataset_path",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_file"
            },
            {
              "annotation": "Iterable[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "candidates"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "ndim"
            }
          ],
          "path": "spectralbridge.io.neon._find_dataset_path",
          "signature": "_find_dataset_path(h5_file: h5py.File, candidates: Iterable[str], ndim: int | None=None) -> Optional[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 263,
          "methods": [],
          "name": "_as_sample_slice",
          "parameters": [
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sample_slice"
            }
          ],
          "path": "spectralbridge.io.neon._as_sample_slice",
          "signature": "_as_sample_slice(sample_slice: slice | tuple[int, int] | None) -> slice | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return ``(start, stop, normalized_slice_or_none)`` for a half-open window.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 273,
          "methods": [],
          "name": "_resolve_half_open_window",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "n"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "window"
            }
          ],
          "path": "spectralbridge.io.neon._resolve_half_open_window",
          "signature": "_resolve_half_open_window(n: int, window: slice | tuple[int, int] | None) -> tuple[int, int, slice | None]",
          "summary": "Return ``(start, stop, normalized_slice_or_none)`` for a half-open window.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 287,
          "methods": [],
          "name": "_samples_axis_count",
          "parameters": [
            {
              "annotation": "tuple[int, ...]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "shape"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelength_count"
            }
          ],
          "path": "spectralbridge.io.neon._samples_axis_count",
          "signature": "_samples_axis_count(shape: tuple[int, ...], wavelength_count: int) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 299,
          "methods": [],
          "name": "_lines_axis_count",
          "parameters": [
            {
              "annotation": "tuple[int, ...]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "shape"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelength_count"
            }
          ],
          "path": "spectralbridge.io.neon._lines_axis_count",
          "signature": "_lines_axis_count(shape: tuple[int, ...], wavelength_count: int) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read reflectance, optionally slicing line/sample axes before load.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 311,
          "methods": [],
          "name": "_slice_reflectance_dataset",
          "parameters": [
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reflectance_ds"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelength_count"
            },
            {
              "annotation": "slice | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sample_slice"
            },
            {
              "annotation": "slice | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "line_slice"
            }
          ],
          "path": "spectralbridge.io.neon._slice_reflectance_dataset",
          "signature": "_slice_reflectance_dataset(reflectance_ds: h5py.Dataset, wavelength_count: int, sample_slice: slice | None, line_slice: slice | None=None) -> np.ndarray",
          "summary": "Read reflectance, optionally slicing line/sample axes before load.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Shift ENVI map info for optional sample/line window origins.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 336,
          "methods": [],
          "name": "_shift_map_info_for_window",
          "parameters": [
            {
              "annotation": "list[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "map_info_list"
            },
            {
              "annotation": "int",
              "default": "0",
              "kind": "positional-or-keyword",
              "name": "sample_start"
            },
            {
              "annotation": "int",
              "default": "0",
              "kind": "positional-or-keyword",
              "name": "line_start"
            }
          ],
          "path": "spectralbridge.io.neon._shift_map_info_for_window",
          "signature": "_shift_map_info_for_window(map_info_list: list[str], sample_start: int=0, line_start: int=0) -> tuple[list[str], tuple[float, float, float, float, float, float] | None, float | None, float | None]",
          "summary": "Shift ENVI map info for optional sample/line window origins.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 359,
          "methods": [],
          "name": "_shift_map_info_for_sample_start",
          "parameters": [
            {
              "annotation": "list[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "map_info_list"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sample_start"
            }
          ],
          "path": "spectralbridge.io.neon._shift_map_info_for_sample_start",
          "signature": "_shift_map_info_for_sample_start(map_info_list: list[str], sample_start: int) -> tuple[list[str], tuple[float, float, float, float, float, float] | None, float | None, float | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 366,
          "methods": [],
          "name": "_orient_cube",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelength_count"
            }
          ],
          "path": "spectralbridge.io.neon._orient_cube",
          "signature": "_orient_cube(data: np.ndarray, wavelength_count: int) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 379,
          "methods": [],
          "name": "_metadata_root_from_path",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dataset_path"
            }
          ],
          "path": "spectralbridge.io.neon._metadata_root_from_path",
          "signature": "_metadata_root_from_path(dataset_path: str) -> Optional[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 389,
          "methods": [],
          "name": "_read_new_neon_layout",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_file"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "sample_slice"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "line_slice"
            }
          ],
          "path": "spectralbridge.io.neon._read_new_neon_layout",
          "signature": "_read_new_neon_layout(h5_file: h5py.File, sample_slice: slice | tuple[int, int] | None=None, line_slice: slice | tuple[int, int] | None=None) -> tuple[np.ndarray, np.ndarray, Dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 496,
          "methods": [],
          "name": "_read_old_neon_layout",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_file"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "sample_slice"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "line_slice"
            }
          ],
          "path": "spectralbridge.io.neon._read_old_neon_layout",
          "signature": "_read_old_neon_layout(h5_file: h5py.File, sample_slice: slice | tuple[int, int] | None=None, line_slice: slice | tuple[int, int] | None=None) -> tuple[np.ndarray, np.ndarray, Dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 583,
          "methods": [],
          "name": "_read_site_group_legacy_layout",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_file"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "sample_slice"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "line_slice"
            }
          ],
          "path": "spectralbridge.io.neon._read_site_group_legacy_layout",
          "signature": "_read_site_group_legacy_layout(h5_file: h5py.File, sample_slice: slice | tuple[int, int] | None=None, line_slice: slice | tuple[int, int] | None=None) -> tuple[np.ndarray, np.ndarray, Dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Return ``(n_lines, n_samples)`` without loading the reflectance cube.\n\nParameters\n----------\nh5_path : Path\n    Existing NEON reflectance HDF5 file; layout is detected from file metadata rather than assumed from array dimensions.\n\nReturns\n-------\ntuple[int, int]\n    Number of along-track lines and across-track samples, without loading the reflectance cube.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nRuntimeError\n    If required processing or artifact validation cannot complete.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.io.peek_neon_raster_shape",
            "spectralbridge.io.neon.peek_neon_raster_shape"
          ],
          "kind": "function",
          "line": 698,
          "methods": [],
          "name": "peek_neon_raster_shape",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.io.neon.peek_neon_raster_shape",
          "signature": "peek_neon_raster_shape(h5_path: Path) -> tuple[int, int]",
          "summary": "Return ``(n_lines, n_samples)`` without loading the reflectance cube.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Return the across-track sample count without loading the reflectance cube.\n\nParameters\n----------\nh5_path : Path\n    Existing NEON reflectance HDF5 file; layout is detected from file metadata rather than assumed from array dimensions.\n\nReturns\n-------\nint\n    Across-track sample count, without loading the reflectance cube.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.io.peek_neon_sample_count",
            "spectralbridge.io.neon.peek_neon_sample_count"
          ],
          "kind": "function",
          "line": 765,
          "methods": [],
          "name": "peek_neon_sample_count",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.io.neon.peek_neon_sample_count",
          "signature": "peek_neon_sample_count(h5_path: Path) -> int",
          "summary": "Return the across-track sample count without loading the reflectance cube.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Return ``(cube, wavelengths, metadata)`` for ``h5_path`` regardless of layout.\n\nParameters\n----------\nh5_path : Path\n    Existing NEON reflectance HDF5 file; layout is detected from file metadata rather than assumed from array dimensions.\nsample_slice : slice | tuple[int, int] | None, default=None\n    Optional half-open across-track sample window, supplied as a slice or (start, stop); None reads the full sample axis.\nline_slice : slice | tuple[int, int] | None, default=None\n    Optional half-open along-track line window, supplied as a slice or (start, stop); None reads the full line axis.\n\nReturns\n-------\ntuple[np.ndarray, np.ndarray, Dict[str, Any]]\n    Cube shaped (lines, samples, bands), wavelength vector (bands,) in nanometers, and metadata including nodata, scale_factor and spatial/window provenance. Stored reflectance values are retained; use the explicit unitless reader when conversion is required.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nRuntimeError\n    If required processing or artifact validation cannot complete.\n\nNotes\n-----\n``sample_slice`` / ``line_slice`` are optional half-open windows on the\nacross-track and along-track axes. When omitted, the full cube is loaded.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.io.read_neon_cube",
            "spectralbridge.io.neon.read_neon_cube"
          ],
          "kind": "function",
          "line": 786,
          "methods": [],
          "name": "read_neon_cube",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "sample_slice"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "line_slice"
            }
          ],
          "path": "spectralbridge.io.neon.read_neon_cube",
          "signature": "read_neon_cube(h5_path: Path, sample_slice: slice | tuple[int, int] | None=None, line_slice: slice | tuple[int, int] | None=None) -> tuple[np.ndarray, np.ndarray, Dict[str, Any]]",
          "summary": "Return ``(cube, wavelengths, metadata)`` for ``h5_path`` regardless of layout.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/io/neon.py",
      "sha256": "07d009755f144fc9f91f362df5b1cb7dff1e6db7484ba96d02806d8026de36c8"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Optional": "typing.Optional",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass"
      },
      "module": "spectralbridge.io.neon_legacy",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "reflectance"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "wavelength"
            },
            {
              "annotation": "Optional[str]",
              "default": null,
              "name": "fwhm"
            },
            {
              "annotation": "Optional[str]",
              "default": null,
              "name": "solar_zenith"
            },
            {
              "annotation": "Optional[str]",
              "default": null,
              "name": "sensor_zenith"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Group legacy NEON HDF5 dataset locations for reflectance, wavelengths and ancillary metadata.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 10,
          "methods": [],
          "name": "NeonPaths",
          "parameters": [],
          "path": "spectralbridge.io.neon_legacy.NeonPaths",
          "signature": null,
          "summary": "Group legacy NEON HDF5 dataset locations for reflectance, wavelengths and ancillary metadata.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/validate_figures.py",
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 21,
          "methods": [],
          "name": "_has",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "g"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.io.neon_legacy._has",
          "signature": "_has(g: h5py.File, path: str) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Heuristically detect pre-2021 NEON AOP DP1.30006 HDF5 layout.\nLegacy signals (any True -> legacy):\n  - Spectral wavelength dataset capitalized as 'Wavelength' not 'wavelength'\n  - FWHM capitalized 'FWHM' not 'fwhm'\n  - Angle metadata capitalized: 'to-sun_Zenith_Angle', 'to-sensor_Zenith_Angle'",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 29,
          "methods": [],
          "name": "detect_legacy_neon_schema",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5"
            }
          ],
          "path": "spectralbridge.io.neon_legacy.detect_legacy_neon_schema",
          "signature": "detect_legacy_neon_schema(h5: h5py.File) -> bool",
          "summary": "Heuristically detect pre-2021 NEON AOP DP1.30006 HDF5 layout.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return canonical dataset paths that work for both legacy and modern files.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 46,
          "methods": [],
          "name": "resolve_neon_paths",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5"
            }
          ],
          "path": "spectralbridge.io.neon_legacy.resolve_neon_paths",
          "signature": "resolve_neon_paths(h5: h5py.File) -> NeonPaths",
          "summary": "Return canonical dataset paths that work for both legacy and modern files.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/io/neon_legacy.py",
      "sha256": "89551f7d009fdfe7beda7878c8d7587d6bc026e803f639cf646f5b75b222c34e"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [
        "NeonResolved",
        "canonical_vectors",
        "detect_legacy",
        "resolve"
      ],
      "docstring": "",
      "export_expressions": [
        "__all__ = ['NeonResolved', 'detect_legacy', 'resolve', 'canonical_vectors']"
      ],
      "imports": {
        "Optional": "typing.Optional",
        "Tuple": "typing.Tuple",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass"
      },
      "module": "spectralbridge.io.neon_schema",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "name": "ds_reflectance"
            },
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "name": "ds_wavelength"
            },
            {
              "annotation": "Optional[h5py.Dataset]",
              "default": null,
              "name": "ds_fwhm"
            },
            {
              "annotation": "Optional[h5py.Dataset]",
              "default": null,
              "name": "ds_sun_zen"
            },
            {
              "annotation": "Optional[h5py.Dataset]",
              "default": null,
              "name": "ds_sensor_zen"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "is_legacy"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "References to key NEON HDF5 datasets and legacy flag.",
          "examples": [],
          "exports": [
            "spectralbridge.io.neon_schema.NeonResolved"
          ],
          "kind": "class",
          "line": 11,
          "methods": [],
          "name": "NeonResolved",
          "parameters": [],
          "path": "spectralbridge.io.neon_schema.NeonResolved",
          "signature": null,
          "summary": "References to key NEON HDF5 datasets and legacy flag.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/validate_figures.py",
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 22,
          "methods": [],
          "name": "_has",
          "parameters": [
            {
              "annotation": "h5py.File | h5py.Group",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.io.neon_schema._has",
          "signature": "_has(h5: h5py.File | h5py.Group, path: str) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return ``True`` when the legacy (pre-2021) NEON schema is detected.",
          "examples": [],
          "exports": [
            "spectralbridge.io.neon_schema.detect_legacy"
          ],
          "kind": "function",
          "line": 30,
          "methods": [],
          "name": "detect_legacy",
          "parameters": [
            {
              "annotation": "h5py.File | h5py.Group",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5"
            }
          ],
          "path": "spectralbridge.io.neon_schema.detect_legacy",
          "signature": "detect_legacy(h5: h5py.File | h5py.Group) -> bool",
          "summary": "Return ``True`` when the legacy (pre-2021) NEON schema is detected.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return dataset handles for reflectance, wavelength, FWHM, and angles.",
          "examples": [
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/plant_spectral_regions.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [
            "spectralbridge.io.neon_schema.resolve"
          ],
          "kind": "function",
          "line": 42,
          "methods": [],
          "name": "resolve",
          "parameters": [
            {
              "annotation": "h5py.File | h5py.Group",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5"
            }
          ],
          "path": "spectralbridge.io.neon_schema.resolve",
          "signature": "resolve(h5: h5py.File | h5py.Group) -> NeonResolved",
          "summary": "Return dataset handles for reflectance, wavelength, FWHM, and angles.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Load spectral/angle vectors in canonical float32 units.",
          "examples": [],
          "exports": [
            "spectralbridge.io.neon_schema.canonical_vectors"
          ],
          "kind": "function",
          "line": 85,
          "methods": [],
          "name": "canonical_vectors",
          "parameters": [
            {
              "annotation": "NeonResolved",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "nr"
            }
          ],
          "path": "spectralbridge.io.neon_schema.canonical_vectors",
          "signature": "canonical_vectors(nr: NeonResolved) -> Tuple[np.ndarray, Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray]]",
          "summary": "Load spectral/angle vectors in canonical float32 units.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/io/neon_schema.py",
      "sha256": "530943f1ff951e57006168137f7d4943e699a3a4b13310e93bdc87cf59f8243d"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Agreement statistics and true Landsat-footprint aggregation, without fitting calibration.",
      "export_expressions": [],
      "imports": {
        "Affine": "affine.Affine",
        "ExitStack": "contextlib.ExitStack",
        "LANDSAT_SURFACE_REFLECTANCE_OFFSET": "spectralbridge.landsat_validation.LANDSAT_SURFACE_REFLECTANCE_OFFSET",
        "LANDSAT_SURFACE_REFLECTANCE_SCALE": "spectralbridge.landsat_validation.LANDSAT_SURFACE_REFLECTANCE_SCALE",
        "Transformer": "pyproj.Transformer",
        "Window": "rasterio.windows.Window",
        "_clear_landsat_mask": "spectralbridge.landsat_validation._clear_landsat_mask",
        "csr_matrix": "scipy.sparse.csr_matrix",
        "dataclass": "dataclasses.dataclass",
        "from_bounds": "rasterio.windows.from_bounds",
        "reflectance_to_unitless_multiplier": "spectralbridge.io.neon.reflectance_to_unitless_multiplier",
        "spearmanr": "scipy.stats.spearmanr",
        "transform_bounds": "rasterio.warp.transform_bounds"
      },
      "module": "spectralbridge.landsat_agreement",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "crs"
            },
            {
              "annotation": "tuple",
              "default": null,
              "name": "transform"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "width"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "height"
            },
            {
              "annotation": "int",
              "default": "0",
              "name": "row_offset"
            },
            {
              "annotation": "int",
              "default": "0",
              "name": "col_offset"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Describe the common CRS, affine grid, dimensions and support used for Landsat comparisons.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 22,
          "methods": [
            {
              "docstring": "",
              "line": 33,
              "name": "affine",
              "parameters": [],
              "private": false,
              "signature": "affine(self)"
            }
          ],
          "name": "ReferenceGrid",
          "parameters": [],
          "path": "spectralbridge.landsat_agreement.ReferenceGrid",
          "signature": null,
          "summary": "Describe the common CRS, affine grid, dimensions and support used for Landsat comparisons.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "L8/9: reject flags 0-5, B1-B7 saturation and terrain occlusion.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 39,
          "methods": [],
          "name": "mask_landsat_qa",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qa_pixel"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qa_radsat"
            }
          ],
          "path": "spectralbridge.landsat_agreement.mask_landsat_qa",
          "signature": "mask_landsat_qa(qa_pixel, qa_radsat)",
          "summary": "L8/9: reject flags 0-5, B1-B7 saturation and terrain occlusion.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Official Collection 2 Level-2 DN contract; never guess from magnitudes.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 55,
          "methods": [],
          "name": "scale_landsat_sr",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dn"
            }
          ],
          "path": "spectralbridge.landsat_agreement.scale_landsat_sr",
          "signature": "scale_landsat_sr(dn)",
          "summary": "Official Collection 2 Level-2 DN contract; never guess from magnitudes.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Compute spectral angle in degrees along matching seven-channel vectors; zero-norm comparisons yield NaN.",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/figure_panels.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 67,
          "methods": [],
          "name": "spectral_angle",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "real"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "synthetic"
            }
          ],
          "path": "spectralbridge.landsat_agreement.spectral_angle",
          "signature": "spectral_angle(real, synthetic)",
          "summary": "Compute spectral angle in degrees along matching seven-channel vectors; zero-norm comparisons yield NaN.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "y versus x, lambda=variance(y measurement error)/variance(x error).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 84,
          "methods": [],
          "name": "deming_regression",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            },
            {
              "annotation": null,
              "default": "1.0",
              "kind": "positional-or-keyword",
              "name": "error_variance_ratio"
            }
          ],
          "path": "spectralbridge.landsat_agreement.deming_regression",
          "signature": "deming_regression(x, y, error_variance_ratio=1.0)",
          "summary": "y versus x, lambda=variance(y measurement error)/variance(x error).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Summarize paired scalar reflectance observations in their supplied units.\n\nArgs:\n    real (array-like): Reference reflectance values.\n    synthetic (array-like): Same-shape modeled reflectance values.\n\nReturns:\n    dict: Finite-pair N/status, bias (synthetic minus real), MAE, RMSE,\n        IQR-normalized RMSE, correlations, identity/Deming fits and residual\n        diagnostics. Undefined sparse/constant statistics are NaN. No clipping\n        or unit conversion occurs; bias/MAE/RMSE retain reflectance units.\n\nRaises:\n    ValueError: Inputs cannot be broadcast/aligned for pairwise evaluation.\n\nCorrelation is not radiometric agreement. This function supplies no\npopulation uncertainty; spatial-block intervals are added by the workflow.",
          "examples": [
            "examples/scientific_workflows_offline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 108,
          "methods": [],
          "name": "compute_agreement_metrics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "real"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "synthetic"
            }
          ],
          "path": "spectralbridge.landsat_agreement.compute_agreement_metrics",
          "signature": "compute_agreement_metrics(real, synthetic) -> dict",
          "summary": "Summarize paired scalar reflectance observations in their supplied units.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Resample spatial blocks, never individual pixels as independent evidence.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 180,
          "methods": [],
          "name": "spatial_bootstrap_indices",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cols"
            },
            {
              "annotation": null,
              "default": "499",
              "kind": "positional-or-keyword",
              "name": "replicates"
            },
            {
              "annotation": null,
              "default": "10",
              "kind": "positional-or-keyword",
              "name": "block_pixels"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "positional-or-keyword",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.landsat_agreement.spatial_bootstrap_indices",
          "signature": "spatial_bootstrap_indices(rows, cols, replicates=499, block_pixels=10, seed=20261014)",
          "summary": "Resample spatial blocks, never individual pixels as independent evidence.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Exact interval overlaps, including fractional source/destination edges.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 205,
          "methods": [],
          "name": "_axis_weights",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "destination_edges"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_edges"
            }
          ],
          "path": "spectralbridge.landsat_agreement._axis_weights",
          "signature": "_axis_weights(destination_edges, source_edges)",
          "summary": "Exact interval overlaps, including fractional source/destination edges.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 224,
          "methods": [],
          "name": "_source_scale",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "explicit"
            }
          ],
          "path": "spectralbridge.landsat_agreement._source_scale",
          "signature": "_source_scale(source, explicit)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Aggregate joint seven-band products to actual projected Landsat footprints.\n\nArgs:\n    products (dict): Variant names mapped to seven-band raster paths.\n    grid (ReferenceGrid): Actual north-up projected Landsat grid.\n    scale_factors (dict, optional): Explicit divisor by variant. Otherwise\n        verified raster metadata must declare scale; never infer visually.\n    offset_m (tuple[float, float]): Declared source registration offset in\n        projected meters; unsupported cross-CRS offsets raise ValueError.\n    strip_rows (int): Positive destination strip size for bounded reads.\n\nReturns:\n    dict: Variant means/variances in unitless reflectance, source geometry\n        coverage, joint validity/full-footprint coverage, contributing counts,\n        and aggregation method. Unsupported cells have NaN means.\n\nRaises:\n    ValueError: Invalid grid, scale, dimensions, offsets or variant alignment.\n    OSError: Rasters cannot be read.\n\nSame-CRS uses interval intersections; cross-CRS uses transformed source-cell\npolygons. Whole-footprint coverage is not normalized to contributing source\noverlap. Joint finite/nodata masks keep variants and seven channels paired.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 241,
          "methods": [],
          "name": "aggregate_to_landsat_grid",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "grid"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "scale_factors"
            },
            {
              "annotation": null,
              "default": "(0.0, 0.0)",
              "kind": "keyword-only",
              "name": "offset_m"
            },
            {
              "annotation": null,
              "default": "8",
              "kind": "keyword-only",
              "name": "strip_rows"
            }
          ],
          "path": "spectralbridge.landsat_agreement.aggregate_to_landsat_grid",
          "signature": "aggregate_to_landsat_grid(products, grid, *, scale_factors=None, offset_m=(0.0, 0.0), strip_rows=8) -> dict",
          "summary": "Aggregate joint seven-band products to actual projected Landsat footprints.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Bounded destination-pixel polygon intersections; no implicit regridding.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 403,
          "methods": [],
          "name": "_aggregate_cross_crs",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sources"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "grid"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "multipliers"
            }
          ],
          "path": "spectralbridge.landsat_agreement._aggregate_cross_crs",
          "signature": "_aggregate_cross_crs(sources, grid, multipliers)",
          "summary": "Bounded destination-pixel polygon intersections; no implicit regridding.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/landsat_agreement.py",
      "sha256": "e4b40f0a9ba05a5a6315d74599400b64ba369fd505afa1bc969c2f24b930dd91"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Scientific figures from compact completed real-Landsat flight validation data.",
      "export_expressions": [],
      "imports": {
        "BoundaryNorm": "matplotlib.colors.BoundaryNorm",
        "ListedColormap": "matplotlib.colors.ListedColormap",
        "OLI_CHANNELS": "spectralbridge.landsat_agreement.OLI_CHANNELS",
        "Path": "pathlib.Path",
        "Rectangle": "matplotlib.patches.Rectangle"
      },
      "module": "spectralbridge.landsat_flight_report",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render common-support maps and band diagnostics from an existing flight-validation result packet.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 18,
          "methods": [],
          "name": "build_flight_validation_figures",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "0.4",
              "kind": "positional-or-keyword",
              "name": "rgb_max"
            }
          ],
          "path": "spectralbridge.landsat_flight_report.build_flight_validation_figures",
          "signature": "build_flight_validation_figures(output, rgb_max=0.4)",
          "summary": "Render common-support maps and band diagnostics from an existing flight-validation result packet.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/landsat_flight_report.py",
      "sha256": "31d6bef6727807d628e3d6a28e830884ad3bd1e7f6de073c822c3d7350ee30cc"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Independent seven-band NEON-to-real-Landsat validation, one flight at a time.\n\nExtends existing Landsat transport/identity/scaling helpers. No calibration is fit.",
      "export_expressions": [],
      "imports": {
        "OLI_CENTERS": "spectralbridge.landsat_agreement.OLI_CENTERS",
        "OLI_CHANNELS": "spectralbridge.landsat_agreement.OLI_CHANNELS",
        "Path": "pathlib.Path",
        "ReferenceGrid": "spectralbridge.landsat_agreement.ReferenceGrid",
        "Window": "rasterio.windows.Window",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "aggregate_to_landsat_grid": "spectralbridge.landsat_agreement.aggregate_to_landsat_grid",
        "asdict": "dataclasses.asdict",
        "build_flight_validation_figures": "spectralbridge.landsat_flight_report.build_flight_validation_figures",
        "compute_agreement_metrics": "spectralbridge.landsat_agreement.compute_agreement_metrics",
        "dataclass": "dataclasses.dataclass",
        "distance_transform_edt": "scipy.ndimage.distance_transform_edt",
        "from_bounds": "rasterio.windows.from_bounds",
        "mask_landsat_qa": "spectralbridge.landsat_agreement.mask_landsat_qa",
        "scale_landsat_sr": "spectralbridge.landsat_agreement.scale_landsat_sr",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "spatial_bootstrap_indices": "spectralbridge.landsat_agreement.spatial_bootstrap_indices",
        "spearmanr": "scipy.stats.spearmanr",
        "spectral_angle": "spectralbridge.landsat_agreement.spectral_angle",
        "timedelta": "datetime.timedelta",
        "transform_bounds": "rasterio.warp.transform_bounds",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.landsat_flight_validation",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "flight_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "site"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "acquisition_datetime"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "corrected_raster"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "undarkened_raster"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "adjusted_raster"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "synthetic_scale_factor"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "time_provenance"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "source_h5"
            },
            {
              "annotation": "bool",
              "default": "False",
              "name": "timezone_verified"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Specify existing raw/adjusted synthetic products and an actual Landsat comparison source for one flight.",
          "examples": [
            "examples/real_landsat_validation.py"
          ],
          "exports": [],
          "kind": "class",
          "line": 35,
          "methods": [],
          "name": "FlightValidationInput",
          "parameters": [],
          "path": "spectralbridge.landsat_flight_validation.FlightValidationInput",
          "signature": null,
          "summary": "Specify existing raw/adjusted synthetic products and an actual Landsat comparison source for one flight.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "int",
              "default": "16",
              "name": "search_days"
            },
            {
              "annotation": "float",
              "default": "0.9",
              "name": "minimum_valid_coverage"
            },
            {
              "annotation": "int",
              "default": "100",
              "name": "minimum_pixels"
            },
            {
              "annotation": "int",
              "default": "499",
              "name": "bootstraps"
            },
            {
              "annotation": "int",
              "default": "10",
              "name": "spatial_block_pixels"
            },
            {
              "annotation": "int",
              "default": "20261014",
              "name": "seed"
            },
            {
              "annotation": "float",
              "default": "0.4",
              "name": "rgb_max"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Configure explicit support, acquisition-time, screening and rendering settings for flight validation.",
          "examples": [
            "examples/real_landsat_validation.py"
          ],
          "exports": [],
          "kind": "class",
          "line": 51,
          "methods": [
            {
              "docstring": "",
              "line": 62,
              "name": "validate",
              "parameters": [],
              "private": false,
              "signature": "validate(self)"
            }
          ],
          "name": "FlightValidationConfig",
          "parameters": [],
          "path": "spectralbridge.landsat_flight_validation.FlightValidationConfig",
          "signature": null,
          "summary": "Configure explicit support, acquisition-time, screening and rendering settings for flight validation.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "All searched scenes; compatibility and collection are explicit gates.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 74,
          "methods": [],
          "name": "candidate_records",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "items"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "neon_datetime"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation.candidate_records",
          "signature": "candidate_records(items, neon_datetime)",
          "summary": "All searched scenes; compatibility and collection are explicit gates.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Temporal -> clear overlap -> compatibility -> coverage -> quality; never error.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 132,
          "methods": [],
          "name": "rank_scene_candidates",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": "100",
              "kind": "positional-or-keyword",
              "name": "minimum_pixels"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation.rank_scene_candidates",
          "signature": "rank_scene_candidates(table, minimum_pixels=100)",
          "summary": "Temporal -> clear overlap -> compatibility -> coverage -> quality; never error.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 154,
          "methods": [],
          "name": "_assets",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "item"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation._assets",
          "signature": "_assets(item)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Windowed Collection 2 QA with a 600-m halo for conservative proximity.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 158,
          "methods": [],
          "name": "load_scene_qa",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "item"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bounds_wgs84"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cache"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation.load_scene_qa",
          "signature": "load_scene_qa(item, bounds_wgs84, cache)",
          "summary": "Windowed Collection 2 QA with a 600-m halo for conservative proximity.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read seven real SR assets on their native Landsat window; no TOA route.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 245,
          "methods": [],
          "name": "load_scene_surface_reflectance",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "item"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "grid"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qa"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cache"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation.load_scene_surface_reflectance",
          "signature": "load_scene_surface_reflectance(item, grid, qa, cache)",
          "summary": "Read seven real SR assets on their native Landsat window; no TOA route.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 328,
          "methods": [],
          "name": "_validate_sources",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation._validate_sources",
          "signature": "_validate_sources(flight)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 368,
          "methods": [],
          "name": "_interval_metrics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "draws"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation._interval_metrics",
          "signature": "_interval_metrics(x, values, draws)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Select one real scene and compare it with a verified seven-band flight.\n\nArgs:\n    flight (FlightValidationInput): Source paths, identity, acquisition time\n        and explicit scale/time provenance. Synthetic bands must be ordered\n        coastal/blue/green/red/NIR/SWIR1/SWIR2.\n    output (str or pathlib.Path): Checkpoint/result directory.\n    config (FlightValidationConfig, optional): Search, coverage and bootstrap\n        settings; defaults include 0.9 whole-footprint valid coverage.\n    items (sequence, optional): Supplied STAC items; None enables discovery.\n    client (object, optional): STAC client for discovery.\n\nReturns:\n    dict: Status/identity/checksummed output manifest. Explicit no-scene and\n        unusable-scene statuses are retained, not fabricated successful fits.\n        Results contain matched arrays, tables, QA and figures in output.\n\nRaises:\n    ValueError: Source coordinates/scales, metadata or configuration invalid.\n    OSError: Source/cache/output IO fails. Network/library errors propagate\n        when discovery/download is requested; use optional landsat extra.\n\nInputs are read in place. Complete valid outputs are reused. Uses actual\nfootprint area, QA_PIXEL/RADSAT, official C2 SR scaling, seven-band joint\nsupport and spatial-block uncertainty. One flight is not cross-site evidence.",
          "examples": [
            "examples/real_landsat_validation.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 394,
          "methods": [],
          "name": "compare_flight_to_real_landsat",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "items"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "client"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation.compare_flight_to_real_landsat",
          "signature": "compare_flight_to_real_landsat(flight, output, *, config=None, items=None, client=None) -> dict",
          "summary": "Select one real scene and compare it with a verified seven-band flight.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 748,
          "methods": [],
          "name": "_registration",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scales"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "grid"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qavalid"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "actual"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation._registration",
          "signature": "_registration(products, scales, grid, qavalid, actual, root, config)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 780,
          "methods": [],
          "name": "_decomposition",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pixels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation._decomposition",
          "signature": "_decomposition(pixels, root)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read compact completed results only; equally weight flights, never pixels.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 811,
          "methods": [],
          "name": "summarize_flight_validations",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "outputs"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "destination"
            }
          ],
          "path": "spectralbridge.landsat_flight_validation.summarize_flight_validations",
          "signature": "summarize_flight_validations(outputs, destination)",
          "summary": "Read compact completed results only; equally weight flights, never pixels.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/landsat_flight_validation.py",
      "sha256": "d5cf0d0a815b51d70418bf181a8dc5c7f2c730e2d417a789228d84ecc4910881"
    },
    {
      "area": "analysis",
      "constants": [
        {
          "annotation": null,
          "name": "PLANETARY_COMPUTER_STAC",
          "value": "'https://planetarycomputer.microsoft.com/api/stac/v1'"
        },
        {
          "annotation": null,
          "name": "LANDSAT_COLLECTION",
          "value": "'landsat-c2-l2'"
        },
        {
          "annotation": null,
          "name": "LANDSAT_SURFACE_REFLECTANCE_SCALE",
          "value": "2.75e-05"
        },
        {
          "annotation": null,
          "name": "LANDSAT_SURFACE_REFLECTANCE_OFFSET",
          "value": "-0.2"
        }
      ],
      "declared_exports": [
        "LANDSAT_COLLECTION",
        "LANDSAT_SURFACE_REFLECTANCE_OFFSET",
        "LANDSAT_SURFACE_REFLECTANCE_SCALE",
        "LandsatObservation",
        "PLANETARY_COMPUTER_STAC",
        "acquire_landsat_observation",
        "compare_landsat_common_support",
        "load_supplied_landsat_observation",
        "raster_acquisition_datetime",
        "raster_bounds_wgs84"
      ],
      "docstring": "Optional Landsat acquisition and common-support drone validation.\n\nThe core drone pipeline does not depend on this module succeeding.  Network\nsearch, remote COG access, cloud screening, and optional NEON comparison are QA\nactivities performed only after valid Landsat-like drone products exist.",
      "export_expressions": [
        "__all__ = ['LANDSAT_COLLECTION', 'LANDSAT_SURFACE_REFLECTANCE_OFFSET', 'LANDSAT_SURFACE_REFLECTANCE_SCALE', 'LandsatObservation', 'PLANETARY_COMPUTER_STAC', 'acquire_landsat_observation', 'compare_landsat_common_support', 'load_supplied_landsat_observation', 'raster_acquisition_datetime', 'raster_bounds_wgs84']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Client": "pystac_client.Client",
        "DroneTranslationPlan": "spectralbridge.drone_translation.DroneTranslationPlan",
        "Iterable": "typing.Iterable",
        "Path": "pathlib.Path",
        "Resampling": "rasterio.warp.Resampling",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "datetime": "datetime.datetime",
        "from_bounds": "rasterio.windows.from_bounds",
        "reproject": "rasterio.warp.reproject",
        "timedelta": "datetime.timedelta",
        "timezone": "datetime.timezone",
        "transform_bounds": "rasterio.warp.transform_bounds"
      },
      "module": "spectralbridge.landsat_validation",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "product_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "target_sensor"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "acquisition_datetime"
            },
            {
              "annotation": "float | None",
              "default": null,
              "name": "cloud_cover"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "raster_path"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "metadata_path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source"
            },
            {
              "annotation": "float | None",
              "default": null,
              "name": "temporal_offset_days"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "name": "band_common_names"
            },
            {
              "annotation": "tuple[int, ...]",
              "default": null,
              "name": "target_band_indices"
            },
            {
              "annotation": "tuple[float, ...]",
              "default": null,
              "name": "wavelengths_nm"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "scene_selection"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "A cropped, QA-masked actual Landsat surface-reflectance product.",
          "examples": [],
          "exports": [
            "spectralbridge.landsat_validation.LandsatObservation"
          ],
          "kind": "class",
          "line": 45,
          "methods": [],
          "name": "LandsatObservation",
          "parameters": [],
          "path": "spectralbridge.landsat_validation.LandsatObservation",
          "signature": null,
          "summary": "A cropped, QA-masked actual Landsat surface-reflectance product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 62,
          "methods": [],
          "name": "_sensor_from_text",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.landsat_validation._sensor_from_text",
          "signature": "_sensor_from_text(value: str) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 75,
          "methods": [],
          "name": "_item_sensor",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "item"
            }
          ],
          "path": "spectralbridge.landsat_validation._item_sensor",
          "signature": "_item_sensor(item: Any) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 90,
          "methods": [],
          "name": "_asset_common_name",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "key"
            },
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "asset"
            }
          ],
          "path": "spectralbridge.landsat_validation._asset_common_name",
          "signature": "_asset_common_name(key: str, asset: Any) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 112,
          "methods": [],
          "name": "_asset_scale_offset",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "asset"
            }
          ],
          "path": "spectralbridge.landsat_validation._asset_scale_offset",
          "signature": "_asset_scale_offset(asset: Any) -> tuple[float, float, float | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 122,
          "methods": [],
          "name": "_parse_datetime",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.landsat_validation._parse_datetime",
          "signature": "_parse_datetime(value: Any) -> datetime | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 137,
          "methods": [],
          "name": "_absolute_offset_days",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "first"
            },
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "second"
            }
          ],
          "path": "spectralbridge.landsat_validation._absolute_offset_days",
          "signature": "_absolute_offset_days(first: Any, second: Any) -> float | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return valid Collection 2 QA_PIXEL support.\n\nBits 0--5 represent fill, dilated cloud, cirrus, cloud, cloud shadow, and\nsnow.  Keeping only pixels where all six are clear is conservative across\nLandsat 5--9; non-applicable bits remain zero.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 145,
          "methods": [],
          "name": "_clear_landsat_mask",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qa"
            }
          ],
          "path": "spectralbridge.landsat_validation._clear_landsat_mask",
          "signature": "_clear_landsat_mask(qa: np.ndarray) -> np.ndarray",
          "summary": "Return valid Collection 2 QA_PIXEL support.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 157,
          "methods": [],
          "name": "_write_observation_metadata",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "payload"
            }
          ],
          "path": "spectralbridge.landsat_validation._write_observation_metadata",
          "signature": "_write_observation_metadata(path: Path, payload: dict[str, Any]) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the deterministic request contract for one cached STAC crop.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 163,
          "methods": [],
          "name": "_landsat_cache_signature",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_id"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "target_sensor"
            },
            {
              "annotation": "Sequence[float]",
              "default": null,
              "kind": "keyword-only",
              "name": "bounds_wgs84"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "keyword-only",
              "name": "temporal_offset_days"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "keyword-only",
              "name": "cloud_cover"
            }
          ],
          "path": "spectralbridge.landsat_validation._landsat_cache_signature",
          "signature": "_landsat_cache_signature(*, product_id: str, target_sensor: str, bounds_wgs84: Sequence[float], temporal_offset_days: float | None, cloud_cover: float | None) -> tuple[str, dict[str, Any]]",
          "summary": "Return the deterministic request contract for one cached STAC crop.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Load a cache entry only when its request and raster contract validate.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 190,
          "methods": [],
          "name": "_load_cached_stac_observation",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raster_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "metadata_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "expected_signature"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_id"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "target_sensor"
            }
          ],
          "path": "spectralbridge.landsat_validation._load_cached_stac_observation",
          "signature": "_load_cached_stac_observation(*, raster_path: Path, metadata_path: Path, expected_signature: str, product_id: str, target_sensor: str) -> LandsatObservation | None",
          "summary": "Load a cache entry only when its request and raster contract validate.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 239,
          "methods": [],
          "name": "_crop_stac_item",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "item"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "target_sensor"
            },
            {
              "annotation": "tuple[float, float, float, float]",
              "default": null,
              "kind": "keyword-only",
              "name": "bounds_wgs84"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_dir"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "keyword-only",
              "name": "temporal_offset_days"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "keyword-only",
              "name": "cloud_cover"
            }
          ],
          "path": "spectralbridge.landsat_validation._crop_stac_item",
          "signature": "_crop_stac_item(item: Any, *, target_sensor: str, bounds_wgs84: tuple[float, float, float, float], output_dir: Path, temporal_offset_days: float | None, cloud_cover: float | None) -> LandsatObservation",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Discover and cache the best overlapping Landsat Collection 2 L2 crop.",
          "examples": [],
          "exports": [
            "spectralbridge.landsat_validation.acquire_landsat_observation"
          ],
          "kind": "function",
          "line": 386,
          "methods": [],
          "name": "acquire_landsat_observation",
          "parameters": [
            {
              "annotation": "Sequence[float]",
              "default": null,
              "kind": "keyword-only",
              "name": "bounds_wgs84"
            },
            {
              "annotation": "datetime | str",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "search_days"
            },
            {
              "annotation": "Iterable[str]",
              "default": null,
              "kind": "keyword-only",
              "name": "target_sensors"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_dir"
            },
            {
              "annotation": "float",
              "default": "50.0",
              "kind": "keyword-only",
              "name": "cloud_cover_max"
            }
          ],
          "path": "spectralbridge.landsat_validation.acquire_landsat_observation",
          "signature": "acquire_landsat_observation(*, bounds_wgs84: Sequence[float], acquisition_datetime: datetime | str, search_days: int, target_sensors: Iterable[str], output_dir: str | Path, cloud_cover_max: float=50.0) -> LandsatObservation | None",
          "summary": "Discover and cache the best overlapping Landsat Collection 2 L2 crop.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Load an acquisition manifest or a user-supplied multiband raster.",
          "examples": [],
          "exports": [
            "spectralbridge.landsat_validation.load_supplied_landsat_observation"
          ],
          "kind": "function",
          "line": 458,
          "methods": [],
          "name": "load_supplied_landsat_observation",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Iterable[str]",
              "default": null,
              "kind": "keyword-only",
              "name": "target_sensors"
            }
          ],
          "path": "spectralbridge.landsat_validation.load_supplied_landsat_observation",
          "signature": "load_supplied_landsat_observation(path: str | Path, *, target_sensors: Iterable[str]) -> LandsatObservation",
          "summary": "Load an acquisition manifest or a user-supplied multiband raster.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Transform raster bounds to (west, south, east, north) in WGS84 degrees; reject a missing CRS.",
          "examples": [],
          "exports": [
            "spectralbridge.landsat_validation.raster_bounds_wgs84"
          ],
          "kind": "function",
          "line": 550,
          "methods": [],
          "name": "raster_bounds_wgs84",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.landsat_validation.raster_bounds_wgs84",
          "signature": "raster_bounds_wgs84(path: str | Path) -> tuple[float, float, float, float]",
          "summary": "Transform raster bounds to (west, south, east, north) in WGS84 degrees; reject a missing CRS.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read an acquisition timestamp tag or conservative YYYYMMDD filename token.",
          "examples": [],
          "exports": [
            "spectralbridge.landsat_validation.raster_acquisition_datetime"
          ],
          "kind": "function",
          "line": 567,
          "methods": [],
          "name": "raster_acquisition_datetime",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.landsat_validation.raster_acquisition_datetime",
          "signature": "raster_acquisition_datetime(path: str | Path) -> str | None",
          "summary": "Read an acquisition timestamp tag or conservative YYYYMMDD filename token.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 591,
          "methods": [],
          "name": "_pair_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reference"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "candidate"
            }
          ],
          "path": "spectralbridge.landsat_validation._pair_metrics",
          "signature": "_pair_metrics(reference: np.ndarray, candidate: np.ndarray) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 628,
          "methods": [],
          "name": "_aggregate_to_reference_grid",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_path"
            },
            {
              "annotation": "Sequence[int]",
              "default": null,
              "kind": "keyword-only",
              "name": "source_band_indices"
            },
            {
              "annotation": "Any",
              "default": null,
              "kind": "keyword-only",
              "name": "reference"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "valid_fraction_threshold"
            }
          ],
          "path": "spectralbridge.landsat_validation._aggregate_to_reference_grid",
          "signature": "_aggregate_to_reference_grid(source_path: Path, *, source_band_indices: Sequence[int], reference: Any, valid_fraction_threshold: float) -> tuple[np.ndarray, np.ndarray]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Aggregate drone/optional NEON products to the actual Landsat grid.",
          "examples": [],
          "exports": [
            "spectralbridge.landsat_validation.compare_landsat_common_support"
          ],
          "kind": "function",
          "line": 679,
          "methods": [],
          "name": "compare_landsat_common_support",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "translated_img"
            },
            {
              "annotation": "DroneTranslationPlan",
              "default": null,
              "kind": "keyword-only",
              "name": "plan"
            },
            {
              "annotation": "LandsatObservation",
              "default": null,
              "kind": "keyword-only",
              "name": "observation"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_dir"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "neon_product"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "drone_acquisition_datetime"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "neon_acquisition_datetime"
            },
            {
              "annotation": "float",
              "default": "0.5",
              "kind": "keyword-only",
              "name": "valid_fraction_threshold"
            }
          ],
          "path": "spectralbridge.landsat_validation.compare_landsat_common_support",
          "signature": "compare_landsat_common_support(*, translated_img: str | Path, plan: DroneTranslationPlan, observation: LandsatObservation, output_dir: str | Path, neon_product: str | Path | None=None, drone_acquisition_datetime: str | None=None, neon_acquisition_datetime: str | None=None, valid_fraction_threshold: float=0.5) -> dict[str, Any]",
          "summary": "Aggregate drone/optional NEON products to the actual Landsat grid.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/landsat_validation.py",
      "sha256": "515bc0357e37b55b2f5c411ac02ddb4901d074dc4d99a0c1197e2af86da2e1c2"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [
        "candidate_ambiguity",
        "compare_representations",
        "constrained_unmixing",
        "evaluate_feature_budget",
        "evaluate_identifiability",
        "evaluate_library_size",
        "fit_mesma",
        "fit_ridge_fractions",
        "fraction_diagnostics",
        "generate_mixtures",
        "project_simplex",
        "spectral_separability"
      ],
      "docstring": "Composable spectral-library methods, independent of the repository study.\n\nInstall ``earthlab-spectralbridge[analytics]``. Arrays use observations by features;\nunits and wavelength support must be common. No routine establishes field cover,\nphysical calibration or universal ecological transfer. See the scientific API guide.",
      "export_expressions": [
        "__all__ = ['spectral_separability', 'evaluate_identifiability', 'evaluate_feature_budget', 'compare_representations', 'generate_mixtures', 'constrained_unmixing', 'fit_mesma', 'candidate_ambiguity', 'fit_ridge_fractions', 'project_simplex', 'fraction_diagnostics', 'evaluate_library_size']"
      ],
      "imports": {
        "AuditConfig": "spectralbridge.pft_method_audit.AuditConfig",
        "BaseEstimator": "sklearn.base.BaseEstimator",
        "GroupKFold": "sklearn.model_selection.GroupKFold",
        "LogisticRegression": "sklearn.linear_model.LogisticRegression",
        "PCA": "sklearn.decomposition.PCA",
        "Pipeline": "sklearn.pipeline.Pipeline",
        "Ridge": "sklearn.linear_model.Ridge",
        "StandardScaler": "sklearn.preprocessing.StandardScaler",
        "StratifiedGroupKFold": "sklearn.model_selection.StratifiedGroupKFold",
        "TransformerMixin": "sklearn.base.TransformerMixin",
        "balanced_accuracy_score": "sklearn.metrics.balanced_accuracy_score",
        "cdist": "scipy.spatial.distance.cdist",
        "clone": "sklearn.base.clone",
        "combinations": "itertools.combinations",
        "confusion_matrix": "sklearn.metrics.confusion_matrix",
        "fcls": "spectralbridge.mixtures.fcls",
        "holm": "spectralbridge.plant_pft_statistics.holm",
        "method_statistics": "spectralbridge.pft_method_audit.method_statistics",
        "model_indices": "spectralbridge.mixtures.model_indices",
        "orthogonal_feature_path": "spectralbridge.researcher_information.orthogonal_feature_path",
        "project": "spectralbridge.researcher_information.project_simplex",
        "project_simplex": "spectralbridge.researcher_information.project_simplex",
        "validate_holdout": "spectralbridge.mixtures.validate_holdout",
        "wavelength_weights": "spectralbridge.pft_method_audit.wavelength_weights"
      },
      "module": "spectralbridge.library_analysis",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_panels.py",
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 28,
          "methods": [],
          "name": "_matrix",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": "'spectra'",
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.library_analysis._matrix",
          "signature": "_matrix(values, name='spectra')",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 37,
          "methods": [],
          "name": "_vector",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "n"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.library_analysis._vector",
          "signature": "_vector(values, n, name)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 44,
          "methods": [],
          "name": "_classes",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "order"
            }
          ],
          "path": "spectralbridge.library_analysis._classes",
          "signature": "_classes(labels, order=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 55,
          "methods": [],
          "name": "_fractions",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": "'fractions'",
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.library_analysis._fractions",
          "signature": "_fractions(values, name='fractions')",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Enforce Euclidean nonnegative sum-one fraction geometry.\n\nParameters\n----------\nvalues : array-like\n    Finite vector (C,) or matrix (N, C) of fraction coordinates for row-wise Euclidean projection onto the nonnegative sum-one simplex.\n\nReturns\n-------\nnumpy.ndarray\n    Same-shaped array of row-wise projected fractions; nonnegative coordinates sum to one but need not be uniquely physically identifiable.\n\nNotes\n-----\nInputs: finite vector (C,) or matrix (N,C); C >= 1. Sampling unit: each row.\nOutputs: same-shaped projected array. Assumptions: Euclidean distance and\ncommon fraction coordinates. Does not add information or establish uniqueness\nof a physical inversion. Reuses the audited sorting implementation.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> projected = api.project_simplex([-1., 2.])\n>>> assert np.allclose(projected, [0., 1.])",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 62,
          "methods": [],
          "name": "project_simplex",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.library_analysis.project_simplex",
          "signature": "project_simplex(values)",
          "summary": "Enforce Euclidean nonnegative sum-one fraction geometry.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Test pairwise conditional whole-spectrum differences, not prediction.\n\nParameters\n----------\nspectra : array-like\n    Finite observations-by-features matrix (N, B) on a common spectral support and scale; rows must align with labels and identity metadata.\nlabels : array-like\n    Nonmissing class/category labels with one value per spectrum; repeated identities must have a consistent label.\nwavelengths : array-like\n    Finite wavelength coordinates in nanometers, aligned with spectral columns; numerical analysis routines require strictly increasing unique coordinates.\ngroups : array-like, default=None\n    Aligned independent-unit identifiers; keep repeated observations or parent-connected mixtures in the same group. None uses the function-specific row-based convention described in Notes.\nblocks : array-like, default=None\n    Aligned exchangeability strata for restricted curve permutations; labels must be exchangeable within retained mixed blocks.\nmask : array-like, default=None\n    Boolean wavelength vector (B,), True for admitted common support; atmospheric and unsupported gaps should be excluded explicitly.\nregions : dict, default=None\n    Optional mapping from region names to (lower, upper) wavelength bounds in nanometers; gaps remain disconnected.\npermutations : int, default=999\n    Number of seeded restricted random permutations; spectral_separability requires at least 19.\nseed : int, default=0\n    Random-number seed for reproducible sampling, splits or resampling; it does not create independent observations.\nmax_gap : float, default=8\n    Maximum wavelength gap in nanometers treated as contiguous during integration; larger gaps are not bridged.\nmissing : {'raise', 'drop_columns'}, default='raise'\n    Nonfinite-value policy: 'raise' rejects missing support; 'drop_columns' removes incomplete columns globally before aggregation.\nintegration_weights : array-like or None, default=None\n    Optional positive quadrature weights aligned with wavelengths, expressing the declared support measure rather than sampling density.\nmaximum_units : int, default=5000\n    Maximum independent mean curves allowed in the quadratic energy-distance calculation; an explicit memory/runtime guard.\n\nReturns\n-------\ndict\n    Pair-test, wavelength and region DataFrames plus retained-coordinate and multiplicity metadata; effect direction is second label minus first.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: spectra (N,B), labels (N,), strictly increasing wavelengths (B,);\ngroups are observation identities, blocks are exchangeability strata. Optional\nboolean mask keeps supported coordinates; regions maps names to (low,high).\nSampling unit: one identity mean curve; repeated identities must have constant\nlabels/blocks. Without groups each row is an independent sampling unit.\nOutputs: dict of pair, wavelength and region DataFrames plus support metadata.\nSigned effects are second-minus-first labels; standardized effects divide by\nwithin-block response scale (not Cohen's d). Synchronized curve permutations\nwithin each pair preserve covariance across wavelengths. Max-statistic p-values\ncontrol coordinates within pair; Bonferroni then controls all declared pairs.\nWhole-spectrum p-values use Holm across pairs separately for each statistic.\nAssumptions: exchangeable identities within mixed blocks; fixed support/units.\nEnergy distances scale quadratically in unit count; maximum_units guards this.\nMissing='drop_columns' removes incomplete columns globally before aggregation;\ndefault rejects nonfinite values on requested support. Atmospheric gaps must be\nmasked explicitly. Region effects use disconnected quadrature, not gap bridges.\nDoes not establish classification, abundance, causality or universal difference.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> rng = np.random.default_rng(13)\n>>> labels = np.repeat([\"A\", \"B\", \"C\"], 12)\n>>> spectra = np.repeat(np.eye(3), 12, axis=0) + rng.normal(0, .01, (36, 3))\n>>> identities = np.arange(36)\n>>> result = api.spectral_separability(spectra, labels, [500., 505., 510.], identities, permutations=19)\n>>> assert len(result[\"pairs\"]) == 3",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.spectral_separability"
          ],
          "kind": "function",
          "line": 109,
          "methods": [],
          "name": "spectral_separability",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "blocks"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "mask"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "regions"
            },
            {
              "annotation": null,
              "default": "999",
              "kind": "keyword-only",
              "name": "permutations"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "8",
              "kind": "keyword-only",
              "name": "max_gap"
            },
            {
              "annotation": null,
              "default": "'raise'",
              "kind": "keyword-only",
              "name": "missing"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "integration_weights"
            },
            {
              "annotation": null,
              "default": "5000",
              "kind": "keyword-only",
              "name": "maximum_units"
            }
          ],
          "path": "spectralbridge.library_analysis.spectral_separability",
          "signature": "spectral_separability(spectra, labels, wavelengths, groups=None, *, blocks=None, mask=None, regions=None, permutations=999, seed=0, max_gap=8, missing='raise', integration_weights=None, maximum_units=5000)",
          "summary": "Test pairwise conditional whole-spectrum differences, not prediction.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Generate reproducible pair/triple linear mixtures and exact generating weights.\n\nParameters\n----------\nspectra : array-like\n    Finite observations-by-features matrix (N, B) on a common spectral support and scale; rows must align with labels and identity metadata.\nlabels : array-like\n    Nonmissing class/category labels with one value per spectrum; repeated identities must have a consistent label.\nparent_ids : array-like\n    Unique identifiers for candidate parent spectra; aggregate repeated parents before generating mixtures.\npair_grid : sequence of float, default=(0, 0.1, 0.5, 0.9, 1)\n    Fractions in [0, 1] used for two-parent mixtures; the complementary fraction is one minus the supplied value.\ntriple_grid : sequence of 3-element sequences, default=((1 / 3, 1 / 3, 1 / 3),)\n    Sequence of three-element nonnegative sum-one fraction vectors; an empty sequence disables three-parent mixtures.\nreplicates : int, default=1\n    Positive number of seeded repetitions for parent selection or library-size sampling.\nseed : int, default=0\n    Random-number seed for reproducible sampling, splits or resampling; it does not create independent observations.\nclass_order : sequence or None, default=None\n    Explicit unique class-column order; None uses the function-specific canonical ordering. Preserve this order when comparing fraction arrays.\nparent_roles : array-like or None, default=None\n    Optional role labels aligned with candidate parents; retained as provenance alongside generating weights.\nmaximum_mixtures : int, default=100000\n    Positive upper limit on generated synthetic mixtures; prevents accidental combinatorial expansion.\n\nReturns\n-------\ndict\n    Synthetic spectra, exact class fractions, classes and padded parent indices/IDs/categories/roles/fractions; shared parents imply dependence.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: finite parent spectra (P,B), labels/parent_ids (P,), explicit pair scalar\nfractions and triple simplex vectors; triple_grid=() disables triples.\nSampling unit: synthetic mixture; shared parent mixtures are dependent.\nOutputs: spectra, truth in classes order, padded parent indices/IDs/categories/roles and\nparent fractions; zero-weight parents remain tracked for conservative holdout.\nAssumptions: one common spectral support/scale and ideal algebraic mixing.\nDoes not establish physical mixing, parent purity or independent field truth.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> result = api.generate_mixtures(np.eye(2), [\"A\", \"B\"], [\"p1\", \"p2\"], pair_grid=(.25,), triple_grid=())\n>>> assert np.allclose(result[\"truth\"].sum(axis=1), 1)",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.generate_mixtures"
          ],
          "kind": "function",
          "line": 329,
          "methods": [],
          "name": "generate_mixtures",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parent_ids"
            },
            {
              "annotation": null,
              "default": "(0, 0.1, 0.5, 0.9, 1)",
              "kind": "keyword-only",
              "name": "pair_grid"
            },
            {
              "annotation": null,
              "default": "((1 / 3, 1 / 3, 1 / 3),)",
              "kind": "keyword-only",
              "name": "triple_grid"
            },
            {
              "annotation": null,
              "default": "1",
              "kind": "keyword-only",
              "name": "replicates"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "class_order"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "parent_roles"
            },
            {
              "annotation": null,
              "default": "100000",
              "kind": "keyword-only",
              "name": "maximum_mixtures"
            }
          ],
          "path": "spectralbridge.library_analysis.generate_mixtures",
          "signature": "generate_mixtures(spectra, labels, parent_ids, *, pair_grid=(0, 0.1, 0.5, 0.9, 1), triple_grid=((1 / 3, 1 / 3, 1 / 3),), replicates=1, seed=0, class_order=None, parent_roles=None, maximum_mixtures=100000)",
          "summary": "Generate reproducible pair/triple linear mixtures and exact generating weights.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Fit nonnegative sum-one FCLS using the existing small-library face solver.\n\nParameters\n----------\ntargets : array-like\n    Finite target spectra (N, B) sharing the endmember library wavelength support and reflectance units.\nendmembers : array-like\n    Finite reference matrix (M, B), one reference per row; constrained_unmixing admits at most 12 references.\nendmember_ids : array-like or None, default=None\n    Optional unique identifiers aligned with reference rows; None uses row indices.\n\nReturns\n-------\ndict\n    Endmember-ordered fractions, reconstruction, RMSE, reference IDs and solver details for each target.\n\nRaises\n------\nRuntimeError\n    If required processing or artifact validation cannot complete.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: targets (N,B), ordered endmembers (M,B), M<=12; optional unique IDs.\nSampling unit: target spectrum. Outputs: fractions in supplied endmember order,\nreconstruction, RMSE, IDs and solver details. Assumptions: common units/support,\nadmitted numerical faces/rank thresholds of mixtures.fcls (not exact arithmetic).\nDoes not establish unique composition or biological truth from good residuals.\n\nSee Also\n--------\nspectralbridge.library_analysis.fit_mesma : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> result = api.constrained_unmixing([[.25, .75]], np.eye(2))\n>>> assert np.allclose(result[\"fractions\"], [[.25, .75]])",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.constrained_unmixing"
          ],
          "kind": "function",
          "line": 465,
          "methods": [],
          "name": "constrained_unmixing",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "endmembers"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "endmember_ids"
            }
          ],
          "path": "spectralbridge.library_analysis.constrained_unmixing",
          "signature": "constrained_unmixing(targets, endmembers, *, endmember_ids=None)",
          "summary": "Fit nonnegative sum-one FCLS using the existing small-library face solver.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Summarize fraction variation among evaluated near-best candidate solutions.\n\nParameters\n----------\nfractions : array-like\n    Nonnegative sum-one fraction coordinates, with classes/endmembers in the declared column order; shape requirements are given in Notes.\nerrors : array-like\n    Finite nonnegative reconstruction RMSE for each candidate composition, in the same target reflectance units.\ntolerance : float, default=0.01\n    Absolute numerical tolerance in the compared quantity: reflectance for chunk checks, additive RMSE for candidate ambiguity.\nclass_order : sequence or None, default=None\n    Explicit unique class-column order; None uses the function-specific canonical ordering. Preserve this order when comparing fraction arrays.\n\nReturns\n-------\ndict\n    Best and near-best candidate indices/compositions, per-class ranges and maximum range; uncertainty covers evaluated candidates only.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: simplex fractions (K,C) and nonnegative reconstruction RMSE (K,);\ntolerance is additive in those RMSE units. Sampling unit: one target's finite\ncandidate set. Outputs: best index/fractions, near indices/solutions, per-class\nmin/max/range, maximum range (ambiguity_score), near count and alternative count.\nAssumptions: comparable errors, common class order. Stable first-index tie rule.\nCounts refer to evaluated solutions and may include redundant compositions.\nDoes not describe exhaustive physical uncertainty or all feasible fractions.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> result = api.candidate_ambiguity([[.2, .8], [.21, .79]], [.01, .015], tolerance=.01)\n>>> assert result[\"near_count\"] == 2",
          "examples": [],
          "exports": [
            "spectralbridge.library_analysis.candidate_ambiguity"
          ],
          "kind": "function",
          "line": 530,
          "methods": [],
          "name": "candidate_ambiguity",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fractions"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "errors"
            },
            {
              "annotation": null,
              "default": "0.01",
              "kind": "keyword-only",
              "name": "tolerance"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "class_order"
            }
          ],
          "path": "spectralbridge.library_analysis.candidate_ambiguity",
          "signature": "candidate_ambiguity(fractions, errors, *, tolerance=0.01, class_order=None)",
          "summary": "Summarize fraction variation among evaluated near-best candidate solutions.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Search explicit candidate models and retain inspectable near-fit compositions.\n\nParameters\n----------\ntargets : array-like\n    Finite target spectra (N, B) sharing the endmember library wavelength support and reflectance units.\nendmembers : array-like\n    Finite reference matrix (M, B), one reference per row; constrained_unmixing admits at most 12 references.\nlabels : array-like\n    Nonmissing class/category labels with one value per spectrum; repeated identities must have a consistent label.\nendmember_ids : array-like or None, default=None\n    Optional unique identifiers aligned with reference rows; None uses row indices.\nmax_components : int, default=3\n    Maximum references per candidate MESMA model, from 1 through 12; zero-weight selected components remain possible.\ncandidates : sequence of tuples or None, default=None\n    Optional sequence of tuples of zero-based library row indices; None enumerates distinct-category models up to max_components.\nmaximum_models : int, default=20000\n    Positive upper bound on evaluated candidate models; the search fails explicitly when the requested budget is exceeded.\ntolerance : float, default=0.01\n    Absolute numerical tolerance in the compared quantity: reflectance for chunk checks, additive RMSE for candidate ambiguity.\nclass_order : sequence or None, default=None\n    Explicit unique class-column order; None uses the function-specific canonical ordering. Preserve this order when comparing fraction arrays.\n\nReturns\n-------\ndict\n    Class fractions, RMSE/reconstruction, selected references/component fractions, full candidate errors/fractions and ambiguity summaries.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: targets (N,B), library (P,B), category labels/optional IDs (P,);\ncandidates is a sequence of tuples of library row indices. Default enumerates\ndistinct-category models up to max_components. Sampling unit: target spectrum.\nOutputs: class fractions, selected endmember tuples/fractions, reconstruction,\nRMSE, candidate errors/fractions, ambiguity per target and numerical tolerances.\nAssumptions: finite same-unit library and explicit computational budget; each\ncandidate is solved with the existing FCLS face/rank thresholds. Boundaries are\nallowed, so selected tuple can include zero-weight references. Stable first tie.\nDoes not establish exhaustive uncertainty, purity or correct biological cover.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> result = api.fit_mesma([[.25, .75]], np.eye(2), [\"A\", \"B\"], max_components=2)\n>>> assert np.allclose(result[\"fractions\"], [[.25, .75]])",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.fit_mesma"
          ],
          "kind": "function",
          "line": 606,
          "methods": [],
          "name": "fit_mesma",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "endmembers"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "endmember_ids"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "max_components"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "candidates"
            },
            {
              "annotation": null,
              "default": "20000",
              "kind": "keyword-only",
              "name": "maximum_models"
            },
            {
              "annotation": null,
              "default": "0.01",
              "kind": "keyword-only",
              "name": "tolerance"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "class_order"
            }
          ],
          "path": "spectralbridge.library_analysis.fit_mesma",
          "signature": "fit_mesma(targets, endmembers, labels, *, endmember_ids=None, max_components=3, candidates=None, maximum_models=20000, tolerance=0.01, class_order=None)",
          "summary": "Search explicit candidate models and retain inspectable near-fit compositions.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 771,
          "methods": [
            {
              "docstring": "",
              "line": 772,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "count"
                },
                {
                  "annotation": null,
                  "default": "'selected'",
                  "kind": "positional-or-keyword",
                  "name": "method"
                },
                {
                  "annotation": null,
                  "default": "0",
                  "kind": "positional-or-keyword",
                  "name": "seed"
                }
              ],
              "private": true,
              "signature": "__init__(self, count, method='selected', seed=0)"
            },
            {
              "docstring": "",
              "line": 777,
              "name": "fit",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "y"
                }
              ],
              "private": false,
              "signature": "fit(self, X, y)"
            },
            {
              "docstring": "",
              "line": 788,
              "name": "transform",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "transform(self, X)"
            }
          ],
          "name": "_FeaturePath",
          "parameters": [],
          "path": "spectralbridge.library_analysis._FeaturePath",
          "signature": null,
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 792,
          "methods": [],
          "name": "_learning_inputs",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "groups"
            }
          ],
          "path": "spectralbridge.library_analysis._learning_inputs",
          "signature": "_learning_inputs(spectra, labels, groups)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 803,
          "methods": [],
          "name": "_splits",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ids"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "folds"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "domains"
            }
          ],
          "path": "spectralbridge.library_analysis._splits",
          "signature": "_splits(x, y, ids, folds, seed, domains=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/validate_figures.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 851,
          "methods": [],
          "name": "_weights",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ids"
            }
          ],
          "path": "spectralbridge.library_analysis._weights",
          "signature": "_weights(ids)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 856,
          "methods": [],
          "name": "_classification_fit",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ids"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "inner_folds"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "regularization"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "count"
            },
            {
              "annotation": null,
              "default": "'selected'",
              "kind": "keyword-only",
              "name": "method"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "pca"
            }
          ],
          "path": "spectralbridge.library_analysis._classification_fit",
          "signature": "_classification_fit(x, y, ids, *, inner_folds, regularization, seed, count=None, method='selected', pca=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Evaluate unseen identities or held domains with nested regularized recognition.\n\nParameters\n----------\nspectra : array-like\n    Finite observations-by-features matrix (N, B) on a common spectral support and scale; rows must align with labels and identity metadata.\nlabels : array-like\n    Nonmissing class/category labels with one value per spectrum; repeated identities must have a consistent label.\ngroups : array-like, default=None\n    Aligned independent-unit identifiers; keep repeated observations or parent-connected mixtures in the same group. None uses the function-specific row-based convention described in Notes.\ndomains : array-like, default=None\n    Optional aligned site/year/domain labels for held-domain evaluation; held identities are purged globally from training.\nfolds : int, default=3\n    Number of grouped outer evaluation folds, or grouped tuning folds for the ridge fraction estimator; requires enough independent groups.\ninner_folds : int, default=3\n    Number of grouped inner training-only folds used for regularization and feature-selection tuning.\nregularization : sequence of positive float, default=(0.1, 1, 10)\n    Prespecified positive classifier C values; multiple values trigger grouped inner tuning entirely within training data.\nseed : int, default=0\n    Random-number seed for reproducible sampling, splits or resampling; it does not create independent observations.\nclass_order : sequence or None, default=None\n    Explicit unique class-column order; None uses the function-specific canonical ordering. Preserve this order when comparing fraction arrays.\n\nReturns\n-------\ndict\n    Grouped fold/overall scores, class recall/confusion, row-aligned predictions/probabilities, tuning memberships and fitted models.\n\nNotes\n-----\nInputs: finite spectra (N,B), labels, optional identity groups and site/year\ndomains. Sampling unit: identity; repeated histories never cross train/test.\nOutputs: fold/overall balanced accuracy, per-class recall/confusion, predictions,\nclass-ordered probabilities, row membership, hyperparameters and fitted models.\nAssumptions: one label per identity, common features; training is row-based,\nmetrics identity-weighted. All scale fitting/tuning occurs inside training;\nmulti-value regularization requires valid grouped inner folds, else raises.\nHeld domains purge target identities globally, even from other training domains.\nMissing values are rejected; probabilities are not calibrated uncertainty.\nDoes not establish mixture uniqueness, field fractions or universal transfer.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> rng = np.random.default_rng(13)\n>>> labels = np.repeat([\"A\", \"B\", \"C\"], 12)\n>>> spectra = np.repeat(np.eye(3), 12, axis=0) + rng.normal(0, .01, (36, 3))\n>>> identities = np.arange(36)\n>>> result = api.evaluate_identifiability(spectra, labels, identities, folds=2, regularization=(1,))\n>>> assert \"balanced_accuracy\" in result[\"overall\"]",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.evaluate_identifiability"
          ],
          "kind": "function",
          "line": 934,
          "methods": [],
          "name": "evaluate_identifiability",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "domains"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "folds"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "inner_folds"
            },
            {
              "annotation": null,
              "default": "(0.1, 1, 10)",
              "kind": "keyword-only",
              "name": "regularization"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "class_order"
            }
          ],
          "path": "spectralbridge.library_analysis.evaluate_identifiability",
          "signature": "evaluate_identifiability(spectra, labels, groups=None, *, domains=None, folds=3, inner_folds=3, regularization=(0.1, 1, 10), seed=0, class_order=None)",
          "summary": "Evaluate unseen identities or held domains with nested regularized recognition.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1017,
          "methods": [],
          "name": "_evaluate",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "domains"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "folds"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "inner_folds"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "regularization"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "class_order"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "count"
            },
            {
              "annotation": null,
              "default": "'selected'",
              "kind": "keyword-only",
              "name": "method"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "pca"
            }
          ],
          "path": "spectralbridge.library_analysis._evaluate",
          "signature": "_evaluate(spectra, labels, groups, *, domains, folds, inner_folds, regularization, seed, class_order=None, count=None, method='selected', pca=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Measure predictive information versus feature count with nested selection.\n\nParameters\n----------\nspectra : array-like\n    Finite observations-by-features matrix (N, B) on a common spectral support and scale; rows must align with labels and identity metadata.\nlabels : array-like\n    Nonmissing class/category labels with one value per spectrum; repeated identities must have a consistent label.\nwavelengths : array-like\n    Finite wavelength coordinates in nanometers, aligned with spectral columns; numerical analysis routines require strictly increasing unique coordinates.\ngroups : array-like, default=None\n    Aligned independent-unit identifiers; keep repeated observations or parent-connected mixtures in the same group. None uses the function-specific row-based convention described in Notes.\nbudgets : sequence of int, default=(1, 3, 5)\n    Distinct positive feature counts to evaluate, bounded by the available spectral columns.\nrandom_replicates : int, default=3\n    Positive number of seeded label-independent random feature paths; each path is nested across budgets.\ndomains : array-like, default=None\n    Optional aligned site/year/domain labels for held-domain evaluation; held identities are purged globally from training.\nfolds : int, default=3\n    Number of grouped outer evaluation folds, or grouped tuning folds for the ridge fraction estimator; requires enough independent groups.\ninner_folds : int, default=3\n    Number of grouped inner training-only folds used for regularization and feature-selection tuning.\nregularization : sequence of positive float, default=(0.1, 1, 10)\n    Prespecified positive classifier C values; multiple values trigger grouped inner tuning entirely within training data.\nseed : int, default=0\n    Random-number seed for reproducible sampling, splits or resampling; it does not create independent observations.\ninclude_full : bool, default=True\n    Include the full-feature classifier as a reference alongside budget-constrained models.\npca_components : int or None, default=None\n    Optional PCA dimension evaluated using training-only fitted transforms; None omits this comparison.\n\nReturns\n-------\ndict\n    Curve and selected-feature DataFrames plus detailed fold evaluations; selection is refitted within each training fold.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: finite spectra, labels, wavelengths, identities and optional held domains;\nexplicit integer budgets, fixed seeded random paths and optional PCA size.\nSampling unit: held-out identity. Outputs: curve DataFrame, detailed evaluation\ndicts and selected coordinates per outer fold. Selection refits inside every\ninner fold; each random path is label-independent and nested across budgets.\nAssumptions: valid group splits; PCA/scale fitting is training-only. Budgets\nare experimental settings, not chosen from outer scores for final evaluation.\nDoes not establish globally optimal bands, a sensor design or field accuracy.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> rng = np.random.default_rng(13)\n>>> labels = np.repeat([\"A\", \"B\", \"C\"], 12)\n>>> spectra = np.repeat(np.eye(3), 12, axis=0) + rng.normal(0, .01, (36, 3))\n>>> identities = np.arange(36)\n>>> result = api.evaluate_feature_budget(spectra, labels, [500., 505., 510.], identities, budgets=(1,), folds=2, regularization=(1,), random_replicates=1)\n>>> assert not result[\"curve\"].empty",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.evaluate_feature_budget"
          ],
          "kind": "function",
          "line": 1122,
          "methods": [],
          "name": "evaluate_feature_budget",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": null,
              "default": "(1, 3, 5)",
              "kind": "keyword-only",
              "name": "budgets"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "random_replicates"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "domains"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "folds"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "inner_folds"
            },
            {
              "annotation": null,
              "default": "(0.1, 1, 10)",
              "kind": "keyword-only",
              "name": "regularization"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "include_full"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "pca_components"
            }
          ],
          "path": "spectralbridge.library_analysis.evaluate_feature_budget",
          "signature": "evaluate_feature_budget(spectra, labels, wavelengths, groups=None, *, budgets=(1, 3, 5), random_replicates=3, domains=None, folds=3, inner_folds=3, regularization=(0.1, 1, 10), seed=0, include_full=True, pca_components=None)",
          "summary": "Measure predictive information versus feature count with nested selection.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Compare paired same-row representations under identical grouped splits.\n\nParameters\n----------\nrepresentations : dict\n    Mapping of names to finite (N, B) arrays with identical row identity/order; feature counts may differ.\nlabels : array-like\n    Nonmissing class/category labels with one value per spectrum; repeated identities must have a consistent label.\ngroups : array-like, default=None\n    Aligned independent-unit identifiers; keep repeated observations or parent-connected mixtures in the same group. None uses the function-specific row-based convention described in Notes.\ndomains : array-like, default=None\n    Optional aligned site/year/domain labels for held-domain evaluation; held identities are purged globally from training.\nreference : str or None, default=None\n    Optional representation name used for paired differences; None selects the first supplied representation.\nevaluation_options : keyword arguments\n    Additional keyword options forwarded to evaluate_identifiability for each representation; domains must use the explicit argument.\n\nReturns\n-------\ndict\n    Paired score summary, class metrics, detailed evaluations and reference name; synthetic representations remain diagnostic evidence.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: name->(N,B) finite arrays in identical observation order; labels/groups\nand optional held domains. Sampling unit: same held-out identity for every\nrepresentation. Outputs: within and optional held-domain results, recall,\ndimensions, balanced accuracy and transfer penalties; differences vs reference.\nAssumptions: caller guarantees row alignment and paired preprocessing lineage;\neach classifier is separately nested and scaled using training rows only.\nDoes not turn synthetic products into independent native-sensor validation.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> rng = np.random.default_rng(13)\n>>> labels = np.repeat([\"A\", \"B\", \"C\"], 12)\n>>> spectra = np.repeat(np.eye(3), 12, axis=0) + rng.normal(0, .01, (36, 3))\n>>> identities = np.arange(36)\n>>> result = api.compare_representations({\"full\": spectra, \"subset\": spectra[:, :2]}, labels, identities, folds=2, regularization=(1,))\n>>> assert len(result[\"summary\"]) == 2",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.compare_representations"
          ],
          "kind": "function",
          "line": 1282,
          "methods": [],
          "name": "compare_representations",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "representations"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "domains"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "reference"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-keyword",
              "name": "evaluation_options"
            }
          ],
          "path": "spectralbridge.library_analysis.compare_representations",
          "signature": "compare_representations(representations, labels, groups=None, *, domains=None, reference=None, **evaluation_options)",
          "summary": "Compare paired same-row representations under identical grouped splits.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Fitted numerical state; predict exposes raw and geometrically valid fractions.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 1400,
          "methods": [
            {
              "docstring": "",
              "line": 1403,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "pipeline"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "classes"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "tuning"
                }
              ],
              "private": true,
              "signature": "__init__(self, pipeline, classes, tuning)"
            },
            {
              "docstring": "Predict raw and simplex-projected fraction coordinates for new spectra.\n\nParameters\n----------\nspectra : array-like\n    Finite matrix (N, B) on the training support and scale; fitted training\n    preprocessing is reused, rather than refitted on these targets.\n\nReturns\n-------\ndict\n    raw_prediction and projected_prediction arrays (N, C), plus the\n    corresponding classes vector (C,). Projection enforces geometry,\n    not physical uniqueness or calibrated uncertainty.",
              "line": 1418,
              "name": "predict",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "spectra"
                }
              ],
              "private": false,
              "signature": "predict(self, spectra)"
            }
          ],
          "name": "_RidgeFractionModel",
          "parameters": [],
          "path": "spectralbridge.library_analysis._RidgeFractionModel",
          "signature": null,
          "summary": "Fitted numerical state; predict exposes raw and geometrically valid fractions.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Fit supervised multi-output ridge with explicit raw/projected predictions.\n\nParameters\n----------\nspectra : array-like\n    Finite observations-by-features matrix (N, B) on a common spectral support and scale; rows must align with labels and identity metadata.\nfractions : array-like\n    Nonnegative sum-one fraction coordinates, with classes/endmembers in the declared column order; shape requirements are given in Notes.\ngroups : array-like, default=None\n    Aligned independent-unit identifiers; keep repeated observations or parent-connected mixtures in the same group. None uses the function-specific row-based convention described in Notes.\nalphas : sequence of positive float, default=(1,)\n    Prespecified positive ridge penalties; multiple penalties require explicit independent parent-connected tuning groups.\nfolds : int, default=3\n    Number of grouped outer evaluation folds, or grouped tuning folds for the ridge fraction estimator; requires enough independent groups.\nseed : int, default=0\n    Random-number seed for reproducible sampling, splits or resampling; it does not create independent observations.\nclass_order : sequence or None, default=None\n    Explicit unique class-column order; None uses the function-specific canonical ordering. Preserve this order when comparing fraction arrays.\n\nReturns\n-------\nobject\n    Fitted fraction model exposing predict(spectra), raw and simplex-projected predictions, fitted preprocessing/coefficients and tuning metadata.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: spectra (N,B), exact known simplex targets (N,C), positive alpha grid;\ngroups are independent parent-connected bundles for synthetic training mixtures.\nSampling unit: training mixture, with group-disjoint tuning if grid has >1 alpha.\nOutputs: fitted model with predict(), saved preprocessing/coefficient/intercept\nparameters and tuning memberships/scores. StandardScaler is refitted inside\nevery tuning fold. Selection minimizes mean raw fraction MSE. Multiple alphas\nrequire explicit groups and grouped folds; a single alpha is prespecified.\nAssumptions: common units/support and no shared generating parent across groups;\ncaller must form connected parent groups, not arbitrary mixture-row IDs.\nDoes not establish unique physical inversion, calibrated uncertainty or field\ncover. Prediction returns both raw_prediction and projected_prediction.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> model = api.fit_ridge_fractions(np.eye(2), np.eye(2), alphas=(1,))\n>>> prediction = model.predict([[.25, .75]])\n>>> assert np.allclose(prediction[\"projected_prediction\"].sum(axis=1), 1)",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.fit_ridge_fractions"
          ],
          "kind": "function",
          "line": 1442,
          "methods": [],
          "name": "fit_ridge_fractions",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fractions"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": null,
              "default": "(1,)",
              "kind": "keyword-only",
              "name": "alphas"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "folds"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "class_order"
            }
          ],
          "path": "spectralbridge.library_analysis.fit_ridge_fractions",
          "signature": "fit_ridge_fractions(spectra, fractions, groups=None, *, alphas=(1,), folds=3, seed=0, class_order=None)",
          "summary": "Fit supervised multi-output ridge with explicit raw/projected predictions.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Separate known-fraction quantification from thresholded detection errors.\n\nParameters\n----------\ntruth : array-like\n    Known nonnegative sum-one mixture fractions (N, C); these are synthetic targets, not independently measured field cover.\npredictions : array-like\n    Finite predicted fraction matrix (N, C), in the same class order as truth; raw unconstrained predictions are accepted.\nclass_order : sequence or None, default=None\n    Explicit unique class-column order; None uses the function-specific canonical ordering. Preserve this order when comparing fraction arrays.\ndetection_threshold : float, default=0.1\n    Fraction in (0, 1] at or above which the predicted class is declared detected.\nlow_fraction : float, default=0.2\n    Upper positive truth-fraction bound in (0, 1] for low-abundance miss-rate summaries.\nbins : sequence of float, default=(0, 0.1, 0.25, 0.5, 0.75, 1)\n    Strictly increasing calibration-bin edges spanning zero to one.\ngroups : array-like, default=None\n    Aligned independent-unit identifiers; keep repeated observations or parent-connected mixtures in the same group. None uses the function-specific row-based convention described in Notes.\nbootstraps : int, default=0\n    Nonnegative number of whole-group bootstrap resamples; positive values require at least two explicitly independent groups.\nseed : int, default=0\n    Random-number seed for reproducible sampling, splits or resampling; it does not create independent observations.\n\nReturns\n-------\ndict\n    Overall/per-class fraction errors, calibration bins, absent/low-positive detection summaries and optional whole-group intervals.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: truth (N,C) simplex and finite predictions (N,C), possibly raw;\nclass ordering, detection/low-fraction thresholds and calibration bin edges.\nSampling unit: mixture; supplied independent groups receive equal total weight\nand are resampled whole for percentile intervals on RMSE/bias. Shared parents\nrequire connected groups. Outputs: macro/per-class RMSE/bias, calibration bins,\nabsent false-positive and low-positive miss rates, positive-only RMSE and CIs.\nAssumptions: synthetic truth is known; absent means exactly zero; detection is\nprediction >= threshold. Empty conditional denominators yield NaN. Bootstraps\nrequire explicit groups. Does not establish biological absence or field accuracy.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> result = api.fraction_diagnostics(np.eye(2), np.eye(2))\n>>> assert result[\"overall\"][\"RMSE\"] == 0",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.fraction_diagnostics"
          ],
          "kind": "function",
          "line": 1569,
          "methods": [],
          "name": "fraction_diagnostics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predictions"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "class_order"
            },
            {
              "annotation": null,
              "default": "0.1",
              "kind": "keyword-only",
              "name": "detection_threshold"
            },
            {
              "annotation": null,
              "default": "0.2",
              "kind": "keyword-only",
              "name": "low_fraction"
            },
            {
              "annotation": null,
              "default": "(0, 0.1, 0.25, 0.5, 0.75, 1)",
              "kind": "keyword-only",
              "name": "bins"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "groups"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "keyword-only",
              "name": "bootstraps"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "keyword-only",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.library_analysis.fraction_diagnostics",
          "signature": "fraction_diagnostics(truth, predictions, *, class_order=None, detection_threshold=0.1, low_fraction=0.2, bins=(0, 0.1, 0.25, 0.5, 0.75, 1), groups=None, bootstraps=0, seed=0)",
          "summary": "Separate known-fraction quantification from thresholded detection errors.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit __all__ in composable scientific analysis facade",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Evaluate retained identity-library capacity with fixed classifier/prior.\n\nParameters\n----------\nspectra : array-like\n    Finite observations-by-features matrix (N, B) on a common spectral support and scale; rows must align with labels and identity metadata.\nlabels : array-like\n    Nonmissing class/category labels with one value per spectrum; repeated identities must have a consistent label.\ngroups : array-like, default=None\n    Aligned independent-unit identifiers; keep repeated observations or parent-connected mixtures in the same group. None uses the function-specific row-based convention described in Notes.\nsizes : sequence of int, default=(10, 20)\n    Positive total counts of retained training identities; each must fit within every evaluated training fold.\nstrategies : sequence of str, default=('balanced_random', 'farthest')\n    Library selection strategies drawn from 'random', 'balanced_random', and 'farthest'; selection uses training identities only.\nreplicates : int, default=3\n    Positive number of seeded repetitions for parent selection or library-size sampling.\ndomains : array-like, default=None\n    Optional aligned site/year/domain labels for held-domain evaluation; held identities are purged globally from training.\nfolds : int, default=3\n    Number of grouped outer evaluation folds, or grouped tuning folds for the ridge fraction estimator; requires enough independent groups.\nseed : int, default=0\n    Random-number seed for reproducible sampling, splits or resampling; it does not create independent observations.\n\nReturns\n-------\ndict\n    Metrics and selected-identity DataFrames plus fixed-classifier description; unsupported classes are explicit rather than scored as valid.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nInputs: finite spectra/labels/identities; total library sizes, strategies\nrandom, balanced_random or farthest; optional held-domain metadata.\nSampling unit: held-out identity; training histories collapse to identity means.\nOutputs: fold/size/strategy/replicate scores, selected IDs and coverage distances.\nFarthest uses training-standardized Euclidean distance, seeded one per class;\nbalanced_random cycles classes uniformly. Random is unconditional; missing a\nclass produces explicit unsupported status rather than a misleading score.\nAssumptions: fixed C=1 regularized classifier; sizes are predeclared, selection\nand coverage use training rows only. Coverage distances use full-training scale.\nDoes not isolate every model/prior confound or establish universal best size.\n\nSee Also\n--------\nspectralbridge.library_analysis.constrained_unmixing : Related source-derived API contract.\n\nExamples\n--------\nAll spectra below are invented teaching data, not empirical validation.\n\n>>> import numpy as np\n>>> from spectralbridge import library_analysis as api\n>>> rng = np.random.default_rng(13)\n>>> labels = np.repeat([\"A\", \"B\", \"C\"], 12)\n>>> spectra = np.repeat(np.eye(3), 12, axis=0) + rng.normal(0, .01, (36, 3))\n>>> identities = np.arange(36)\n>>> result = api.evaluate_library_size(spectra, labels, identities, sizes=(6,), strategies=(\"balanced_random\",), replicates=1, folds=2)\n>>> assert not result[\"metrics\"].empty",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [
            "spectralbridge.library_analysis.evaluate_library_size"
          ],
          "kind": "function",
          "line": 1737,
          "methods": [],
          "name": "evaluate_library_size",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "groups"
            },
            {
              "annotation": null,
              "default": "(10, 20)",
              "kind": "keyword-only",
              "name": "sizes"
            },
            {
              "annotation": null,
              "default": "('balanced_random', 'farthest')",
              "kind": "keyword-only",
              "name": "strategies"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "replicates"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "domains"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "folds"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "keyword-only",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.library_analysis.evaluate_library_size",
          "signature": "evaluate_library_size(spectra, labels, groups=None, *, sizes=(10, 20), strategies=('balanced_random', 'farthest'), replicates=3, domains=None, folds=3, seed=0)",
          "summary": "Evaluate retained identity-library capacity with fixed classifier/prior.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/library_analysis.py",
      "sha256": "1de4bbf468d02b400c9b0cf0b2eb88ca3056814c139d808978c798b1326b8261"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "Small helpers for package and CLI logging setup.",
      "export_expressions": [],
      "imports": {
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.logging_utils",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Configure root logging for CLI entry points when needed.\n\n``logging.basicConfig`` is intentionally called only when the root logger\nhas no handlers so notebook sessions and embedding applications keep control\nof their own logging configuration.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 8,
          "methods": [],
          "name": "configure_cli_logging",
          "parameters": [
            {
              "annotation": "int",
              "default": "logging.INFO",
              "kind": "positional-or-keyword",
              "name": "level"
            }
          ],
          "path": "spectralbridge.logging_utils.configure_cli_logging",
          "signature": "configure_cli_logging(level: int=logging.INFO) -> None",
          "summary": "Configure root logging for CLI entry points when needed.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/logging_utils.py",
      "sha256": "109e82127641beeb952394c80b9d2079da241693f984dacbf424ff223275e94c"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "NEONReflectanceBRDFCorrectedENVIFile": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIFile",
        "NEONReflectanceENVIFile": "spectralbridge.file_types.NEONReflectanceENVIFile",
        "NEONReflectanceResampledENVIFile": "spectralbridge.file_types.NEONReflectanceResampledENVIFile",
        "Union": "typing.Union",
        "box": "shapely.geometry.box",
        "require_geopandas": "spectralbridge._optional.require_geopandas",
        "require_matplotlib_pyplot": "spectralbridge._optional.require_matplotlib_pyplot",
        "require_rasterio": "spectralbridge._optional.require_rasterio"
      },
      "module": "spectralbridge.mask_raster",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Masks an ENVI raster using polygons from a GeoJSON file.\n\nParameters:\n-----------\nenvi_file : DataFile\n    ENVI raster file type object.\ngeojson_path : str\n    Path to the GeoJSON file containing polygons.\nraster_crs_override : str, optional\n    CRS to assign to the raster if it's undefined (e.g., 'EPSG:4326').\npolygons_crs_override : str or CRS, optional\n    CRS to assign to the polygons if they're undefined.\noutput_masked_suffix : str, optional\n    Suffix to append to the masked raster filename.\nplot_output : bool, optional\n    Whether to generate and save plots of the results.\nplot_filename : str, optional\n    Filename for the saved plot.\ndpi : int, optional\n    Resolution of the saved plot in dots per inch.\n\nRaises:\n-------\nFileNotFoundError\n    If the ENVI raster or GeoJSON file does not exist.\nValueError\n    If CRS assignments are needed but not provided.\n\nReturns:\n--------\nmasked_raster_path : str\n    Path to the saved masked raster file.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 13,
          "methods": [],
          "name": "mask_raster_with_polygons",
          "parameters": [
            {
              "annotation": "Union[NEONReflectanceENVIFile, NEONReflectanceBRDFCorrectedENVIFile, NEONReflectanceResampledENVIFile]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_file"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "geojson_path"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "raster_crs_override"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "polygons_crs_override"
            },
            {
              "annotation": null,
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "plot_output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "plot_filename"
            },
            {
              "annotation": null,
              "default": "300",
              "kind": "positional-or-keyword",
              "name": "dpi"
            }
          ],
          "path": "spectralbridge.mask_raster.mask_raster_with_polygons",
          "signature": "mask_raster_with_polygons(envi_file: Union[NEONReflectanceENVIFile, NEONReflectanceBRDFCorrectedENVIFile, NEONReflectanceResampledENVIFile], geojson_path, raster_crs_override=None, polygons_crs_override=None, plot_output=False, plot_filename=None, dpi=300)",
          "summary": "Masks an ENVI raster using polygons from a GeoJSON file.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Finds raster files ending with '_reflectance', '_envi', or '.img' while excluding\nfiles ending in '.json', '.hdr', or containing '_mask' or '_ancillary'.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 358,
          "methods": [],
          "name": "find_raster_files",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            }
          ],
          "path": "spectralbridge.mask_raster.find_raster_files",
          "signature": "find_raster_files(directory)",
          "summary": "Finds raster files ending with '_reflectance', '_envi', or '.img' while excluding",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/mask_raster.py",
      "sha256": "a21cd7f834552fbe2514a8936ec754af70d19a1cecfd4af6200c996fbe4ea270"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [],
      "docstring": "spectralbridge.merge_duckdb\n================================\n\nDuckDB-backed merge utilities for the spectralbridge pipeline.\n\nThe public entry point :func:`merge_flightline` stitches every ENVI-derived\nParquet table for a single flightline into one master artifact named\n``<scene_prefix>_merged_pixel_extraction.parquet``. The merged parquet includes\npixel metadata, the full set of original/corrected wavelengths, and any\nresampled sensor bands.\n\nUnless ``qa=False`` is passed, completing the merge automatically invokes\n``qa_plots.render_flightline_panel`` to emit ``<scene_prefix>_qa.png`` in the\nsame directory. This mirrors the default behaviour of\n``python -m bin.merge_duckdb`` as documented in the CLI.\n\nTypical usage::\n\n    from spectralbridge import merge_duckdb\n\n    merge_duckdb.merge_flightline(\n        Path(\"/path/to/flightline\"),\n        out_name=\"custom_master.parquet\",  # optional override\n        qa=True,\n    )\n\nThe module intentionally minimises assumptions about directory layout. The\ndefault glob patterns match the canonical pipeline exports but can be overridden\nto support custom workflows.",
      "export_expressions": [],
      "imports": {
        "Dict": "typing.Dict",
        "Iterable": "typing.Iterable",
        "List": "typing.List",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "ThreadPoolExecutor": "concurrent.futures.ThreadPoolExecutor",
        "Tuple": "typing.Tuple",
        "annotations": "__future__.annotations",
        "as_completed": "concurrent.futures.as_completed",
        "contextmanager": "contextlib.contextmanager",
        "datetime": "datetime.datetime",
        "render_flightline_panel": "cross_sensor_cal.qa_plots.render_flightline_panel",
        "scene_prefix_from_dir": "spectralbridge.paths.scene_prefix_from_dir",
        "tqdm": "tqdm.tqdm"
      },
      "module": "spectralbridge.merge_duckdb",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 48,
          "methods": [],
          "name": "_consolidate_parquet_dir_to_file",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dir_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_file"
            }
          ],
          "path": "spectralbridge.merge_duckdb._consolidate_parquet_dir_to_file",
          "signature": "_consolidate_parquet_dir_to_file(con: duckdb.DuckDBPyConnection, dir_path: Path, out_file: Path)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 78,
          "methods": [],
          "name": "_exclude_parquets",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            }
          ],
          "path": "spectralbridge.merge_duckdb._exclude_parquets",
          "signature": "_exclude_parquets(paths)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 88,
          "methods": [],
          "name": "_filter_valid_parquets",
          "parameters": [
            {
              "annotation": "Iterable[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "num_cpus"
            }
          ],
          "path": "spectralbridge.merge_duckdb._filter_valid_parquets",
          "signature": "_filter_valid_parquets(paths: Iterable[Path], *, num_cpus: int | None=None) -> Tuple[List[Path], List[Tuple[Path, str]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 121,
          "methods": [],
          "name": "_progress",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "desc"
            }
          ],
          "path": "spectralbridge.merge_duckdb._progress",
          "signature": "_progress(desc: str)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 153,
          "methods": [],
          "name": "_derive_prefix",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            }
          ],
          "path": "spectralbridge.merge_duckdb._derive_prefix",
          "signature": "_derive_prefix(flightline_dir: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 157,
          "methods": [],
          "name": "_table_columns",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            }
          ],
          "path": "spectralbridge.merge_duckdb._table_columns",
          "signature": "_table_columns(con: duckdb.DuckDBPyConnection, table: str) -> List[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a DuckDB-safe identifier.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 170,
          "methods": [],
          "name": "_quote_identifier",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identifier"
            }
          ],
          "path": "spectralbridge.merge_duckdb._quote_identifier",
          "signature": "_quote_identifier(identifier: str) -> str",
          "summary": "Return a DuckDB-safe identifier.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Normalise user-supplied memory limits for DuckDB.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 176,
          "methods": [],
          "name": "_coerce_memory_limit",
          "parameters": [
            {
              "annotation": "float | str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.merge_duckdb._coerce_memory_limit",
          "signature": "_coerce_memory_limit(value: float | str | None) -> float | str | None",
          "summary": "Normalise user-supplied memory limits for DuckDB.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 195,
          "methods": [],
          "name": "_list_spectral_columns",
          "parameters": [
            {
              "annotation": "Iterable[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            }
          ],
          "path": "spectralbridge.merge_duckdb._list_spectral_columns",
          "signature": "_list_spectral_columns(columns: Iterable[str]) -> List[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 221,
          "methods": [],
          "name": "_quote_path",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.merge_duckdb._quote_path",
          "signature": "_quote_path(path: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 225,
          "methods": [],
          "name": "_register_union",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            },
            {
              "annotation": "Iterable[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "meta_candidates"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "ray_cpus"
            }
          ],
          "path": "spectralbridge.merge_duckdb._register_union",
          "signature": "_register_union(con: duckdb.DuckDBPyConnection, name: str, paths: Iterable[Path], meta_candidates: Sequence[str], *, ray_cpus: int | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Filter out rows where most (>90%) spectral columns are invalid/no-data.\n\nStreams through DuckDB ``COPY ... TO`` so full-flightline merges (millions of\nrows) do not need to materialize the table in pandas.\n\nA spectral value counts as invalid when it is non-NULL and either approximately\n``-9999`` or negative. NULL/NaN values are ignored in the fraction (missing\nproducts), except that rows with *all* spectral values NULL are dropped.\nMetadata and ``raw_*`` columns are never used for the invalid fraction.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 419,
          "methods": [],
          "name": "_filter_no_data_rows_from_parquet",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "row_group_size"
            }
          ],
          "path": "spectralbridge.merge_duckdb._filter_no_data_rows_from_parquet",
          "signature": "_filter_no_data_rows_from_parquet(con: duckdb.DuckDBPyConnection, parquet_path: Path, row_group_size: int | None=None) -> None",
          "summary": "Filter out rows where most (>90%) spectral columns are invalid/no-data.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/merge_duckdb.md"
          ],
          "docstring": "Merge all pixel-level parquet tables for one flightline.\n\nParameters\n----------\nflightline_dir : Path\n    Directory containing the flightline's parquet outputs.\nout_name : str, optional\n    Custom name for the merged parquet. If None, defaults to:\n    <prefix>_merged_pixel_extraction.parquet\noriginal_glob : str, optional\n    Glob used to locate original reflectance parquet tables.\ncorrected_glob : str, optional\n    Glob used to locate corrected reflectance parquet tables.\nresampled_glob : str, optional\n    Glob used to locate resampled sensor parquet tables.\nwrite_feather : bool, optional\n    If True, writes a Feather copy of the merged table alongside the parquet.\nemit_qa_panel : bool, default True\n    If True, renders the standard QA panel (<prefix>_qa.png) after merging.\nray_cpus : int, optional\n    CPU budget forwarded to Ray validation of Parquet shards. Defaults to\n    ``None`` which allows the Ray helper to choose the configured default.\nmerge_memory_limit_gb : float or str, optional\n    Upper bound on DuckDB's memory usage. Floats are interpreted as GiB.\n    Provide ``None`` to leave the default DuckDB behaviour unchanged.\nmerge_threads : int, optional\n    Number of threads DuckDB should use for the merge. ``None`` keeps the\n    engine default (usually ``os.cpu_count()``).\nmerge_row_group_size : int or None, optional\n    Target number of rows per Parquet row group in the merged output.\n    If None, DuckDB will auto-determine the optimal size (better streaming performance).\nmerge_temp_directory : Path, optional\n    Directory where DuckDB should spill temporary data. Defaults to a\n    ``.duckdb_tmp`` subdirectory inside ``flightline_dir``.\n\nReturns\n-------\nPath\n    Path to the merged parquet file.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 581,
          "methods": [],
          "name": "merge_flightline",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "out_name"
            },
            {
              "annotation": "str",
              "default": "'**/*original*.parquet'",
              "kind": "positional-or-keyword",
              "name": "original_glob"
            },
            {
              "annotation": "str",
              "default": "'**/*corrected*.parquet'",
              "kind": "positional-or-keyword",
              "name": "corrected_glob"
            },
            {
              "annotation": "str",
              "default": "'**/*resampl*.parquet'",
              "kind": "positional-or-keyword",
              "name": "resampled_glob"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "write_feather"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "emit_qa_panel"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "ray_cpus"
            },
            {
              "annotation": "float | str | None",
              "default": "64.0",
              "kind": "keyword-only",
              "name": "merge_memory_limit_gb"
            },
            {
              "annotation": "int | None",
              "default": "4",
              "kind": "keyword-only",
              "name": "merge_threads"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merge_row_group_size"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merge_temp_directory"
            },
            {
              "annotation": "bool | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "is_polygon_mode"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "filter_no_data_rows"
            }
          ],
          "path": "spectralbridge.merge_duckdb.merge_flightline",
          "signature": "merge_flightline(flightline_dir: Path, out_name: str | None=None, original_glob: str='**/*original*.parquet', corrected_glob: str='**/*corrected*.parquet', resampled_glob: str='**/*resampl*.parquet', write_feather: bool=False, emit_qa_panel: bool=True, ray_cpus: int | None=None, *, merge_memory_limit_gb: float | str | None=64.0, merge_threads: int | None=4, merge_row_group_size: int | None=None, merge_temp_directory: Path | None=None, is_polygon_mode: bool | None=None, filter_no_data_rows: bool=True) -> Path",
          "summary": "Merge all pixel-level parquet tables for one flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run per-flightline merges across matching directories, collecting successful output paths and reporting failures.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1361,
          "methods": [],
          "name": "merge_all_flightlines",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data_root"
            },
            {
              "annotation": "str",
              "default": "'NEON_*'",
              "kind": "keyword-only",
              "name": "flightline_glob"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-keyword",
              "name": "kwargs"
            }
          ],
          "path": "spectralbridge.merge_duckdb.merge_all_flightlines",
          "signature": "merge_all_flightlines(data_root: Path, *, flightline_glob: str='NEON_*', **kwargs) -> List[Path]",
          "summary": "Run per-flightline merges across matching directories, collecting successful output paths and reporting failures.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 1394,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Optional[Sequence[str]]",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.merge_duckdb.main",
          "signature": "main(argv: Optional[Sequence[str]]=None) -> int",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/merge_duckdb.py",
      "sha256": "6b304f22663fd7679d2ff5b9a57c82b8040b90508a0b884fa6458c226743ca3f"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Experimental staged MESMA audit on verified compact empirical spectral summaries.\n\nNot operational abundance inference. Keep unknown units, material purity and\nindependent ground-truth gaps visible. Source rasters/library are never copied.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "_angles": "spectralbridge.mixtures._angles",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "adequacy_status": "spectralbridge.mixtures.adequacy_status",
        "asdict": "dataclasses.asdict",
        "cdist": "scipy.spatial.distance.cdist",
        "combinations": "itertools.combinations",
        "dataclass": "dataclasses.dataclass",
        "detection_metrics": "spectralbridge.mixtures.detection_metrics",
        "fcls": "spectralbridge.mixtures.fcls",
        "fit_models": "spectralbridge.mixtures.fit_models",
        "grouped_identity_split": "spectralbridge.mixtures.grouped_identity_split",
        "load_pft_crosswalk": "spectralbridge.plant_spectral_pfts.load_pft_crosswalk",
        "mixture_truth": "spectralbridge.mixtures.mixture_truth",
        "select_endmembers": "spectralbridge.mixtures.select_endmembers",
        "selection_scores": "spectralbridge.mixtures.selection_scores",
        "shade_model_errors": "spectralbridge.mixtures.shade_model_errors",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "tag_pfts": "spectralbridge.plant_spectral_pfts.tag_pfts",
        "validate_holdout": "spectralbridge.mixtures.validate_holdout",
        "validate_sensor_coordinates": "spectralbridge.sensor_pft_transfer.validate_sensor_coordinates",
        "wavelength_weights": "spectralbridge.pft_method_audit.wavelength_weights",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.mesma_readiness",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "int",
              "default": "20261014",
              "name": "seed"
            },
            {
              "annotation": "int",
              "default": "12",
              "name": "candidate_per_class"
            },
            {
              "annotation": "int",
              "default": "2",
              "name": "mixture_endmembers_per_class"
            },
            {
              "annotation": "int",
              "default": "1",
              "name": "pairs_per_composition"
            },
            {
              "annotation": "int",
              "default": "12",
              "name": "mc_replicates"
            },
            {
              "annotation": "int",
              "default": "4",
              "name": "minimum_train"
            },
            {
              "annotation": "int",
              "default": "2",
              "name": "minimum_test"
            },
            {
              "annotation": "int",
              "default": "20000",
              "name": "maximum_models"
            },
            {
              "annotation": "int",
              "default": "3",
              "name": "plant_folds"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "all_flights"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/mesma_readiness.py"
          ],
          "exports": [],
          "kind": "class",
          "line": 56,
          "methods": [],
          "name": "ReadinessConfig",
          "parameters": [],
          "path": "spectralbridge.mesma_readiness.ReadinessConfig",
          "signature": null,
          "summary": "Configure the experimental MESMA-readiness study and computational budgets.",
          "summary_basis": "reference annotation; source hash-pinned in historical evidence"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Decode the established nested JSON exposure contract, never split on pipes.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 69,
          "methods": [],
          "name": "decode_flight_history",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.mesma_readiness.decode_flight_history",
          "signature": "decode_flight_history(value)",
          "summary": "Decode the established nested JSON exposure contract, never split on pipes.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validate paired memberships/support; retain stored units without guessing.",
          "examples": [
            "examples/publication_figures/figure_data.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 77,
          "methods": [],
          "name": "load_compact_inputs",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "include_historical_labels"
            }
          ],
          "path": "spectralbridge.mesma_readiness.load_compact_inputs",
          "signature": "load_compact_inputs(source, compact, *, include_historical_labels=True)",
          "summary": "Validate paired memberships/support; retain stored units without guessing.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Actual paired plant/flight means, never polygon/year medians in flight tests.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 134,
          "methods": [],
          "name": "flight_target_tables",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "waves"
            }
          ],
          "path": "spectralbridge.mesma_readiness.flight_target_tables",
          "signature": "flight_target_tables(compact, waves)",
          "summary": "Actual paired plant/flight means, never polygon/year medians in flight tests.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Replace only held-out rows with their actual flight; expose missing sources.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 155,
          "methods": [],
          "name": "replace_flight_targets",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "indices"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observations"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scale"
            }
          ],
          "path": "spectralbridge.mesma_readiness.replace_flight_targets",
          "signature": "replace_flight_targets(y, table, indices, flight, observations, scale)",
          "summary": "Replace only held-out rows with their actual flight; expose missing sources.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 165,
          "methods": [],
          "name": "_save",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "frame"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.mesma_readiness._save",
          "signature": "_save(frame, root, name)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 176,
          "methods": [],
          "name": "_source_metadata_audit",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "waves"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.mesma_readiness._source_metadata_audit",
          "signature": "_source_metadata_audit(table, values, waves, root)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Exhaustive available sites/years/flights, and stratified identity folds.",
          "examples": [
            "examples/mesma_readiness.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 327,
          "methods": [],
          "name": "_folds",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scheme"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.mesma_readiness._folds",
          "signature": "_folds(table, scheme, config)",
          "summary": "Exhaustive available sites/years/flights, and stratified identity folds.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Explicit candidate budget, one record/identity, class/site/year stratified.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 358,
          "methods": [],
          "name": "_pool",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "train"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rng"
            }
          ],
          "path": "spectralbridge.mesma_readiness._pool",
          "signature": "_pool(table, train, config, rng)",
          "summary": "Explicit candidate budget, one record/identity, class/site/year stratified.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 373,
          "methods": [],
          "name": "_aligned_fractions",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fit"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "classes"
            }
          ],
          "path": "spectralbridge.mesma_readiness._aligned_fractions",
          "signature": "_aligned_fractions(fit, classes)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 380,
          "methods": [],
          "name": "_record_fit",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fit"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "true"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "classes"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "context"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "method"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rows"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "summaries"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "detection"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_ids"
            }
          ],
          "path": "spectralbridge.mesma_readiness._record_fit",
          "signature": "_record_fit(fit, true, classes, context, method, rows, summaries, detection, source_ids)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Run experimental grouped readiness diagnostics on verified compact inputs.\n\nArgs:\n    source (str or pathlib.Path): Original polygon Parquet, read in place.\n    compact (str or pathlib.Path): Completed paired NEON/undarkened OLI\n        empirical summaries from the same source; caller verifies upstream\n        manifests. Values stay in stored units; no physical scale inferred.\n    output (str or pathlib.Path): Compact checkpoints, memberships and tables.\n    config (ReadinessConfig, optional): Explicit candidate/fold/model budgets.\n    first_pass (bool): Restrict to plant_0 for a controlled diagnostic run.\n\nReturns:\n    dict: Conditional synthetic status, source/config/code identity and owned\n        output hashes. This is not an operational MESMA readiness certificate.\n\nRaises:\n    ValueError: Invalid budgets, pairing, coordinates, conflicts or corrupt\n        checkpoints. Missing optional flight inputs fail explicitly.\n    OSError: Required source/checkpoint files cannot be read/written.\n\nParent identities are purged globally before training-only candidate\nselection. Synthetic fractions are algebraic mixing weights, not field\nabundance. Missing purity, verified units and real fraction truth remain\nblockers. Completed valid fold checkpoints are reused, not regenerated.",
          "examples": [
            "examples/mesma_readiness.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 447,
          "methods": [],
          "name": "run_readiness",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "False",
              "kind": "keyword-only",
              "name": "first_pass"
            }
          ],
          "path": "spectralbridge.mesma_readiness.run_readiness",
          "signature": "run_readiness(source, compact, output, *, config=None, first_pass=False) -> dict",
          "summary": "Run experimental grouped readiness diagnostics on verified compact inputs.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/mesma_readiness.py",
      "sha256": "19b15a040c7d9eb716488243aacdf95ef4b7f20af145917bb7fc9a647ffe63f4"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Experimental, exact small convex mixture models and audited library selection.\n\nNo operational abundance claim or stable top-level API. Model spectra and targets\nmust share explicit support and one common scale; never normalize each separately.",
      "export_expressions": [],
      "imports": {
        "combinations": "itertools.combinations",
        "product": "itertools.product"
      },
      "module": "spectralbridge.mixtures",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_panels.py",
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 11,
          "methods": [],
          "name": "_matrix",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.mixtures._matrix",
          "signature": "_matrix(values)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Enumerate distinct-class candidate sets, including every simplex face.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 18,
          "methods": [],
          "name": "model_indices",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "positional-or-keyword",
              "name": "max_components"
            },
            {
              "annotation": null,
              "default": "20000",
              "kind": "positional-or-keyword",
              "name": "maximum_models"
            }
          ],
          "path": "spectralbridge.mixtures.model_indices",
          "signature": "model_indices(labels, max_components=3, maximum_models=20000)",
          "summary": "Enumerate distinct-class candidate sets, including every simplex face.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Exact active-face search, not unconstrained fractions clipped afterwards.\n\nInterior affine least squares is admitted only inside its simplex. Every\nboundary face appears explicitly. Singular interiors are skipped; their\nconvex hull remains covered by affinely independent lower-dimensional faces.\nNear-composition counts count distinct CLASS sets, not redundant candidates.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 39,
          "methods": [],
          "name": "fit_models",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "endmembers"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "max_components"
            },
            {
              "annotation": null,
              "default": "0.01",
              "kind": "keyword-only",
              "name": "tolerance"
            },
            {
              "annotation": null,
              "default": "20000",
              "kind": "keyword-only",
              "name": "maximum_models"
            },
            {
              "annotation": null,
              "default": "128",
              "kind": "keyword-only",
              "name": "chunk_models"
            }
          ],
          "path": "spectralbridge.mixtures.fit_models",
          "signature": "fit_models(targets, labels, endmembers, *, max_components=3, tolerance=0.01, maximum_models=20000, chunk_models=128)",
          "summary": "Exact active-face search, not unconstrained fractions clipped afterwards.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Exactly fit a small fixed library under nonnegative sum-one constraints.\n\nArgs:\n    targets (array-like): Finite spectra (N, B), B >= 2, in common units.\n    endmembers (array-like): Finite candidate spectra (M, B), 1 <= M <= 12.\n\nReturns:\n    dict: Fractions (N, M), RMSE/reconstructions, angle and ambiguity details\n        from fit_models. Fractions are dimensionless; RMSE retains input units.\n\nRaises:\n    ValueError: Nonfinite/inconsistent matrices or oversized library.\n\nExperimental numerical utility, not an ecological abundance validation.\nEvery feasible face is considered at declared numerical rank tolerances;\ndegenerate/near-collinear candidates can leave fractions nonidentifiable.",
          "examples": [
            "examples/spectral_library_methods.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 192,
          "methods": [],
          "name": "fcls",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "endmembers"
            }
          ],
          "path": "spectralbridge.mixtures.fcls",
          "signature": "fcls(targets, endmembers) -> dict",
          "summary": "Exactly fit a small fixed library under nonnegative sum-one constraints.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "RMSE(target, f*candidate+(1-f)*0), 0<=f<=1; rows target, cols candidate.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 218,
          "methods": [],
          "name": "shade_model_errors",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "candidates"
            }
          ],
          "path": "spectralbridge.mixtures.shade_model_errors",
          "signature": "shade_model_errors(targets, candidates)",
          "summary": "RMSE(target, f*candidate+(1-f)*0), 0<=f<=1; rows target, cols candidate.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 234,
          "methods": [],
          "name": "_angles",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "a"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "b"
            }
          ],
          "path": "spectralbridge.mixtures._angles",
          "signature": "_angles(a, b)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Published EAR and MASA within-class means excluding self.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 240,
          "methods": [],
          "name": "selection_scores",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            }
          ],
          "path": "spectralbridge.mixtures.selection_scores",
          "signature": "selection_scores(spectra, labels)",
          "summary": "Published EAR and MASA within-class means excluding self.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 267,
          "methods": [],
          "name": "_kappa",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pred"
            }
          ],
          "path": "spectralbridge.mixtures._kappa",
          "signature": "_kappa(truth, pred)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Schaaf/Roth add/remove training kappa; size-limited, no rare-class forcing.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 275,
          "methods": [],
          "name": "_ies",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "error"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "threshold"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "budget"
            }
          ],
          "path": "spectralbridge.mixtures._ies",
          "signature": "_ies(error, labels, threshold, budget)",
          "summary": "Schaaf/Roth add/remove training kappa; size-limited, no rare-class forcing.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Training-only selections. IES budget is global count_per_class x classes.\n\nCoB may stop early once all training spectra are covered. Ranking EAR/MASA\nbeyond their minimum and capped IES/hybrid are explicitly size adaptations.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 314,
          "methods": [],
          "name": "select_endmembers",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "method"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "count_per_class"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "0.02",
              "kind": "keyword-only",
              "name": "threshold"
            }
          ],
          "path": "spectralbridge.mixtures.select_endmembers",
          "signature": "select_endmembers(spectra, labels, method, count_per_class, *, seed=20261014, threshold=0.02)",
          "summary": "Training-only selections. IES budget is global count_per_class x classes.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Purge every held-out identity from training while preserving the supplied test-row mask.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 378,
          "methods": [],
          "name": "grouped_identity_split",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "test_rows"
            }
          ],
          "path": "spectralbridge.mixtures.grouped_identity_split",
          "signature": "grouped_identity_split(identities, test_rows)",
          "summary": "Purge every held-out identity from training while preserving the supplied test-row mask.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Generate linear mixtures ONLY from a caller-provided held-out source set.",
          "examples": [
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 389,
          "methods": [],
          "name": "mixture_truth",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": "2",
              "kind": "keyword-only",
              "name": "pairs_per_composition"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "include_triples"
            }
          ],
          "path": "spectralbridge.mixtures.mixture_truth",
          "signature": "mixture_truth(spectra, labels, *, pairs_per_composition=2, seed=20261014, include_triples=True)",
          "summary": "Generate linear mixtures ONLY from a caller-provided held-out source set.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Reject identity leakage or endmembers selected outside a training fold.\n\nArgs:\n    identities (array-like): Nonmissing identity vector, shape (N,).\n    train (array-like): Boolean training mask, shape (N,).\n    test (array-like): Boolean test mask, shape (N,). Unused rows are allowed.\n    selected (array-like, optional): Integer candidate indices into these N rows.\n\nRaises:\n    ValueError: Shapes/identities are invalid, identities cross folds, or a\n        selected index is not a training row. Split by site/flight first;\n        this guard then purges/checks the complete identity history.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 432,
          "methods": [],
          "name": "validate_holdout",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "train"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "test"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "selected"
            }
          ],
          "path": "spectralbridge.mixtures.validate_holdout",
          "signature": "validate_holdout(identities, train, test, selected=None) -> None",
          "summary": "Reject identity leakage or endmembers selected outside a training fold.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Experimental residual adequacy labels; never certify material membership.\n\nArgs:\n    residuals (array-like): Finite nonnegative RMSE values in the same units\n        as threshold; arbitrary shape.\n    threshold (float): Nonnegative training-only adequacy bound. NaN means\n        unassessed; infinity and negative bounds are invalid.\n\nReturns:\n    numpy.ndarray: Same-shape string labels. Low residual is explicitly\n        unvalidated membership, even when an unknown material fits exactly.\n\nRaises:\n    ValueError: Invalid residuals or threshold. No data are clipped.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 462,
          "methods": [],
          "name": "adequacy_status",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "residuals"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "threshold"
            }
          ],
          "path": "spectralbridge.mixtures.adequacy_status",
          "signature": "adequacy_status(residuals, threshold) -> np.ndarray",
          "summary": "Experimental residual adequacy labels; never certify material membership.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Conditional fraction-detection counts; true presence means truth > 0.\n\nArgs:\n    truth (array-like): Finite fractions in [0, 1], shape (N,) or (N, C).\n    estimated (array-like): Same-shape finite fractions in [0, 1].\n    threshold (float): Detection cutoff in (0, 1], inclusive within 1e-10,\n        matching the readiness workflow's detection-curve rule.\n\nReturns:\n    dict: TP, FP, TN, FN, N and false-positive/negative rates across supplied\n        entries. A rate with no eligible denominator is NaN. These conditional\n        observations do not define population detection limits. Truth >= 0.1\n        class-set error in the readiness audit is a separate estimand.\n\nRaises:\n    ValueError: Shape, range or nonfinite inputs are invalid.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 486,
          "methods": [],
          "name": "detection_metrics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "estimated"
            },
            {
              "annotation": null,
              "default": "0.1",
              "kind": "keyword-only",
              "name": "threshold"
            }
          ],
          "path": "spectralbridge.mixtures.detection_metrics",
          "signature": "detection_metrics(truth, estimated, *, threshold=0.1) -> dict",
          "summary": "Conditional fraction-detection counts; true presence means truth > 0.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/mixtures.py",
      "sha256": "cda8a0224a9a33461849757babe183f7e35e90905e8c5ac8ea7c9d0a80ec8de6"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [],
      "docstring": "NEON-specific in-memory hyperspectral cube handling.\n\nThis module is adapted and substantially extended from concepts and data-access\nlogic in HyTools ``open_neon`` and ENVI helpers. It operates without importing\nHyTools at runtime; that fact does not remove its implementation lineage.\n\nHyTools: Hyperspectral image processing library\nCopyright (C) 2021 University of Wisconsin\nAuthors named in the relevant source notices: Adam Chlus, Zhiwei Ye, Philip Townsend.\nLicense: GNU General Public License, version 3\nUpstream: https://github.com/EnSpec/hytools\nAudited revision: 31286d64541791a9815d29443a33726fa4d54031\n\nModified and extended for SpectralBridge. See ``LICENSE``, ``NOTICE``, and\n``HYTOOLS_PROVENANCE.md``.",
      "export_expressions": [],
      "imports": {
        "Dict": "typing.Dict",
        "Iterator": "typing.Iterator",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "Tuple": "typing.Tuple",
        "_map_info_core": "spectralbridge.io.neon._map_info_core",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "read_neon_cube": "spectralbridge.io.neon.read_neon_cube"
      },
      "module": "spectralbridge.neon_cube",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "name"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "path"
            }
          ],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Container linking metadata names to HDF5 dataset paths.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 47,
          "methods": [],
          "name": "_MetadataEntry",
          "parameters": [],
          "path": "spectralbridge.neon_cube._MetadataEntry",
          "signature": null,
          "summary": "Container linking metadata names to HDF5 dataset paths.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "In-memory NEON hyperspectral cube loader.\n\nThe implementation intentionally targets NEON AOP reflectance products only;\nit mirrors the pieces of HyTools that cross-sensor-cal relies upon while\navoiding a runtime dependency on HyTools itself.  The spectral cube is loaded\nfully into memory (as ``float32``) upon initialisation along with essential\nmetadata required for BRDF/topographic corrections and ENVI exports.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 54,
          "methods": [
            {
              "docstring": "",
              "line": 64,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str | Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "h5_path"
                },
                {
                  "annotation": "Optional[Dict[str, str | Path]]",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "ancillary_paths"
                },
                {
                  "annotation": "slice | tuple[int, int] | None",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "sample_slice"
                },
                {
                  "annotation": "slice | tuple[int, int] | None",
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "line_slice"
                }
              ],
              "private": true,
              "signature": "__init__(self, h5_path: str | Path, ancillary_paths: Optional[Dict[str, str | Path]]=None, sample_slice: slice | tuple[int, int] | None=None, line_slice: slice | tuple[int, int] | None=None) -> None"
            },
            {
              "docstring": "Recursively index metadata datasets for ancillary lookup.",
              "line": 180,
              "name": "_index_metadata",
              "parameters": [
                {
                  "annotation": "h5py.Group",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "metadata_group"
                }
              ],
              "private": true,
              "signature": "_index_metadata(self, metadata_group: h5py.Group) -> None"
            },
            {
              "docstring": "Return the first dataset path matching ``name`` in the metadata index.",
              "line": 198,
              "name": "_lookup_metadata_path",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "name"
                }
              ],
              "private": true,
              "signature": "_lookup_metadata_path(self, name: str) -> Optional[str]"
            },
            {
              "docstring": "Return an ancillary raster or angle for correction workflows.\n\nThis method adapts HyTools' ancillary retrieval logic for the NEON-only\nuse case within cross-sensor-cal (HyTools: Hyperspectral image processing\nlibrary; Authors: Adam Chlus, Zhiwei Ye, Philip Townsend. GPLv3).",
              "line": 206,
              "name": "get_ancillary",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "name"
                },
                {
                  "annotation": "bool",
                  "default": "True",
                  "kind": "positional-or-keyword",
                  "name": "radians"
                }
              ],
              "private": false,
              "signature": "get_ancillary(self, name: str, radians: bool=True) -> np.ndarray"
            },
            {
              "docstring": "Yield sequential spatial chunks of the reflectance cube.",
              "line": 331,
              "name": "iter_chunks",
              "parameters": [
                {
                  "annotation": "int",
                  "default": "100",
                  "kind": "positional-or-keyword",
                  "name": "chunk_y"
                },
                {
                  "annotation": "int",
                  "default": "100",
                  "kind": "positional-or-keyword",
                  "name": "chunk_x"
                }
              ],
              "private": false,
              "signature": "iter_chunks(self, chunk_y: int=100, chunk_x: int=100) -> Iterator[Tuple[int, int, int, int, np.ndarray]]"
            },
            {
              "docstring": "Return the number of spatial chunks produced by :meth:`iter_chunks`.",
              "line": 350,
              "name": "chunk_count",
              "parameters": [
                {
                  "annotation": "int",
                  "default": "100",
                  "kind": "positional-or-keyword",
                  "name": "chunk_y"
                },
                {
                  "annotation": "int",
                  "default": "100",
                  "kind": "positional-or-keyword",
                  "name": "chunk_x"
                }
              ],
              "private": false,
              "signature": "chunk_count(self, chunk_y: int=100, chunk_x: int=100) -> int"
            },
            {
              "docstring": "Construct an ENVI header compatible with NEON reflectance outputs.\n\nAdapted from HyTools' ENVI export routines for NEON reflectance data\n(HyTools: Hyperspectral image processing library; Authors: Adam Chlus,\nZhiwei Ye, Philip Townsend. GPLv3).",
              "line": 361,
              "name": "build_envi_header",
              "parameters": [],
              "private": false,
              "signature": "build_envi_header(self) -> dict"
            }
          ],
          "name": "NeonCube",
          "parameters": [],
          "path": "spectralbridge.neon_cube.NeonCube",
          "signature": null,
          "summary": "In-memory NEON hyperspectral cube loader.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read a single-band ENVI raster for ancillary information.\n\nThis helper is a NEON-focused adaptation of HyTools' ENVI parsing utilities\n(HyTools: Hyperspectral image processing library; Authors: Adam Chlus,\nZhiwei Ye, Philip Townsend. GPLv3).  It assumes BSQ interleave, ``float32``\ndata type, and returns the first (and typically only) band as a ``float32``\narray shaped ``(lines, samples)``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 407,
          "methods": [],
          "name": "_read_envi_single_band",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            }
          ],
          "path": "spectralbridge.neon_cube._read_envi_single_band",
          "signature": "_read_envi_single_band(img_path: Path) -> np.ndarray",
          "summary": "Read a single-band ENVI raster for ancillary information.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Convenience helper for manual debugging of NEON cubes.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 492,
          "methods": [],
          "name": "debug_load_neon_cube",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.neon_cube.debug_load_neon_cube",
          "signature": "debug_load_neon_cube(h5_path: Path) -> 'NeonCube'",
          "summary": "Convenience helper for manual debugging of NEON cubes.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/neon_cube.py",
      "sha256": "40e18ca4dd6a8a334623bfed6f9320d896a52063cbeeebc8d45cb62428e972dd"
    },
    {
      "area": "pipelines",
      "constants": [],
      "declared_exports": [],
      "docstring": "NEON-to-ENVI exporter without a HyTools runtime dependency.\n\nThe reader/writer components retain documented HyTools implementation lineage;\nsee ``HYTOOLS_PROVENANCE.md``.",
      "export_expressions": [],
      "imports": {
        "EnviWriter": "spectralbridge.envi_writer.EnviWriter",
        "Iterable": "typing.Iterable",
        "NEONReflectanceENVIFile": "spectralbridge.file_types.NEONReflectanceENVIFile",
        "NEONReflectanceFile": "spectralbridge.file_types.NEONReflectanceFile",
        "NeonCube": "spectralbridge.neon_cube.NeonCube",
        "Path": "pathlib.Path",
        "TileProgressReporter": "spectralbridge.progress_utils.TileProgressReporter",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.neon_to_envi",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the ENVI stem that should be written for ``envi_file``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 21,
          "methods": [],
          "name": "_resolve_output",
          "parameters": [
            {
              "annotation": "NEONReflectanceENVIFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_file"
            }
          ],
          "path": "spectralbridge.neon_to_envi._resolve_output",
          "signature": "_resolve_output(envi_file: NEONReflectanceENVIFile) -> Path",
          "summary": "Return the ENVI stem that should be written for ``envi_file``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Convert NEON `.h5` reflectance cubes into ENVI BSQ rasters.\n\nThe implementation streams chunks out of :class:`NeonCube` and writes them via\n:class:`EnviWriter`. It is restart-safe: valid outputs are reused automatically\nwhen the function is called again.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 27,
          "methods": [],
          "name": "neon_to_envi_no_hytools",
          "parameters": [
            {
              "annotation": "Iterable[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "images"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "brightness_offset"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "interactive_mode"
            },
            {
              "annotation": "int",
              "default": "25",
              "kind": "keyword-only",
              "name": "log_every"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_slice"
            },
            {
              "annotation": "slice | tuple[int, int] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "line_slice"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "output_stem"
            }
          ],
          "path": "spectralbridge.neon_to_envi.neon_to_envi_no_hytools",
          "signature": "neon_to_envi_no_hytools(images: Iterable[str], output_dir: str, brightness_offset: float | None=None, *, interactive_mode: bool=True, log_every: int=25, sample_slice: slice | tuple[int, int] | None=None, line_slice: slice | tuple[int, int] | None=None, output_stem: str | Path | None=None) -> list[dict]",
          "summary": "Convert NEON `.h5` reflectance cubes into ENVI BSQ rasters.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Simple CLI wrapper around :func:`neon_to_envi_no_hytools`.",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 174,
          "methods": [],
          "name": "_main",
          "parameters": [
            {
              "annotation": "Iterable[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.neon_to_envi._main",
          "signature": "_main(argv: Iterable[str] | None=None) -> None",
          "summary": "Simple CLI wrapper around :func:`neon_to_envi_no_hytools`.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/neon_to_envi.py",
      "sha256": "273dfa0d36a491b2d62ea14ff51826c8b546772581d23f9ecd7b55c4d7e93600"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [
        "build_parquet_from_envi",
        "ensure_parquet_for_envi",
        "ensure_parquet_from_envi",
        "parquet_exists_and_valid",
        "pq_read_table",
        "pq_write_table",
        "read_envi_in_chunks",
        "repair_lonlat_in_place"
      ],
      "docstring": "Parquet export utilities for ENVI reflectance products.\n\nThe helpers in this module are intentionally lightweight at import time so that\nunit tests can import :mod:`spectralbridge.parquet_export` without requiring\nheavy geospatial dependencies. Expensive libraries (``rasterio``, ``pandas``,\n``pyarrow``) are imported lazily inside :func:`build_parquet_from_envi`.",
      "export_expressions": [
        "__all__ = ['parquet_exists_and_valid', 'build_parquet_from_envi', 'ensure_parquet_from_envi', 'ensure_parquet_for_envi', 'read_envi_in_chunks', 'pq_read_table', 'pq_write_table', 'repair_lonlat_in_place']"
      ],
      "imports": {
        "Affine": "affine.Affine",
        "CRS": "rasterio.crs.CRS",
        "EXCLUDE_PATTERNS": "spectralbridge.merge_duckdb.EXCLUDE_PATTERNS",
        "NamedTuple": "typing.NamedTuple",
        "Path": "pathlib.Path",
        "SENSOR_WAVELENGTHS_NM": "spectralbridge.exports.schema_utils.SENSOR_WAVELENGTHS_NM",
        "Window": "rasterio.windows.Window",
        "_to_canonical_table": "spectralbridge.pipelines.pipeline._to_canonical_table",
        "annotations": "__future__.annotations",
        "ensure_coord_columns": "spectralbridge.exports.schema_utils.ensure_coord_columns",
        "infer_stage_from_name": "spectralbridge.exports.schema_utils.infer_stage_from_name",
        "parse_envi_wavelengths_nm": "spectralbridge.exports.schema_utils.parse_envi_wavelengths_nm",
        "sort_and_rename_spectral_columns": "spectralbridge.exports.schema_utils.sort_and_rename_spectral_columns",
        "suppress": "contextlib.suppress",
        "xy": "rasterio.transform.xy"
      },
      "module": "spectralbridge.parquet_export",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "int",
              "default": null,
              "name": "row_start"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "row_end"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "col_start"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "col_end"
            }
          ],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 30,
          "methods": [],
          "name": "_ParquetChunkJob",
          "parameters": [],
          "path": "spectralbridge.parquet_export._ParquetChunkJob",
          "signature": null,
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "envi_img"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "band_count"
            },
            {
              "annotation": "tuple[int, ...]",
              "default": null,
              "name": "band_wavelengths"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "width"
            },
            {
              "annotation": "float | int | None",
              "default": null,
              "name": "nodata"
            },
            {
              "annotation": "int | str | None",
              "default": null,
              "name": "crs_candidate"
            },
            {
              "annotation": "tuple[float, float, float, float, float, float]",
              "default": null,
              "name": "transform"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "src_crs_wkt"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "stage_key"
            }
          ],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 37,
          "methods": [],
          "name": "_ParquetChunkContext",
          "parameters": [],
          "path": "spectralbridge.parquet_export._ParquetChunkContext",
          "signature": null,
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_export.pq_read_table"
          ],
          "kind": "function",
          "line": 49,
          "methods": [],
          "name": "pq_read_table",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.parquet_export.pq_read_table",
          "signature": "pq_read_table(path: Path)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_export.pq_write_table"
          ],
          "kind": "function",
          "line": 55,
          "methods": [],
          "name": "pq_write_table",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "obj"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.parquet_export.pq_write_table",
          "signature": "pq_write_table(obj, path: Path)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 85,
          "methods": [],
          "name": "_add_lonlat_columns",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "transform"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "crs"
            }
          ],
          "path": "spectralbridge.parquet_export._add_lonlat_columns",
          "signature": "_add_lonlat_columns(df, img_path: Path, *, transform=None, crs=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 135,
          "methods": [],
          "name": "_plan_chunk_jobs",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_hdr"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_name"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage_key"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_size"
            }
          ],
          "path": "spectralbridge.parquet_export._plan_chunk_jobs",
          "signature": "_plan_chunk_jobs(envi_img: Path, envi_hdr: Path, parquet_name: str, stage_key: str, *, chunk_size: int) -> tuple[_ParquetChunkContext, list[_ParquetChunkJob], dict[str, object]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 281,
          "methods": [],
          "name": "_process_chunk_to_dataframe",
          "parameters": [
            {
              "annotation": "_ParquetChunkJob",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "job"
            },
            {
              "annotation": "_ParquetChunkContext",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "context"
            }
          ],
          "path": "spectralbridge.parquet_export._process_chunk_to_dataframe",
          "signature": "_process_chunk_to_dataframe(job: _ParquetChunkJob, context: _ParquetChunkContext)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Yield DataFrame chunks from an ENVI cube along with shared metadata.",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_export.read_envi_in_chunks"
          ],
          "kind": "function",
          "line": 377,
          "methods": [],
          "name": "read_envi_in_chunks",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_hdr"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_name"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "chunk_size"
            }
          ],
          "path": "spectralbridge.parquet_export.read_envi_in_chunks",
          "signature": "read_envi_in_chunks(envi_img: Path, envi_hdr: Path, parquet_name: str, *, chunk_size: int=50000)",
          "summary": "Yield DataFrame chunks from an ENVI cube along with shared metadata.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 424,
          "methods": [],
          "name": "_build_empty_parquet_table",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage_key"
            },
            {
              "annotation": "list[int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band_wavelengths"
            }
          ],
          "path": "spectralbridge.parquet_export._build_empty_parquet_table",
          "signature": "_build_empty_parquet_table(stage_key: str, band_wavelengths: list[int])",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 453,
          "methods": [],
          "name": "_write_parquet_chunks",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "chunk_iter"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage_key"
            },
            {
              "annotation": "dict[str, object] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "context"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "row_group_size"
            }
          ],
          "path": "spectralbridge.parquet_export._write_parquet_chunks",
          "signature": "_write_parquet_chunks(parquet_path: Path, chunk_iter, stage_key: str, *, context: dict[str, object] | None=None, row_group_size: int | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return ``True`` when ``parquet_path`` exists and has a readable schema.",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_export.parquet_exists_and_valid"
          ],
          "kind": "function",
          "line": 502,
          "methods": [],
          "name": "parquet_exists_and_valid",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            }
          ],
          "path": "spectralbridge.parquet_export.parquet_exists_and_valid",
          "signature": "parquet_exists_and_valid(parquet_path: Path) -> bool",
          "summary": "Return ``True`` when ``parquet_path`` exists and has a readable schema.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 517,
          "methods": [],
          "name": "_crs_from_header_text",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header_text"
            }
          ],
          "path": "spectralbridge.parquet_export._crs_from_header_text",
          "signature": "_crs_from_header_text(header_text: str) -> int | str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read an ENVI cube and emit a wide per-pixel Parquet table.",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_export.build_parquet_from_envi"
          ],
          "kind": "function",
          "line": 544,
          "methods": [],
          "name": "build_parquet_from_envi",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_hdr"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "positional-or-keyword",
              "name": "chunk_size"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "num_cpus"
            }
          ],
          "path": "spectralbridge.parquet_export.build_parquet_from_envi",
          "signature": "build_parquet_from_envi(envi_img: Path, envi_hdr: Path, parquet_path: Path, chunk_size: int=50000, *, num_cpus: int | None=None) -> None",
          "summary": "Read an ENVI cube and emit a wide per-pixel Parquet table.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Reuse a readable Parquet schema or rebuild the table from the existing ENVI image/header in bounded chunks.",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_export.ensure_parquet_from_envi"
          ],
          "kind": "function",
          "line": 578,
          "methods": [],
          "name": "ensure_parquet_from_envi",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_hdr"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "num_cpus"
            }
          ],
          "path": "spectralbridge.parquet_export.ensure_parquet_from_envi",
          "signature": "ensure_parquet_from_envi(envi_img: Path, envi_hdr: Path, parquet_path: Path, *, chunk_size: int=50000, num_cpus: int | None=None) -> Path",
          "summary": "Reuse a readable Parquet schema or rebuild the table from the existing ENVI image/header in bounded chunks.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Add missing coordinate columns to eligible Parquets in place using matching ENVI geometry.",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_export.repair_lonlat_in_place"
          ],
          "kind": "function",
          "line": 609,
          "methods": [],
          "name": "repair_lonlat_in_place",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "folder"
            }
          ],
          "path": "spectralbridge.parquet_export.repair_lonlat_in_place",
          "signature": "repair_lonlat_in_place(folder: Path)",
          "summary": "Add missing coordinate columns to eligible Parquets in place using matching ENVI geometry.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Ensure a ``.parquet`` sidecar exists for ``envi_img``.\n\nThis treats the `_undarkened_envi.img/.hdr` convolution-only products the\nsame as their brightness-adjusted counterparts so QA comparisons stay\naligned.",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_export.ensure_parquet_for_envi"
          ],
          "kind": "function",
          "line": 636,
          "methods": [],
          "name": "ensure_parquet_for_envi",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_img"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "logger"
            },
            {
              "annotation": "int",
              "default": "2048",
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "ray_cpus"
            }
          ],
          "path": "spectralbridge.parquet_export.ensure_parquet_for_envi",
          "signature": "ensure_parquet_for_envi(envi_img: Path, logger, *, chunk_size: int=2048, ray_cpus: int | None=None) -> Path | None",
          "summary": "Ensure a ``.parquet`` sidecar exists for ``envi_img``.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/parquet_export.py",
      "sha256": "f71baea5c7e226a8a204eade37e394b84c2201f5b4c721a5739254c66d777ddf"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [
        "collect_issues",
        "is_ok_columns",
        "main",
        "parse_args"
      ],
      "docstring": "Package-local validation for SpectralBridge Parquet sidecars.",
      "export_expressions": [
        "__all__ = ['collect_issues', 'is_ok_columns', 'main', 'parse_args']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.parquet_validation",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return whether spectral columns are named and ordered per stage.",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_validation.is_ok_columns"
          ],
          "kind": "function",
          "line": 14,
          "methods": [],
          "name": "is_ok_columns",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            }
          ],
          "path": "spectralbridge.parquet_validation.is_ok_columns",
          "signature": "is_ok_columns(columns: Sequence[str]) -> bool",
          "summary": "Return whether spectral columns are named and ordered per stage.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return validation issues for every direct Parquet child of ``root``.",
          "examples": [],
          "exports": [
            "spectralbridge.parquet_validation.collect_issues"
          ],
          "kind": "function",
          "line": 34,
          "methods": [],
          "name": "collect_issues",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.parquet_validation.collect_issues",
          "signature": "collect_issues(root: Path) -> list[tuple[str, str]]",
          "summary": "Return validation issues for every direct Parquet child of ``root``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Parse the installed Parquet-validator command line.",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.parquet_validation.parse_args"
          ],
          "kind": "function",
          "line": 77,
          "methods": [],
          "name": "parse_args",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.parquet_validation.parse_args",
          "signature": "parse_args(argv: Sequence[str] | None=None) -> argparse.Namespace",
          "summary": "Parse the installed Parquet-validator command line.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Validate one directory and return a command-line status code.",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.parquet_validation.main"
          ],
          "kind": "function",
          "line": 97,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.parquet_validation.main",
          "signature": "main(argv: Sequence[str] | None=None) -> int",
          "summary": "Validate one directory and return a command-line status code.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/parquet_validation.py",
      "sha256": "5365be25d0bcd73746c316f3103dc19531ebf0e63ec4c2255d8069fb5b3dbbb2"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "FlightlinePaths",
        "SensorProductPaths",
        "normalize_brdf_model_path",
        "scene_prefix_from_dir",
        "site_from_prefix"
      ],
      "docstring": "",
      "export_expressions": [
        "__all__ = ['FlightlinePaths', 'SensorProductPaths', 'scene_prefix_from_dir', 'site_from_prefix', 'normalize_brdf_model_path']"
      ],
      "imports": {
        "Dict": "typing.Dict",
        "NEONReflectanceENVIFile": "spectralbridge.file_types.NEONReflectanceENVIFile",
        "NEONReflectanceFile": "spectralbridge.file_types.NEONReflectanceFile",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass"
      },
      "module": "spectralbridge.paths",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "flight_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "sensor_suffix"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/naming-conventions.md"
          ],
          "docstring": "Convenience wrapper for per-sensor ENVI/Parquet/QA artefacts.",
          "examples": [],
          "exports": [
            "spectralbridge.paths.SensorProductPaths"
          ],
          "kind": "class",
          "line": 13,
          "methods": [
            {
              "docstring": "",
              "line": 20,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 24,
              "name": "flight_dir",
              "parameters": [],
              "private": false,
              "signature": "flight_dir(self) -> Path"
            },
            {
              "docstring": "",
              "line": 28,
              "name": "stem",
              "parameters": [],
              "private": false,
              "signature": "stem(self) -> str"
            },
            {
              "docstring": "",
              "line": 32,
              "name": "img",
              "parameters": [],
              "private": false,
              "signature": "img(self) -> Path"
            },
            {
              "docstring": "",
              "line": 36,
              "name": "hdr",
              "parameters": [],
              "private": false,
              "signature": "hdr(self) -> Path"
            },
            {
              "docstring": "",
              "line": 40,
              "name": "parquet",
              "parameters": [],
              "private": false,
              "signature": "parquet(self) -> Path"
            },
            {
              "docstring": "",
              "line": 44,
              "name": "qa_png",
              "parameters": [],
              "private": false,
              "signature": "qa_png(self) -> Path"
            },
            {
              "docstring": "",
              "line": 48,
              "name": "qa_pdf",
              "parameters": [],
              "private": false,
              "signature": "qa_pdf(self) -> Path"
            },
            {
              "docstring": "",
              "line": 52,
              "name": "qa_json",
              "parameters": [],
              "private": false,
              "signature": "qa_json(self) -> Path"
            }
          ],
          "name": "SensorProductPaths",
          "parameters": [],
          "path": "spectralbridge.paths.SensorProductPaths",
          "signature": null,
          "summary": "Convenience wrapper for per-sensor ENVI/Parquet/QA artefacts.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "flight_id"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/naming-conventions.md",
            "docs/pipeline/outputs.md"
          ],
          "docstring": "Centralised path helper ensuring per-flightline isolation.",
          "examples": [],
          "exports": [
            "spectralbridge.paths.FlightlinePaths"
          ],
          "kind": "class",
          "line": 57,
          "methods": [
            {
              "docstring": "",
              "line": 63,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 67,
              "name": "flight_dir",
              "parameters": [],
              "private": false,
              "signature": "flight_dir(self) -> Path"
            },
            {
              "docstring": "",
              "line": 71,
              "name": "h5",
              "parameters": [],
              "private": false,
              "signature": "h5(self) -> Path"
            },
            {
              "docstring": "",
              "line": 75,
              "name": "envi_img",
              "parameters": [],
              "private": false,
              "signature": "envi_img(self) -> Path"
            },
            {
              "docstring": "",
              "line": 79,
              "name": "envi_hdr",
              "parameters": [],
              "private": false,
              "signature": "envi_hdr(self) -> Path"
            },
            {
              "docstring": "",
              "line": 83,
              "name": "envi_parquet",
              "parameters": [],
              "private": false,
              "signature": "envi_parquet(self) -> Path"
            },
            {
              "docstring": "",
              "line": 87,
              "name": "corrected_img",
              "parameters": [],
              "private": false,
              "signature": "corrected_img(self) -> Path"
            },
            {
              "docstring": "",
              "line": 91,
              "name": "corrected_hdr",
              "parameters": [],
              "private": false,
              "signature": "corrected_hdr(self) -> Path"
            },
            {
              "docstring": "",
              "line": 95,
              "name": "corrected_json",
              "parameters": [],
              "private": false,
              "signature": "corrected_json(self) -> Path"
            },
            {
              "docstring": "",
              "line": 99,
              "name": "corrected_parquet",
              "parameters": [],
              "private": false,
              "signature": "corrected_parquet(self) -> Path"
            },
            {
              "docstring": "",
              "line": 103,
              "name": "brdf_model",
              "parameters": [],
              "private": false,
              "signature": "brdf_model(self) -> Path"
            },
            {
              "docstring": "",
              "line": 107,
              "name": "qa_png",
              "parameters": [],
              "private": false,
              "signature": "qa_png(self) -> Path"
            },
            {
              "docstring": "",
              "line": 111,
              "name": "qa_pdf",
              "parameters": [],
              "private": false,
              "signature": "qa_pdf(self) -> Path"
            },
            {
              "docstring": "",
              "line": 115,
              "name": "qa_json",
              "parameters": [],
              "private": false,
              "signature": "qa_json(self) -> Path"
            },
            {
              "docstring": "",
              "line": 119,
              "name": "qa_metrics_parquet",
              "parameters": [],
              "private": false,
              "signature": "qa_metrics_parquet(self) -> Path"
            },
            {
              "docstring": "",
              "line": 123,
              "name": "merged_parquet",
              "parameters": [],
              "private": false,
              "signature": "merged_parquet(self) -> Path"
            },
            {
              "docstring": "",
              "line": 127,
              "name": "sensor_products",
              "parameters": [],
              "private": false,
              "signature": "sensor_products(self) -> Dict[str, SensorProductPaths]"
            },
            {
              "docstring": "",
              "line": 145,
              "name": "sensor_product",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "sensor_name"
                }
              ],
              "private": false,
              "signature": "sensor_product(self, sensor_name: str) -> SensorProductPaths"
            },
            {
              "docstring": "Resolve the canonical stem for the uncorrected ENVI export.\n\nLegacy NEON flightlines that omit the tile identifier in the filename\nproduce ENVI outputs whose stem includes that synthetic tile\n(e.g. ` \u2026_20200720T163210_20200720_163210_reflectance_envi `). Newer\nflightlines with explicit tiles already match ` flight_id `.\n\nWhen parsing fails for any reason, we fall back to the historic\n` <flight_id>_envi ` stem to preserve compatibility.",
              "line": 152,
              "name": "_raw_envi_base",
              "parameters": [],
              "private": true,
              "signature": "_raw_envi_base(self) -> Path"
            }
          ],
          "name": "FlightlinePaths",
          "parameters": [],
          "path": "spectralbridge.paths.FlightlinePaths",
          "signature": null,
          "summary": "Centralised path helper ensuring per-flightline isolation.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Recover a scene prefix from a raw ENVI image, HDF5 filename or, as a last fallback, the directory name.",
          "examples": [],
          "exports": [
            "spectralbridge.paths.scene_prefix_from_dir"
          ],
          "kind": "function",
          "line": 259,
          "methods": [],
          "name": "scene_prefix_from_dir",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            }
          ],
          "path": "spectralbridge.paths.scene_prefix_from_dir",
          "signature": "scene_prefix_from_dir(flightline_dir: Path) -> str",
          "summary": "Recover a scene prefix from a raw ENVI image, HDF5 filename or, as a last fallback, the directory name.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Extract a NEON site code from a matching canonical scene prefix, otherwise return None.",
          "examples": [],
          "exports": [
            "spectralbridge.paths.site_from_prefix"
          ],
          "kind": "function",
          "line": 285,
          "methods": [],
          "name": "site_from_prefix",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            }
          ],
          "path": "spectralbridge.paths.site_from_prefix",
          "signature": "site_from_prefix(prefix: str) -> str | None",
          "summary": "Extract a NEON site code from a matching canonical scene prefix, otherwise return None.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Ensure the BRDF model JSON in ` flightline_dir ` matches the scene prefix:\n    <prefix>_brdf_model.json\n\nIf a legacy file like 'NIWO_brdf_model.json' exists, rename it.\nReturns the normalized Path (or None if nothing found).",
          "examples": [],
          "exports": [
            "spectralbridge.paths.normalize_brdf_model_path"
          ],
          "kind": "function",
          "line": 292,
          "methods": [],
          "name": "normalize_brdf_model_path",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            }
          ],
          "path": "spectralbridge.paths.normalize_brdf_model_path",
          "signature": "normalize_brdf_model_path(flightline_dir: Path) -> Path | None",
          "summary": "Ensure the BRDF model JSON in ` flightline_dir ` matches the scene prefix:",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/paths.py",
      "sha256": "6a67408dc98fd8318eeaa7351f33e1a18a6b9dd1e2f5add17d3271bc10edc568"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Additive, design-conditional audit of PFT whole-curve inference.\n\nEstablished scaled-MAD envelopes and synchronized nonparametric combination;\nexplicit blocked energy/FPCA adaptations. Does not claim species-independent effects.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "UNASSIGNED": "spectralbridge.plant_spectral_pfts.UNASSIGNED",
        "_center": "spectralbridge.plant_pft_statistics._center",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_history_keys": "spectralbridge.plant_pft_statistics._history_keys",
        "_model_inputs": "spectralbridge.plant_spectral_quantiles._model_inputs",
        "_seed": "spectralbridge.plant_pft_statistics._seed",
        "_write_json": "spectralbridge.plant_pft_statistics._write_json",
        "_year_plant_spectra": "spectralbridge.plant_spectral_years._year_plant_spectra",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "cdist": "scipy.spatial.distance.cdist",
        "dataclass": "dataclasses.dataclass",
        "holm": "spectralbridge.plant_pft_statistics.holm",
        "load_pft_crosswalk": "spectralbridge.plant_spectral_pfts.load_pft_crosswalk",
        "permute_within": "spectralbridge.plant_pft_statistics.permute_within",
        "rankdata": "scipy.stats.rankdata",
        "tag_pfts": "spectralbridge.plant_spectral_pfts.tag_pfts"
      },
      "module": "spectralbridge.pft_method_audit",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "int",
              "default": "9999",
              "name": "permutations"
            },
            {
              "annotation": "int",
              "default": "20261014",
              "name": "seed"
            },
            {
              "annotation": "float",
              "default": "0.95",
              "name": "pc_variance"
            },
            {
              "annotation": "int",
              "default": "10",
              "name": "pc_cap"
            },
            {
              "annotation": "float",
              "default": "8",
              "name": "max_gap_nm"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Configure the historical whole-spectrum PFT method audit and its explicit resampling budgets.",
          "examples": [
            "examples/pft_method_audit.py",
            "examples/researcher_pft_statistics.py",
            "examples/sensor_pft_transfer.py"
          ],
          "exports": [],
          "kind": "class",
          "line": 34,
          "methods": [
            {
              "docstring": "",
              "line": 43,
              "name": "validate",
              "parameters": [],
              "private": false,
              "signature": "validate(self)"
            }
          ],
          "name": "AuditConfig",
          "parameters": [],
          "path": "spectralbridge.pft_method_audit.AuditConfig",
          "signature": null,
          "summary": "Configure the historical whole-spectrum PFT method audit and its explicit resampling budgets.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Trapezoidal weights on disconnected supported segments, never across gaps.",
          "examples": [
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/validate_figures.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 48,
          "methods": [],
          "name": "wavelength_weights",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "w"
            },
            {
              "annotation": null,
              "default": "8",
              "kind": "positional-or-keyword",
              "name": "max_gap"
            }
          ],
          "path": "spectralbridge.pft_method_audit.wavelength_weights",
          "signature": "wavelength_weights(w, max_gap=8)",
          "summary": "Trapezoidal weights on disconnected supported segments, never across gaps.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Exchangeable ensemble upper-tail ranks, inclusive of identity and ties.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 63,
          "methods": [],
          "name": "upper_p",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.pft_method_audit.upper_p",
          "signature": "upper_p(values)",
          "summary": "Exchangeable ensemble upper-tail ranks, inclusive of identity and ties.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Synchronized Tippett combination; calibrate min partial p on same ensemble.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 70,
          "methods": [],
          "name": "npc_probability",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "statistics"
            }
          ],
          "path": "spectralbridge.pft_method_audit.npc_probability",
          "signature": "npc_probability(statistics)",
          "summary": "Synchronized Tippett combination; calibrate min partial p on same ensemble.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Conservative Monte Carlo MAD multiplier with strict excursion/tie rule.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 77,
          "methods": [],
          "name": "envelope_critical",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "maxima"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "alpha"
            }
          ],
          "path": "spectralbridge.pft_method_audit.envelope_critical",
          "signature": "envelope_critical(maxima, alpha)",
          "summary": "Conservative Monte Carlo MAD multiplier with strict excursion/tie rule.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Evaluate synchronized conditional whole-spectrum permutation statistics.\n\nArgs:\n    values (array-like): Stored reflectance matrix (N polygon/year curves, B\n        wavelengths). Units remain unchanged; finite common variable columns\n        within eligible mixed blocks are used, without imputation.\n    labels (array-like): Binary 0/1 group labels, shape (N,).\n    blocks (array-like): Nonmissing exact-history block labels, shape (N,).\n    wavelengths (array-like): Increasing coordinates in nm, shape (B,).\n    config (AuditConfig, optional): Permutations, rank and gap settings.\n    seed (int, optional): Overrides the config seed.\n    integration_weights (array-like, optional): Nonnegative weights (B,).\n        Default is disconnected wavelength quadrature; use explicit discrete\n        sensor weights for widely spaced channels.\n\nReturns:\n    dict: Observed/permuted curves and four statistics, component/NPC p-values,\n        rows/columns retained, scale, SE, normalized weights and FPCA diagnostics.\n\nRaises:\n    ValueError: Invalid dimensions/labels/blocks/weights or insufficient\n        complete variable support / exchangeable mixed blocks.\n\nLabels move as whole curves within blocks. Conditional exchangeability is an\nassumption; results do not establish causal PFT mechanisms. NPC calibrates a\njoint probability combination, not an uncorrected minimum p. Multiplicity\nadjustment and family envelopes belong to the calling analysis.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 86,
          "methods": [],
          "name": "method_statistics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "blocks"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "integration_weights"
            }
          ],
          "path": "spectralbridge.pft_method_audit.method_statistics",
          "signature": "method_statistics(values, labels, blocks, wavelengths, *, config=None, seed=None, integration_weights=None) -> dict",
          "summary": "Evaluate synchronized conditional whole-spectrum permutation statistics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 198,
          "methods": [],
          "name": "_plot_envelopes",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "summary"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "family"
            }
          ],
          "path": "spectralbridge.pft_method_audit._plot_envelopes",
          "signature": "_plot_envelopes(root, summary, records, family)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Audit historical PFT comparisons against checksum-verified prior results with restart checkpoints.",
          "examples": [
            "examples/pft_method_audit.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 240,
          "methods": [],
          "name": "run_method_audit",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparisons"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "legacy"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.pft_method_audit.run_method_audit",
          "signature": "run_method_audit(comparisons, legacy, output, *, config=None)",
          "summary": "Audit historical PFT comparisons against checksum-verified prior results with restart checkpoints.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 348,
          "methods": [],
          "name": "_consistency",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "summary"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            }
          ],
          "path": "spectralbridge.pft_method_audit._consistency",
          "signature": "_consistency(root, summary, records)",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/pft_method_audit.py",
      "sha256": "458018dbfff411710ef2eea62a2698f8bcc86121bca0905fbf5bd0c2e88fc3df"
    },
    {
      "area": "pipelines",
      "constants": [],
      "declared_exports": [
        "pipeline",
        "run_bulk_pipeline",
        "run_download",
        "run_drone_pipeline",
        "run_pipeline"
      ],
      "docstring": "Pipeline entry points for SpectralBridge.",
      "export_expressions": [
        "__all__ = ['run_pipeline', 'run_drone_pipeline', 'run_bulk_pipeline', 'run_download', 'pipeline']"
      ],
      "imports": {
        "_run_bulk_pipeline": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
        "_run_download": "spectralbridge.pipelines.download.run_download",
        "_run_drone_pipeline": "spectralbridge.pipelines.drone.run_drone_pipeline",
        "_run_pipeline": "spectralbridge.pipelines.pipeline.run_pipeline",
        "annotations": "__future__.annotations",
        "import_module": "importlib.import_module",
        "run_bulk_pipeline": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
        "run_download": "spectralbridge.pipelines.download.run_download",
        "run_drone_pipeline": "spectralbridge.pipelines.drone.run_drone_pipeline",
        "run_pipeline": "spectralbridge.pipelines.pipeline.run_pipeline"
      },
      "module": "spectralbridge.pipelines",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 16,
          "methods": [],
          "name": "__getattr__",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.pipelines.__getattr__",
          "signature": "__getattr__(name: str)",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/pipelines/__init__.py",
      "sha256": "4b5e1be68dcfc42360ffbc59a929483bae52e85613b48c5647ff18fb3188cf97"
    },
    {
      "area": "pipelines",
      "constants": [],
      "declared_exports": [
        "BULK_SCHEMA_VERSION",
        "BulkAnalysisPaths",
        "BulkInputKind",
        "BulkInputMode",
        "BulkSource",
        "FlightlineRecord",
        "SourceFileRecord",
        "discover_bulk_sources",
        "run_bulk_pipeline"
      ],
      "docstring": "Orchestration for the independent production bulk-analysis pipeline.\n\nDiscovery, the virtual DuckDB dataset, provenance, and scientific analyses\nlive under the dedicated spectralbridge.bulk package.",
      "export_expressions": [
        "__all__ = ['BULK_SCHEMA_VERSION', 'BulkAnalysisPaths', 'BulkInputKind', 'BulkInputMode', 'BulkSource', 'FlightlineRecord', 'SourceFileRecord', 'discover_bulk_sources', 'run_bulk_pipeline']"
      ],
      "imports": {
        "AnalysisProfile": "spectralbridge.bulk.registry.AnalysisProfile",
        "Any": "typing.Any",
        "BULK_SCHEMA_VERSION": "spectralbridge.bulk.models.BULK_SCHEMA_VERSION",
        "BulkAnalysisPaths": "spectralbridge.bulk.models.BulkAnalysisPaths",
        "BulkInputKind": "spectralbridge.bulk.models.BulkInputKind",
        "BulkInputMode": "spectralbridge.bulk.models.BulkInputMode",
        "BulkSource": "spectralbridge.bulk.models.BulkSource",
        "DEFAULT_IDENTITY_PARSERS": "spectralbridge.bulk.identity.DEFAULT_IDENTITY_PARSERS",
        "DEFAULT_PRODUCT_REGISTRY": "spectralbridge.bulk.registry.DEFAULT_PRODUCT_REGISTRY",
        "FlightlineIdentityParser": "spectralbridge.bulk.identity.FlightlineIdentityParser",
        "FlightlineRecord": "spectralbridge.bulk.models.FlightlineRecord",
        "Path": "pathlib.Path",
        "ProductRegistry": "spectralbridge.bulk.registry.ProductRegistry",
        "Sequence": "typing.Sequence",
        "SourceFileRecord": "spectralbridge.bulk.models.SourceFileRecord",
        "SpectralLibraryPaths": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPaths",
        "SpectralLibraryPlotConfig": "spectralbridge.bulk.analyses.spectral_library.SpectralLibraryPlotConfig",
        "ThreadPoolExecutor": "concurrent.futures.ThreadPoolExecutor",
        "TranslationPair": "spectralbridge.bulk.registry.TranslationPair",
        "__version__": "spectralbridge.__version__",
        "annotations": "__future__.annotations",
        "as_completed": "concurrent.futures.as_completed",
        "asdict": "dataclasses.asdict",
        "build_bulk_catalog": "spectralbridge.bulk.catalog.build_bulk_catalog",
        "build_exclusion_records": "spectralbridge.bulk.exclusions.build_exclusion_records",
        "catalog_signature_records": "spectralbridge.bulk.catalog.catalog_signature_records",
        "compute_flightline_statistics": "spectralbridge.bulk.streaming.compute_flightline_statistics",
        "create_bulk_database": "spectralbridge.bulk.dataset.create_bulk_database",
        "datetime": "datetime.datetime",
        "discover_bulk_sources": "spectralbridge.bulk.catalog.discover_bulk_sources",
        "discover_completed_flightlines": "spectralbridge.bulk.flightline_outputs.discover_completed_flightlines",
        "extract_flightline_cache": "spectralbridge.bulk.flightline_outputs.extract_flightline_cache",
        "finalize_bulk_database": "spectralbridge.bulk.dataset.finalize_bulk_database",
        "find_canonical_flightline_directories": "spectralbridge.bulk.flightline_outputs.find_canonical_flightline_directories",
        "inspect_spectral_library": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library",
        "inspect_spectral_library_preflight": "spectralbridge.bulk.analyses.spectral_library.inspect_spectral_library_preflight",
        "replace": "dataclasses.replace",
        "resolve_analysis_profile": "spectralbridge.bulk.registry.resolve_analysis_profile",
        "run_dataset_census": "spectralbridge.bulk.analyses.run_dataset_census",
        "run_leave_one_site_out": "spectralbridge.bulk.analyses.run_leave_one_site_out",
        "run_sensor_translation": "spectralbridge.bulk.analyses.run_sensor_translation",
        "run_spectral_library_analysis": "spectralbridge.bulk.analyses.spectral_library.run_spectral_library_analysis",
        "run_streaming_translation_analyses": "spectralbridge.bulk.analyses.streaming_translation.run_streaming_translation_analyses",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "timezone": "datetime.timezone",
        "write_diagnostic_sample": "spectralbridge.bulk.streaming.write_diagnostic_sample",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic",
        "write_statistics": "spectralbridge.bulk.streaming.write_statistics",
        "write_text_atomic": "spectralbridge.bulk.provenance.write_text_atomic"
      },
      "module": "spectralbridge.pipelines.bulk",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 86,
          "methods": [],
          "name": "_path_is_within",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parent"
            }
          ],
          "path": "spectralbridge.pipelines.bulk._path_is_within",
          "signature": "_path_is_within(path: Path, parent: Path) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 94,
          "methods": [],
          "name": "_prepare_output_directory",
          "parameters": [
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            }
          ],
          "path": "spectralbridge.pipelines.bulk._prepare_output_directory",
          "signature": "_prepare_output_directory(paths: BulkAnalysisPaths) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 106,
          "methods": [],
          "name": "_input_signature",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "root"
            },
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "keyword-only",
              "name": "paths"
            },
            {
              "annotation": "BulkInputKind",
              "default": null,
              "kind": "keyword-only",
              "name": "input_kind"
            },
            {
              "annotation": "BulkInputMode",
              "default": null,
              "kind": "keyword-only",
              "name": "input_mode"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "materialize_observations"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "row_group_size"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "preflight_only"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "require_translation_pairs"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "extraction_chunk_size"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "extraction_workers"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "diagnostic_sample_size"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "diagnostic_seed"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": null,
              "kind": "keyword-only",
              "name": "spectral_library_schema"
            },
            {
              "annotation": "SpectralLibraryPlotConfig",
              "default": null,
              "kind": "keyword-only",
              "name": "spectral_library_config"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "make_summary_plots"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "make_full_spectral_reports"
            },
            {
              "annotation": "AnalysisProfile",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_profile"
            },
            {
              "annotation": "ProductRegistry",
              "default": null,
              "kind": "keyword-only",
              "name": "product_registry"
            },
            {
              "annotation": "Sequence[FlightlineIdentityParser]",
              "default": null,
              "kind": "keyword-only",
              "name": "identity_parsers"
            },
            {
              "annotation": "tuple[TranslationPair, ...]",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "on_invalid"
            },
            {
              "annotation": "list[SourceFileRecord]",
              "default": null,
              "kind": "keyword-only",
              "name": "source_files"
            },
            {
              "annotation": "list[FlightlineRecord]",
              "default": null,
              "kind": "keyword-only",
              "name": "flightlines"
            }
          ],
          "path": "spectralbridge.pipelines.bulk._input_signature",
          "signature": "_input_signature(*, root: Path, paths: BulkAnalysisPaths, input_kind: BulkInputKind, input_mode: BulkInputMode, minimum_reflectance: float, materialize_observations: bool, row_group_size: int, preflight_only: bool, require_translation_pairs: bool, extraction_chunk_size: int, extraction_workers: int, diagnostic_sample_size: int, diagnostic_seed: int, spectral_library_schema: dict[str, Any] | None, spectral_library_config: SpectralLibraryPlotConfig, make_summary_plots: bool, make_full_spectral_reports: bool, analysis_profile: AnalysisProfile, product_registry: ProductRegistry, identity_parsers: Sequence[FlightlineIdentityParser], translation_pairs: tuple[TranslationPair, ...], on_invalid: str, source_files: list[SourceFileRecord], flightlines: list[FlightlineRecord]) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 166,
          "methods": [],
          "name": "_relative_output",
          "parameters": [
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.pipelines.bulk._relative_output",
          "signature": "_relative_output(paths: BulkAnalysisPaths, path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 170,
          "methods": [],
          "name": "_outputs_are_valid",
          "parameters": [
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "materialize_observations"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "preflight_only"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "input_mode"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "spectral_library_requested"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "make_summary_plots"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "make_full_spectral_reports"
            }
          ],
          "path": "spectralbridge.pipelines.bulk._outputs_are_valid",
          "signature": "_outputs_are_valid(paths: BulkAnalysisPaths, *, materialize_observations: bool, preflight_only: bool, input_mode: str, spectral_library_requested: bool, make_summary_plots: bool, make_full_spectral_reports: bool) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Write the human and machine explanation of campaign readiness.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 312,
          "methods": [],
          "name": "_write_campaign_summary",
          "parameters": [
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "census"
            },
            {
              "annotation": "Sequence[FlightlineRecord]",
              "default": null,
              "kind": "keyword-only",
              "name": "flightlines"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_decision"
            }
          ],
          "path": "spectralbridge.pipelines.bulk._write_campaign_summary",
          "signature": "_write_campaign_summary(paths: BulkAnalysisPaths, *, census: dict[str, Any], flightlines: Sequence[FlightlineRecord], analysis_decision: dict[str, Any]) -> None",
          "summary": "Write the human and machine explanation of campaign readiness.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/release_candidate_smoke.py",
            "examples/researcher_pft_information.py",
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 407,
          "methods": [],
          "name": "_result",
          "parameters": [
            {
              "annotation": "BulkAnalysisPaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "input_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "status"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "accepted_flightline_count"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "duplicate_count"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "rejected_count"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "row_count"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_pair_count"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "materialize_observations"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "preflight_only"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "input_mode"
            },
            {
              "annotation": "AnalysisProfile",
              "default": null,
              "kind": "keyword-only",
              "name": "analysis_profile"
            },
            {
              "annotation": "tuple[TranslationPair, ...]",
              "default": null,
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "diagnostic_sample_size"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": null,
              "kind": "keyword-only",
              "name": "spectral_library_schema"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": null,
              "kind": "keyword-only",
              "name": "spectral_library_preflight"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "spectral_library_requested"
            }
          ],
          "path": "spectralbridge.pipelines.bulk._result",
          "signature": "_result(paths: BulkAnalysisPaths, *, input_path: Path, status: str, accepted_flightline_count: int, duplicate_count: int, rejected_count: int, row_count: int, translation_pair_count: int, materialize_observations: bool, preflight_only: bool, input_mode: str, analysis_profile: AnalysisProfile, translation_pairs: tuple[TranslationPair, ...], diagnostic_sample_size: int, spectral_library_schema: dict[str, Any] | None, spectral_library_preflight: dict[str, Any] | None, spectral_library_requested: bool) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Catalog completed flightlines and run population analyses.\n\nParameters\n----------\ninput_path : str | Path\n    Existing source tree or merged Parquet to inventory; input products are read in place.\noutput_dir : str | Path | None, default=None\n    Directory for generated products; bulk outputs must be outside the read-only input tree.\ninput_kind : BulkInputKind, default='full'\n    Select eligible 'full', 'polygon', or 'both' table products; discovery still records companions for transparency.\ninput_mode : BulkInputMode, default='auto'\n    'auto' prefers completed flightline directories and falls back to merged Parquets; alternatives are 'flightline_outputs' and 'merged_parquet'.\nanalysis : str | AnalysisProfile, default='translation'\n    Registered analysis profile name or AnalysisProfile controlling required products and permissible sensor pairs.\nsensors : tuple[str, ...] | list[str] | None, default=None\n    Optional sensor-name selection passed to the product registry; None retains profile-compatible sensors.\ntranslation_pairs : Sequence[str | TranslationPair] | None, default=None\n    Explicit registered source-to-target relationships to analyze; None uses the selected registry/profile defaults.\nproduct_registry : ProductRegistry, default=DEFAULT_PRODUCT_REGISTRY\n    ProductRegistry describing recognized filenames, sensor roles, band contracts and translation relationships.\nidentity_parsers : Sequence[FlightlineIdentityParser], default=DEFAULT_IDENTITY_PARSERS\n    Ordered parsers for canonical scientific identity from filenames or manifests; outer run-folder names are not scientific identifiers.\non_invalid : str, default='exclude'\n    'exclude' records invalid sources; 'error' stops instead of continuing with an excluded population.\nminimum_reflectance : float, default=0.0\n    Lower screening bound in the stored reflectance units; used for regression validity, not automatic unit conversion.\nrequire_translation_pairs : bool, default=True\n    Require eligible registered pairs; False permits a modified profile without a translation-pair requirement.\nmaterialize_observations : bool, default=False\n    Explicit opt-in to pixel-scale observation materialization; normal bulk runs retain compact sufficient statistics only.\nrow_group_size : int, default=50000\n    Positive rows per written Parquet row group; None in the merge workflow delegates to its established default.\nmemory_limit : str | None, default=None\n    DuckDB memory budget string, such as \"4GB\"; None leaves the connection default.\nthreads : int | None, default=None\n    Positive DuckDB thread budget; None delegates to the established database default.\ntemp_directory : str | Path | None, default=None\n    DuckDB spill directory; bulk temporary storage must be outside the read-only source tree.\npreflight_only : bool, default=False\n    Return catalog/eligibility and cost information without executing the population analyses.\nextraction_chunk_size : int, default=2048\n    Positive bounded raster window size in pixels for sufficient-statistics extraction.\nextraction_workers : int, default=1\n    Positive number of independent flightline extraction workers; storage bandwidth can limit useful concurrency.\ndiagnostic_sample_size : int, default=0\n    Maximum diagnostic pixel sample count; zero disables row-level diagnostic sample output.\ndiagnostic_seed : int, default=0\n    Random-number seed for reproducible sampling, splits or resampling; it does not create independent observations.\nspectral_library : str | Path | None, default=None\n    Existing merged polygon Parquet with wavelength-bearing columns; read in place without copying the source dataset.\nmake_summary_plots : bool, default=False\n    Write compact spectral-summary figures in addition to numerical summaries.\nmake_full_spectral_reports : bool, default=False\n    Explicitly enable potentially expensive full trace reports; inspect preflight costs before enabling.\nspectral_library_config : SpectralLibraryPlotConfig | None, default=None\n    SpectralLibraryPlotConfig controlling group fields, stage, validity and rendering; None uses its defaults.\nforce : bool, default=False\n    Regenerate the requested outputs instead of reusing an otherwise valid checkpoint or report.\n\nReturns\n-------\ndict[str, Any]\n    Status, accepted/rejected/duplicate counts, pair counts, manifest/catalog/database and analysis paths; preflight returns before fits.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nThe source tree is treated as read only. Scientific identity is recovered\nthrough configurable identity parsers, never arbitrary outer run-folder\nnames. Duplicate flightline IDs in different source directories are\ncataloged and excluded from analysis.\n\n``input_mode='auto'`` prefers canonical completed-flightline directories\nand falls back to prebuilt merged Parquets. Completed-flightline mode needs\nonly the target products required by the selected profile and relationship;\nit reads them in bounded chunks and writes only compact, restart-safe\nsufficient statistics beneath ``output_dir``. Pixel observations are\nmaterialized only when ``materialize_observations=True`` is explicitly set.\nCanonical drone Landsat-like application products are inventoried and may\nbe fitted as explicitly labeled application-verification diagnostics. They\nare not independent evidence for updating the coefficient registry that\nproduced them.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\nWith an existing completed-flightline source tree, inspect eligibility first. The destination must be outside that source tree.\n\n>>> from spectralbridge import run_bulk_pipeline\n>>> result = run_bulk_pipeline(input_path=source_dir, output_dir=output_dir, preflight_only=True)  # doctest: +SKIP",
          "examples": [
            "examples/release_candidate_smoke.py"
          ],
          "exports": [
            "spectralbridge.run_bulk_pipeline",
            "spectralbridge.pipelines.run_bulk_pipeline",
            "spectralbridge.pipelines.bulk.run_bulk_pipeline"
          ],
          "kind": "function",
          "line": 587,
          "methods": [],
          "name": "run_bulk_pipeline",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_path"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": "BulkInputKind",
              "default": "'full'",
              "kind": "keyword-only",
              "name": "input_kind"
            },
            {
              "annotation": "BulkInputMode",
              "default": "'auto'",
              "kind": "keyword-only",
              "name": "input_mode"
            },
            {
              "annotation": "str | AnalysisProfile",
              "default": "'translation'",
              "kind": "keyword-only",
              "name": "analysis"
            },
            {
              "annotation": "tuple[str, ...] | list[str] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensors"
            },
            {
              "annotation": "Sequence[str | TranslationPair] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "translation_pairs"
            },
            {
              "annotation": "ProductRegistry",
              "default": "DEFAULT_PRODUCT_REGISTRY",
              "kind": "keyword-only",
              "name": "product_registry"
            },
            {
              "annotation": "Sequence[FlightlineIdentityParser]",
              "default": "DEFAULT_IDENTITY_PARSERS",
              "kind": "keyword-only",
              "name": "identity_parsers"
            },
            {
              "annotation": "str",
              "default": "'exclude'",
              "kind": "keyword-only",
              "name": "on_invalid"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "minimum_reflectance"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "require_translation_pairs"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "materialize_observations"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "row_group_size"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "memory_limit"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "threads"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "temp_directory"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "preflight_only"
            },
            {
              "annotation": "int",
              "default": "2048",
              "kind": "keyword-only",
              "name": "extraction_chunk_size"
            },
            {
              "annotation": "int",
              "default": "1",
              "kind": "keyword-only",
              "name": "extraction_workers"
            },
            {
              "annotation": "int",
              "default": "0",
              "kind": "keyword-only",
              "name": "diagnostic_sample_size"
            },
            {
              "annotation": "int",
              "default": "0",
              "kind": "keyword-only",
              "name": "diagnostic_seed"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "spectral_library"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "make_summary_plots"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "make_full_spectral_reports"
            },
            {
              "annotation": "SpectralLibraryPlotConfig | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "spectral_library_config"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "force"
            }
          ],
          "path": "spectralbridge.pipelines.bulk.run_bulk_pipeline",
          "signature": "run_bulk_pipeline(input_path: str | Path, output_dir: str | Path | None=None, *, input_kind: BulkInputKind='full', input_mode: BulkInputMode='auto', analysis: str | AnalysisProfile='translation', sensors: tuple[str, ...] | list[str] | None=None, translation_pairs: Sequence[str | TranslationPair] | None=None, product_registry: ProductRegistry=DEFAULT_PRODUCT_REGISTRY, identity_parsers: Sequence[FlightlineIdentityParser]=DEFAULT_IDENTITY_PARSERS, on_invalid: str='exclude', minimum_reflectance: float=0.0, require_translation_pairs: bool=True, materialize_observations: bool=False, row_group_size: int=50000, memory_limit: str | None=None, threads: int | None=None, temp_directory: str | Path | None=None, preflight_only: bool=False, extraction_chunk_size: int=2048, extraction_workers: int=1, diagnostic_sample_size: int=0, diagnostic_seed: int=0, spectral_library: str | Path | None=None, make_summary_plots: bool=False, make_full_spectral_reports: bool=False, spectral_library_config: SpectralLibraryPlotConfig | None=None, force: bool=False) -> dict[str, Any]",
          "summary": "Catalog completed flightlines and run population analyses.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/pipelines/bulk.py",
      "sha256": "dd42be3db629e828f6e4758b83a0dcb0152b9b26249585c5187a4bc1e582d88f"
    },
    {
      "area": "pipelines",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "download_neon_flight_lines": "spectralbridge.envi_download.download_neon_flight_lines"
      },
      "module": "spectralbridge.pipelines.download",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 10,
          "methods": [],
          "name": "_build_parser",
          "parameters": [],
          "path": "spectralbridge.pipelines.download._build_parser",
          "signature": "_build_parser() -> argparse.ArgumentParser",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.run_download"
          ],
          "kind": "function",
          "line": 38,
          "methods": [],
          "name": "run_download",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.pipelines.download.run_download",
          "signature": "run_download(argv: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/pipelines/download.py",
      "sha256": "68e9efce563099259a206d1356641aecf2d6c97fddca60fd1ac0629dba2a688c"
    },
    {
      "area": "pipelines",
      "constants": [
        {
          "annotation": "dict[str, int]",
          "name": "DRONE_TARGET_BANDS",
          "value": "{'blue': 444, 'green': 560, 'red': 650, 'nir': 862}"
        }
      ],
      "declared_exports": [
        "DRONE_TARGET_BANDS",
        "DronePipelineIncompleteError",
        "build_drone_config",
        "build_drone_output_paths",
        "clean_name",
        "collect_drone_spatial_diagnostics",
        "convert_drone_tiff_to_h5",
        "derive_drone_flight_stem",
        "diagnose_drone_h5_solar_geometry",
        "export_h5_to_envi",
        "load_drone_manifest",
        "lookup_flight_datetime",
        "required_drone_outputs",
        "resolve_band_map",
        "run_drone_pipeline",
        "save_drone_overlay_debug_plot",
        "summarize_drone_h5_solar_geometry",
        "validate_drone_h5_metadata"
      ],
      "docstring": "",
      "export_expressions": [
        "__all__ = ['DRONE_TARGET_BANDS', 'DronePipelineIncompleteError', 'required_drone_outputs', 'build_drone_output_paths', 'build_drone_config', 'clean_name', 'collect_drone_spatial_diagnostics', 'convert_drone_tiff_to_h5', 'derive_drone_flight_stem', 'export_h5_to_envi', 'load_drone_manifest', 'lookup_flight_datetime', 'resolve_band_map', 'run_drone_pipeline', 'save_drone_overlay_debug_plot', 'summarize_drone_h5_solar_geometry', 'diagnose_drone_h5_solar_geometry', 'validate_drone_h5_metadata']"
      ],
      "imports": {
        "Any": "typing.Any",
        "CRS": "rasterio.crs.CRS",
        "EnviWriter": "spectralbridge.envi_writer.EnviWriter",
        "HYTOOLS_BRDF_KERNEL_CONFIG": "spectralbridge.corrections.HYTOOLS_BRDF_KERNEL_CONFIG",
        "Mapping": "typing.Mapping",
        "NDVIBinningConfig": "spectralbridge.corrections.NDVIBinningConfig",
        "NeonCube": "spectralbridge.neon_cube.NeonCube",
        "PRODUCTION_TRANSLATION_WEIGHTING": "spectralbridge.drone_translation_registry.PRODUCTION_TRANSLATION_WEIGHTING",
        "Path": "pathlib.Path",
        "Rectangle": "matplotlib.patches.Rectangle",
        "Sequence": "typing.Sequence",
        "TileProgressReporter": "spectralbridge.progress_utils.TileProgressReporter",
        "ZoneInfo": "zoneinfo.ZoneInfo",
        "ZoneInfoNotFoundError": "zoneinfo.ZoneInfoNotFoundError",
        "__version__": "spectralbridge.__version__",
        "_describe_parquet_columns": "spectralbridge.polygons._describe_parquet_columns",
        "_map_info_core": "spectralbridge.io.neon._map_info_core",
        "_prepare_map_info": "spectralbridge.io.neon._prepare_map_info",
        "_quote_identifier": "spectralbridge.polygons._quote_identifier",
        "_quote_path": "spectralbridge.polygons._quote_path",
        "_write_dataframe_parquet": "spectralbridge.polygons._write_dataframe_parquet",
        "acquire_landsat_observation": "spectralbridge.landsat_validation.acquire_landsat_observation",
        "annotations": "__future__.annotations",
        "apply_brdf_correct": "spectralbridge.corrections.apply_brdf_correct",
        "apply_drone_translation": "spectralbridge.drone_translation.apply_drone_translation",
        "apply_topo_correct": "spectralbridge.corrections.apply_topo_correct",
        "box": "shapely.geometry.box",
        "build_drone_qa_summary": "spectralbridge.utils.qa_summary.build_drone_qa_summary",
        "compare_landsat_common_support": "spectralbridge.landsat_validation.compare_landsat_common_support",
        "dataclass": "dataclasses.dataclass",
        "datetime": "datetime.datetime",
        "enrich_translated_spectral_library": "spectralbridge.drone_translation.enrich_translated_spectral_library",
        "ensure_coord_columns": "cross_sensor_cal.exports.schema_utils.ensure_coord_columns",
        "ensure_matched_source_product": "spectralbridge.drone_translation.ensure_matched_source_product",
        "ensure_parquet_from_envi": "spectralbridge.parquet_export.ensure_parquet_from_envi",
        "extract_polygon_parquet_from_envi": "spectralbridge.polygons.extract_polygon_parquet_from_envi",
        "fit_and_save_brdf_model": "spectralbridge.corrections.fit_and_save_brdf_model",
        "get_package_data_path": "spectralbridge.utils.paths.get_package_data_path",
        "hdr_to_dict": "spectralbridge.envi.hdr_to_dict",
        "is_valid_envi_pair": "spectralbridge.utils_checks.is_valid_envi_pair",
        "is_valid_json": "spectralbridge.utils_checks.is_valid_json",
        "load_drone_translation_plans": "spectralbridge.drone_translation.load_drone_translation_plans",
        "load_supplied_landsat_observation": "spectralbridge.landsat_validation.load_supplied_landsat_observation",
        "matched_source_output_stem": "spectralbridge.drone_translation.matched_source_output_stem",
        "memmap_bsq": "spectralbridge.envi.memmap_bsq",
        "packaged_drone_translation_coefficients_path": "spectralbridge.drone_translation_registry.packaged_drone_translation_coefficients_path",
        "parquet_exists_and_valid": "spectralbridge.parquet_export.parquet_exists_and_valid",
        "raster_acquisition_datetime": "spectralbridge.landsat_validation.raster_acquisition_datetime",
        "raster_bounds_wgs84": "spectralbridge.landsat_validation.raster_bounds_wgs84",
        "rasterize": "rasterio.features.rasterize",
        "render_common_support_comparison": "spectralbridge.drone_qa.render_common_support_comparison",
        "render_drone_panel": "spectralbridge.qa_plots.render_drone_panel",
        "render_drone_translation_publication": "spectralbridge.drone_qa.render_drone_translation_publication",
        "render_drone_translation_qa": "spectralbridge.drone_qa.render_drone_translation_qa",
        "timezone": "datetime.timezone",
        "tqdm": "tqdm.auto.tqdm",
        "translated_output_stem": "spectralbridge.drone_translation.translated_output_stem",
        "validate_coordinate_match": "spectralbridge.polygons.validate_coordinate_match",
        "warp_transform": "rasterio.warp.transform",
        "xy": "rasterio.transform.xy"
      },
      "module": "spectralbridge.pipelines.drone",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Raised when a requested drone correction cannot produce a valid output.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 166,
          "methods": [
            {
              "docstring": "",
              "line": 169,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "message"
                },
                {
                  "annotation": "dict[str, Any]",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "audit"
                }
              ],
              "private": true,
              "signature": "__init__(self, message: str, audit: dict[str, Any])"
            }
          ],
          "name": "DroneCorrectionUnavailableError",
          "parameters": [],
          "path": "spectralbridge.pipelines.drone.DroneCorrectionUnavailableError",
          "signature": null,
          "summary": "Raised when a requested drone correction cannot produce a valid output.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "A run did not satisfy its requested scientific output contract.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.DronePipelineIncompleteError"
          ],
          "kind": "class",
          "line": 174,
          "methods": [
            {
              "docstring": "",
              "line": 177,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "message"
                },
                {
                  "annotation": "dict[str, Any]",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "results"
                }
              ],
              "private": true,
              "signature": "__init__(self, message: str, results: dict[str, Any])"
            }
          ],
          "name": "DronePipelineIncompleteError",
          "parameters": [],
          "path": "spectralbridge.pipelines.drone.DronePipelineIncompleteError",
          "signature": null,
          "summary": "A run did not satisfy its requested scientific output contract.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "source_path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "source_type"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "flight_stem"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Describe one supported discovered drone HDF5/TIFF source and its provenance.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 183,
          "methods": [],
          "name": "DroneInputSource",
          "parameters": [],
          "path": "spectralbridge.pipelines.drone.DroneInputSource",
          "signature": null,
          "summary": "Describe one supported discovered drone HDF5/TIFF source and its provenance.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "name"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "kind"
            },
            {
              "annotation": "tuple[Path, ...]",
              "default": null,
              "name": "paths"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Describe one canonical product required by a selected drone extraction/translation workflow.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 192,
          "methods": [],
          "name": "DroneOutputRequirement",
          "parameters": [],
          "path": "spectralbridge.pipelines.drone.DroneOutputRequirement",
          "signature": null,
          "summary": "Describe one canonical product required by a selected drone extraction/translation workflow.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Normalize manifest/package identifiers for tolerant flight matching.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 200,
          "methods": [],
          "name": "_normalise_drone_manifest_id",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.drone._normalise_drone_manifest_id",
          "signature": "_normalise_drone_manifest_id(value: Any) -> str",
          "summary": "Normalize manifest/package identifiers for tolerant flight matching.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return an alphanumeric-only key for separator-tolerant matching.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 210,
          "methods": [],
          "name": "_compact_drone_manifest_id",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.drone._compact_drone_manifest_id",
          "signature": "_compact_drone_manifest_id(value: str) -> str",
          "summary": "Return an alphanumeric-only key for separator-tolerant matching.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Remove a trailing date token used in derived drone flight stems.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 216,
          "methods": [],
          "name": "_strip_trailing_manifest_date",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.drone._strip_trailing_manifest_date",
          "signature": "_strip_trailing_manifest_date(value: str) -> str",
          "summary": "Remove a trailing date token used in derived drone flight stems.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 222,
          "methods": [],
          "name": "_find_manifest_column",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "expected"
            }
          ],
          "path": "spectralbridge.pipelines.drone._find_manifest_column",
          "signature": "_find_manifest_column(columns: Sequence[str], expected: str) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Load drone flight acquisition datetimes from a CSV manifest.\n\nThe manifest is expected to include ``Plot``, ``Day of data collection``,\nand ``Mean Time of data collection (24 hr clock)`` columns. Flight\nidentifiers are normalized to uppercase underscore-separated tokens such as\n``AOP_GOLDHILL``. Rows with missing identifiers or malformed datetimes are\nskipped with warnings so a partially messy field manifest can still support\nvalid flights.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.load_drone_manifest"
          ],
          "kind": "function",
          "line": 231,
          "methods": [],
          "name": "load_drone_manifest",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "manifest_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone.load_drone_manifest",
          "signature": "load_drone_manifest(manifest_path: str | Path) -> dict[str, datetime]",
          "summary": "Load drone flight acquisition datetimes from a CSV manifest.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Resolve a drone manifest path with notebook-friendly relative fallbacks.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 320,
          "methods": [],
          "name": "_resolve_drone_manifest_path",
          "parameters": [
            {
              "annotation": "str | Path | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "manifest_path"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "input_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._resolve_drone_manifest_path",
          "signature": "_resolve_drone_manifest_path(manifest_path: str | Path | None, *, input_path: str | Path) -> Path",
          "summary": "Resolve a drone manifest path with notebook-friendly relative fallbacks.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return a manifest datetime for a derived drone flight identifier.\n\nMatching rules are deliberately conservative and deterministic:\n\n- identifiers are compared after uppercasing and collapsing separators to\n  underscores;\n- an exact match wins first;\n- a trailing ``YYYYMMDD`` token is ignored, so ``AOP_GOLDHILL_20230814``\n  matches manifest row ``AOP_GOLDHILL``;\n- if needed, separators are ignored for compact matching, so ``SPR1``\n  matches manifest row ``SPR-1``;\n- if neither rule matches, the longest manifest key that prefixes the\n  derived flight stem wins.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.lookup_flight_datetime"
          ],
          "kind": "function",
          "line": 369,
          "methods": [],
          "name": "lookup_flight_datetime",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_id"
            },
            {
              "annotation": "dict[str, datetime] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "manifest"
            }
          ],
          "path": "spectralbridge.pipelines.drone.lookup_flight_datetime",
          "signature": "lookup_flight_datetime(flight_id: str, manifest: dict[str, datetime] | None) -> datetime | None",
          "summary": "Return a manifest datetime for a derived drone flight identifier.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Normalise a source name minimally for filesystem-safe output filenames.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.clean_name"
          ],
          "kind": "function",
          "line": 414,
          "methods": [],
          "name": "clean_name",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.pipelines.drone.clean_name",
          "signature": "clean_name(name: str) -> str",
          "summary": "Normalise a source name minimally for filesystem-safe output filenames.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 425,
          "methods": [],
          "name": "_drone_file_fingerprint",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_file_fingerprint",
          "signature": "_drone_file_fingerprint(path: str | Path) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 435,
          "methods": [],
          "name": "_drone_stage_signature",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage"
            },
            {
              "annotation": "Sequence[str | Path]",
              "default": null,
              "kind": "keyword-only",
              "name": "inputs"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "configuration"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_stage_signature",
          "signature": "_drone_stage_signature(stage: str, *, inputs: Sequence[str | Path], configuration: dict[str, Any]) -> tuple[str, dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 451,
          "methods": [],
          "name": "_write_drone_stage_record",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "signature"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "payload"
            },
            {
              "annotation": "Sequence[Path]",
              "default": null,
              "kind": "keyword-only",
              "name": "outputs"
            },
            {
              "annotation": "str",
              "default": "'complete'",
              "kind": "keyword-only",
              "name": "status"
            }
          ],
          "path": "spectralbridge.pipelines.drone._write_drone_stage_record",
          "signature": "_write_drone_stage_record(path: Path, *, signature: str, payload: dict[str, Any], outputs: Sequence[Path], status: str='complete') -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 473,
          "methods": [],
          "name": "_drone_stage_matches",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "signature"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_stage_matches",
          "signature": "_drone_stage_matches(path: Path, signature: str) -> dict[str, Any] | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the nearest drone export package folder, or the direct parent.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 487,
          "methods": [],
          "name": "_drone_package_dir",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_package_dir",
          "signature": "_drone_package_dir(h5_path: str | Path) -> Path",
          "summary": "Return the nearest drone export package folder, or the direct parent.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Derive a drone flight stem from the package folder rather than the inner HDF5.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.derive_drone_flight_stem"
          ],
          "kind": "function",
          "line": 497,
          "methods": [],
          "name": "derive_drone_flight_stem",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone.derive_drone_flight_stem",
          "signature": "derive_drone_flight_stem(h5_path: str | Path) -> str",
          "summary": "Derive a drone flight stem from the package folder rather than the inner HDF5.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return per-flight drone paths under a dedicated flight directory.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.build_drone_output_paths"
          ],
          "kind": "function",
          "line": 524,
          "methods": [],
          "name": "build_drone_output_paths",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_root"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_stem"
            }
          ],
          "path": "spectralbridge.pipelines.drone.build_drone_output_paths",
          "signature": "build_drone_output_paths(output_root: str | Path, *, flight_stem: str) -> dict[str, Path]",
          "summary": "Return per-flight drone paths under a dedicated flight directory.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Write the generic scientific identity contract consumed by bulk.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 547,
          "methods": [],
          "name": "_write_drone_flightline_identity",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_stem"
            },
            {
              "annotation": "datetime | None",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "source_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "source_type"
            }
          ],
          "path": "spectralbridge.pipelines.drone._write_drone_flightline_identity",
          "signature": "_write_drone_flightline_identity(path: Path, *, flight_stem: str, acquisition_datetime: datetime | None, source_path: Path, source_type: str) -> Path",
          "summary": "Write the generic scientific identity contract consumed by bulk.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Describe the per-flight artifacts required by the requested workflow.\n\nThe same contract drives final validation and orchestration tests. Optional\nactual-Landsat comparison is excluded because scene availability is external.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.required_drone_outputs"
          ],
          "kind": "function",
          "line": 574,
          "methods": [],
          "name": "required_drone_outputs",
          "parameters": [
            {
              "annotation": "dict[str, Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path_map"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "extraction_mode"
            },
            {
              "annotation": "Sequence[str]",
              "default": "()",
              "kind": "keyword-only",
              "name": "translation_targets"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "include_report"
            }
          ],
          "path": "spectralbridge.pipelines.drone.required_drone_outputs",
          "signature": "required_drone_outputs(path_map: dict[str, Path], *, extraction_mode: str, translation_targets: Sequence[str]=(), include_report: bool=False) -> tuple[DroneOutputRequirement, ...]",
          "summary": "Describe the per-flight artifacts required by the requested workflow.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 707,
          "methods": [],
          "name": "_invalid_drone_outputs",
          "parameters": [
            {
              "annotation": "Sequence[DroneOutputRequirement]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "requirements"
            }
          ],
          "path": "spectralbridge.pipelines.drone._invalid_drone_outputs",
          "signature": "_invalid_drone_outputs(requirements: Sequence[DroneOutputRequirement]) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 751,
          "methods": [],
          "name": "_drone_path_matches_keywords",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Sequence[Sequence[str]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "keyword_groups"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_path_matches_keywords",
          "signature": "_drone_path_matches_keywords(path: Path, keyword_groups: Sequence[Sequence[str]]) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 756,
          "methods": [],
          "name": "_is_drone_ancillary_tiff",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._is_drone_ancillary_tiff",
          "signature": "_is_drone_ancillary_tiff(path: str | Path) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 764,
          "methods": [],
          "name": "_discover_drone_input_sources",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._discover_drone_input_sources",
          "signature": "_discover_drone_input_sources(input_path: str | Path) -> list[DroneInputSource]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 822,
          "methods": [],
          "name": "_find_drone_tiff_ancillary",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "package_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "key"
            }
          ],
          "path": "spectralbridge.pipelines.drone._find_drone_tiff_ancillary",
          "signature": "_find_drone_tiff_ancillary(package_dir: Path, key: str) -> Path | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 830,
          "methods": [],
          "name": "_normalise_tiff_spectral_vector",
          "parameters": [
            {
              "annotation": "Sequence[float] | np.ndarray | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "field_name"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "band_count"
            },
            {
              "annotation": "Sequence[float]",
              "default": null,
              "kind": "keyword-only",
              "name": "default_values"
            }
          ],
          "path": "spectralbridge.pipelines.drone._normalise_tiff_spectral_vector",
          "signature": "_normalise_tiff_spectral_vector(values: Sequence[float] | np.ndarray | None, *, field_name: str, band_count: int, default_values: Sequence[float]) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 853,
          "methods": [],
          "name": "_read_drone_tiff_raster",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._read_drone_tiff_raster",
          "signature": "_read_drone_tiff_raster(path: str | Path) -> tuple[np.ndarray, str, Any, float | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 869,
          "methods": [],
          "name": "_validate_drone_tiff_ancillary_alignment",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reflectance_path"
            },
            {
              "annotation": "tuple[int, int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reflectance_shape"
            },
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reflectance_transform"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reflectance_crs_wkt"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ancillary_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._validate_drone_tiff_ancillary_alignment",
          "signature": "_validate_drone_tiff_ancillary_alignment(reflectance_path: Path, reflectance_shape: tuple[int, int], reflectance_transform: Any, reflectance_crs_wkt: str, ancillary_path: Path) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 902,
          "methods": [],
          "name": "_build_drone_tiff_map_info",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "transform"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "crs_wkt"
            }
          ],
          "path": "spectralbridge.pipelines.drone._build_drone_tiff_map_info",
          "signature": "_build_drone_tiff_map_info(transform: Any, crs_wkt: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 938,
          "methods": [],
          "name": "_coerce_acquisition_datetime",
          "parameters": [
            {
              "annotation": "datetime | str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.drone._coerce_acquisition_datetime",
          "signature": "_coerce_acquisition_datetime(value: datetime | str | None) -> datetime | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return an aware acquisition time without guessing a missing timezone.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 949,
          "methods": [],
          "name": "_resolve_acquisition_datetime_timezone",
          "parameters": [
            {
              "annotation": "datetime | str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "naive_timezone"
            }
          ],
          "path": "spectralbridge.pipelines.drone._resolve_acquisition_datetime_timezone",
          "signature": "_resolve_acquisition_datetime_timezone(value: datetime | str | None, *, naive_timezone: str | None) -> datetime | None",
          "summary": "Return an aware acquisition time without guessing a missing timezone.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 972,
          "methods": [],
          "name": "_datetime_to_utc_naive",
          "parameters": [
            {
              "annotation": "datetime",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.drone._datetime_to_utc_naive",
          "signature": "_datetime_to_utc_naive(value: datetime) -> datetime",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return per-pixel longitude/latitude arrays from a raster transform/CRS.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 978,
          "methods": [],
          "name": "_drone_pixel_lon_lat",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "keyword-only",
              "name": "transform"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "crs_wkt"
            },
            {
              "annotation": "tuple[int, int]",
              "default": null,
              "kind": "keyword-only",
              "name": "shape"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_pixel_lon_lat",
          "signature": "_drone_pixel_lon_lat(*, transform: Any, crs_wkt: str, shape: tuple[int, int]) -> tuple[np.ndarray, np.ndarray]",
          "summary": "Return per-pixel longitude/latitude arrays from a raster transform/CRS.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Compute approximate solar zenith/azimuth rasters for a UTC acquisition time.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1012,
          "methods": [],
          "name": "_compute_solar_geometry_arrays",
          "parameters": [
            {
              "annotation": "datetime",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "longitude"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "latitude"
            }
          ],
          "path": "spectralbridge.pipelines.drone._compute_solar_geometry_arrays",
          "signature": "_compute_solar_geometry_arrays(*, acquisition_datetime: datetime, longitude: np.ndarray, latitude: np.ndarray) -> tuple[np.ndarray, np.ndarray]",
          "summary": "Compute approximate solar zenith/azimuth rasters for a UTC acquisition time.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1068,
          "methods": [],
          "name": "_solar_geometry_stats",
          "parameters": [
            {
              "annotation": "np.ndarray | float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_zenith"
            },
            {
              "annotation": "np.ndarray | float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "solar_azimuth"
            }
          ],
          "path": "spectralbridge.pipelines.drone._solar_geometry_stats",
          "signature": "_solar_geometry_stats(solar_zenith: np.ndarray | float, solar_azimuth: np.ndarray | float) -> dict[str, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1084,
          "methods": [],
          "name": "_write_solar_geometry_attrs",
          "parameters": [
            {
              "annotation": "h5py.Group",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metadata_group"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "source"
            },
            {
              "annotation": "datetime | None",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "np.ndarray | float",
              "default": null,
              "kind": "keyword-only",
              "name": "solar_zenith"
            },
            {
              "annotation": "np.ndarray | float",
              "default": null,
              "kind": "keyword-only",
              "name": "solar_azimuth"
            }
          ],
          "path": "spectralbridge.pipelines.drone._write_solar_geometry_attrs",
          "signature": "_write_solar_geometry_attrs(metadata_group: h5py.Group, *, source: str, acquisition_datetime: datetime | None, solar_zenith: np.ndarray | float, solar_azimuth: np.ndarray | float) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1103,
          "methods": [],
          "name": "_drone_h5_metadata_group",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_file"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_h5_metadata_group",
          "signature": "_drone_h5_metadata_group(h5_file: h5py.File) -> h5py.Group | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1109,
          "methods": [],
          "name": "_find_drone_solar_dataset",
          "parameters": [
            {
              "annotation": "h5py.Group",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metadata"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "angle"
            }
          ],
          "path": "spectralbridge.pipelines.drone._find_drone_solar_dataset",
          "signature": "_find_drone_solar_dataset(metadata: h5py.Group, *, angle: str) -> h5py.Dataset | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Calculate descriptive angle statistics without loading a full raster.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1129,
          "methods": [],
          "name": "_summarize_h5_angle",
          "parameters": [
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dataset"
            }
          ],
          "path": "spectralbridge.pipelines.drone._summarize_h5_angle",
          "signature": "_summarize_h5_angle(dataset: h5py.Dataset) -> tuple[float, float, float] | None",
          "summary": "Calculate descriptive angle statistics without loading a full raster.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Expose supported legacy sun-angle names in a run-owned working H5.\n\nHDF5 hard links add no raster copy and leave the original input untouched.\nThis also upgrades valid working files from interrupted older runs in place.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1158,
          "methods": [],
          "name": "_ensure_drone_working_h5_solar_aliases",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._ensure_drone_working_h5_solar_aliases",
          "signature": "_ensure_drone_working_h5_solar_aliases(path: Path) -> None",
          "summary": "Expose supported legacy sun-angle names in a run-owned working H5.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return solar geometry provenance and summary stats for a drone working H5.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.summarize_drone_h5_solar_geometry"
          ],
          "kind": "function",
          "line": 1187,
          "methods": [],
          "name": "summarize_drone_h5_solar_geometry",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone.summarize_drone_h5_solar_geometry",
          "signature": "summarize_drone_h5_solar_geometry(h5_path: str | Path) -> dict[str, Any]",
          "summary": "Return solar geometry provenance and summary stats for a drone working H5.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Signed smallest difference in degrees, including the 0/360 boundary.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1255,
          "methods": [],
          "name": "_circular_angle_difference",
          "parameters": [
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "left"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "right"
            }
          ],
          "path": "spectralbridge.pipelines.drone._circular_angle_difference",
          "signature": "_circular_angle_difference(left: float, right: float) -> float",
          "summary": "Signed smallest difference in degrees, including the 0/360 boundary.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read azimuth in bounded chunks and average directions, not numbers.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1261,
          "methods": [],
          "name": "_circular_mean_h5_angle",
          "parameters": [
            {
              "annotation": "h5py.Dataset | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dataset"
            }
          ],
          "path": "spectralbridge.pipelines.drone._circular_mean_h5_angle",
          "signature": "_circular_mean_h5_angle(dataset: h5py.Dataset | None) -> float | None",
          "summary": "Read azimuth in bounded chunks and average directions, not numbers.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Get scene-center (longitude, latitude) without reading image pixels.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1286,
          "methods": [],
          "name": "_drone_h5_scene_center",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_file"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_h5_scene_center",
          "signature": "_drone_h5_scene_center(h5_file: h5py.File) -> tuple[float, float]",
          "summary": "Get scene-center (longitude, latitude) without reading image pixels.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1312,
          "methods": [],
          "name": "_h5_angle_metadata",
          "parameters": [
            {
              "annotation": "h5py.Dataset | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dataset"
            }
          ],
          "path": "spectralbridge.pipelines.drone._h5_angle_metadata",
          "signature": "_h5_angle_metadata(dataset: h5py.Dataset | None) -> dict[str, Any] | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Compare source H5 angles with scene-center solar position, read-only.\n\nNaive timestamps have unknown provenance unless ``naive_timezone`` is\nexplicitly supplied. Candidate interpretations are informational only.\nThresholds (5/20 degrees) are deliberately provisional review bands, not\na calibration or permission to replace supplied correction geometry.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.diagnose_drone_h5_solar_geometry"
          ],
          "kind": "function",
          "line": 1323,
          "methods": [],
          "name": "diagnose_drone_h5_solar_geometry",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            },
            {
              "annotation": "datetime | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "naive_timezone"
            },
            {
              "annotation": "Sequence[str]",
              "default": "('UTC',)",
              "kind": "keyword-only",
              "name": "candidate_timezones"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "solar_summary"
            }
          ],
          "path": "spectralbridge.pipelines.drone.diagnose_drone_h5_solar_geometry",
          "signature": "diagnose_drone_h5_solar_geometry(h5_path: str | Path, *, acquisition_datetime: datetime | str | None=None, naive_timezone: str | None=None, candidate_timezones: Sequence[str]=('UTC',), solar_summary: dict[str, Any] | None=None) -> dict[str, Any]",
          "summary": "Compare source H5 angles with scene-center solar position, read-only.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1467,
          "methods": [],
          "name": "_expected_h5_scene_center_solar",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            },
            {
              "annotation": "datetime",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            }
          ],
          "path": "spectralbridge.pipelines.drone._expected_h5_scene_center_solar",
          "signature": "_expected_h5_scene_center_solar(h5_path: str | Path, *, acquisition_datetime: datetime) -> dict[str, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Write calculated solar arrays into a run-owned working H5 in chunks.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1487,
          "methods": [],
          "name": "_write_repaired_h5_solar_geometry",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            },
            {
              "annotation": "datetime",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            }
          ],
          "path": "spectralbridge.pipelines.drone._write_repaired_h5_solar_geometry",
          "signature": "_write_repaired_h5_solar_geometry(h5_path: Path, *, acquisition_datetime: datetime) -> dict[str, float]",
          "summary": "Write calculated solar arrays into a run-owned working H5 in chunks.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Validate embedded geometry and conservatively repair only a working H5.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1586,
          "methods": [],
          "name": "_validate_and_repair_drone_working_h5_solar_geometry",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "working_path"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "source_path"
            },
            {
              "annotation": "datetime | str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_timezone"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "acquisition_datetime_source"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "allow_repair"
            }
          ],
          "path": "spectralbridge.pipelines.drone._validate_and_repair_drone_working_h5_solar_geometry",
          "signature": "_validate_and_repair_drone_working_h5_solar_geometry(working_path: str | Path, *, source_path: str | Path, acquisition_datetime: datetime | str | None, acquisition_timezone: str | None, acquisition_datetime_source: str | None, allow_repair: bool) -> dict[str, Any]",
          "summary": "Validate embedded geometry and conservatively repair only a working H5.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Convert a supported georeferenced multiband reflectance TIFF and aligned ancillary inputs to the drone HDF5 contract.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.convert_drone_tiff_to_h5"
          ],
          "kind": "function",
          "line": 1742,
          "methods": [],
          "name": "convert_drone_tiff_to_h5",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reflectance_tiff_path"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_h5_path"
            },
            {
              "annotation": "Sequence[float] | np.ndarray | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "wavelengths_nm"
            },
            {
              "annotation": "Sequence[float] | np.ndarray | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "fwhm_nm"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensor_zenith_tiff"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensor_azimuth_tiff"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "slope_tiff"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "aspect_tiff"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "solar_zenith_tiff"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "solar_azimuth_tiff"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "solar_zenith_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "solar_azimuth_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensor_zenith_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensor_azimuth_deg"
            },
            {
              "annotation": "datetime | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "require_solar_geometry"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.pipelines.drone.convert_drone_tiff_to_h5",
          "signature": "convert_drone_tiff_to_h5(reflectance_tiff_path: str | Path, *, output_h5_path: str | Path, wavelengths_nm: Sequence[float] | np.ndarray | None=None, fwhm_nm: Sequence[float] | np.ndarray | None=None, sensor_zenith_tiff: str | Path | None=None, sensor_azimuth_tiff: str | Path | None=None, slope_tiff: str | Path | None=None, aspect_tiff: str | Path | None=None, solar_zenith_tiff: str | Path | None=None, solar_azimuth_tiff: str | Path | None=None, solar_zenith_deg: float | None=None, solar_azimuth_deg: float | None=None, sensor_zenith_deg: float | None=None, sensor_azimuth_deg: float | None=None, acquisition_datetime: datetime | str | None=None, require_solar_geometry: bool=False, overwrite: bool=False) -> Path",
          "summary": "Convert a supported georeferenced multiband reflectance TIFF and aligned ancillary inputs to the drone HDF5 contract.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1945,
          "methods": [],
          "name": "_prepare_drone_source_working_h5",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "source_type"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "working_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            },
            {
              "annotation": "Sequence[float] | np.ndarray | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "tiff_wavelengths_nm"
            },
            {
              "annotation": "Sequence[float] | np.ndarray | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "tiff_fwhm_nm"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "tiff_solar_zenith_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "tiff_solar_azimuth_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "tiff_sensor_zenith_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "tiff_sensor_azimuth_deg"
            },
            {
              "annotation": "datetime | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "acquisition_datetime"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "acquisition_timezone"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "acquisition_datetime_source"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "repair_solar_geometry"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "require_solar_geometry"
            }
          ],
          "path": "spectralbridge.pipelines.drone._prepare_drone_source_working_h5",
          "signature": "_prepare_drone_source_working_h5(source_path: str | Path, *, source_type: str, working_path: str | Path, overwrite: bool=False, tiff_wavelengths_nm: Sequence[float] | np.ndarray | None=None, tiff_fwhm_nm: Sequence[float] | np.ndarray | None=None, tiff_solar_zenith_deg: float | None=None, tiff_solar_azimuth_deg: float | None=None, tiff_sensor_zenith_deg: float | None=None, tiff_sensor_azimuth_deg: float | None=None, acquisition_datetime: datetime | str | None=None, acquisition_timezone: str | None=None, acquisition_datetime_source: str | None=None, repair_solar_geometry: bool=False, require_solar_geometry: bool=False) -> tuple[Path, bool]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Locate the reflectance cube for drone staging without relaxing NEON readers.\n\nThe drone pipeline prepares a run-owned working copy before instantiating\n``NeonCube`` so that the standard NEON reader can remain strict elsewhere.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2097,
          "methods": [],
          "name": "_find_drone_reflectance_dataset",
          "parameters": [
            {
              "annotation": "h5py.File",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_file"
            }
          ],
          "path": "spectralbridge.pipelines.drone._find_drone_reflectance_dataset",
          "signature": "_find_drone_reflectance_dataset(h5_file: h5py.File) -> h5py.Dataset",
          "summary": "Locate the reflectance cube for drone staging without relaxing NEON readers.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2147,
          "methods": [],
          "name": "_dataset_has_recognised_nodata",
          "parameters": [
            {
              "annotation": "h5py.Dataset",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dataset"
            }
          ],
          "path": "spectralbridge.pipelines.drone._dataset_has_recognised_nodata",
          "signature": "_dataset_has_recognised_nodata(dataset: h5py.Dataset) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Prepare a drone-owned HDF5 copy with fallback no-data metadata if needed.\n\nThis compatibility shim is intentionally local to the drone pipeline. It\nnever mutates the original source HDF5 and exists only to bridge drone\northomosaics into the existing strict NEON reader stack.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2151,
          "methods": [],
          "name": "_prepare_drone_h5_working_copy",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "working_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.pipelines.drone._prepare_drone_h5_working_copy",
          "signature": "_prepare_drone_h5_working_copy(h5_path: str | Path, *, working_path: str | Path, overwrite: bool=False) -> tuple[Path, bool]",
          "summary": "Prepare a drone-owned HDF5 copy with fallback no-data metadata if needed.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Map conceptual drone band names to nearest wavelength coordinates, recording selected indices and distances.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.resolve_band_map"
          ],
          "kind": "function",
          "line": 2182,
          "methods": [],
          "name": "resolve_band_map",
          "parameters": [
            {
              "annotation": "list[float] | np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "dict[str, int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            }
          ],
          "path": "spectralbridge.pipelines.drone.resolve_band_map",
          "signature": "resolve_band_map(wavelengths: list[float] | np.ndarray, targets: dict[str, int]) -> dict[str, dict[str, float | int]]",
          "summary": "Map conceptual drone band names to nearest wavelength coordinates, recording selected indices and distances.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validate minimally required drone H5 metadata and return a structured summary.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.validate_drone_h5_metadata"
          ],
          "kind": "function",
          "line": 2201,
          "methods": [],
          "name": "validate_drone_h5_metadata",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone.validate_drone_h5_metadata",
          "signature": "validate_drone_h5_metadata(h5_path: str | Path) -> dict[str, Any]",
          "summary": "Validate minimally required drone H5 metadata and return a structured summary.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Export a local H5 cube to ENVI using a drone-native filename stem.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.export_h5_to_envi"
          ],
          "kind": "function",
          "line": 2236,
          "methods": [],
          "name": "export_h5_to_envi",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "h5_path"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_stem"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "brightness_offset"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            },
            {
              "annotation": "NeonCube | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "cube"
            }
          ],
          "path": "spectralbridge.pipelines.drone.export_h5_to_envi",
          "signature": "export_h5_to_envi(h5_path: str | Path, *, output_stem: str | Path, brightness_offset: float=0.0, overwrite: bool=False, cube: NeonCube | None=None) -> tuple[Path, Path]",
          "summary": "Export a local H5 cube to ENVI using a drone-native filename stem.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Build the explicit local drone correction configuration from existing paths, wavelengths and correction flags.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.build_drone_config"
          ],
          "kind": "function",
          "line": 2317,
          "methods": [],
          "name": "build_drone_config",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "h5_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "envi_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "envi_hdr"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_hdr"
            },
            {
              "annotation": "list[float]",
              "default": null,
              "kind": "keyword-only",
              "name": "wavelengths"
            },
            {
              "annotation": "list[float] | None",
              "default": null,
              "kind": "keyword-only",
              "name": "fwhm"
            },
            {
              "annotation": "dict[str, dict[str, float | int]]",
              "default": null,
              "kind": "keyword-only",
              "name": "band_map"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "apply_topo"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "apply_brdf"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            }
          ],
          "path": "spectralbridge.pipelines.drone.build_drone_config",
          "signature": "build_drone_config(*, h5_path: Path, envi_img: Path, envi_hdr: Path, corrected_img: Path, corrected_hdr: Path, wavelengths: list[float], fwhm: list[float] | None, band_map: dict[str, dict[str, float | int]], apply_topo: bool, apply_brdf: bool, use_ndvi_brdf_bins: bool) -> dict[str, Any]",
          "summary": "Build the explicit local drone correction configuration from existing paths, wavelengths and correction flags.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2352,
          "methods": [],
          "name": "_has_required_ancillary",
          "parameters": [
            {
              "annotation": "NeonCube",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "names"
            }
          ],
          "path": "spectralbridge.pipelines.drone._has_required_ancillary",
          "signature": "_has_required_ancillary(cube: NeonCube, names: tuple[str, ...]) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2363,
          "methods": [],
          "name": "_chunk_has_any_valid_reflectance",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "chunk"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "keyword-only",
              "name": "no_data_value"
            }
          ],
          "path": "spectralbridge.pipelines.drone._chunk_has_any_valid_reflectance",
          "signature": "_chunk_has_any_valid_reflectance(chunk: np.ndarray, *, no_data_value: float | None) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Best-effort recovery of prior correction flags for reused drone outputs.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2374,
          "methods": [],
          "name": "_load_existing_drone_correction_flags",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corrected_stem"
            }
          ],
          "path": "spectralbridge.pipelines.drone._load_existing_drone_correction_flags",
          "signature": "_load_existing_drone_correction_flags(corrected_stem: Path) -> dict[str, bool]",
          "summary": "Best-effort recovery of prior correction flags for reused drone outputs.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Call ``func`` after dropping kwargs it does not declare.\n\nThe drone tests monkeypatch BRDF helpers with small lambdas that keep the\nhistorical signatures. Production helpers accept richer keyword options, so\nwe filter here to preserve backward compatibility for test doubles and other\nlightweight call sites.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2408,
          "methods": [],
          "name": "_call_with_supported_kwargs",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-only",
              "name": "func"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-positional",
              "name": "args"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-keyword",
              "name": "kwargs"
            }
          ],
          "path": "spectralbridge.pipelines.drone._call_with_supported_kwargs",
          "signature": "_call_with_supported_kwargs(func, /, *args, **kwargs)",
          "summary": "Call ``func`` after dropping kwargs it does not declare.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Apply optional topo/BRDF corrections to a drone ENVI export.\n\n``run_drone_pipeline`` now requests both topo and BRDF correction by\ndefault. Each correction still remains conditional on the required\nancillary geometry being available for the current cube.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2434,
          "methods": [],
          "name": "apply_drone_corrections",
          "parameters": [
            {
              "annotation": "NeonCube",
              "default": null,
              "kind": "keyword-only",
              "name": "cube"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "envi_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "envi_hdr"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_stem"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "apply_topo"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "apply_brdf"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.pipelines.drone.apply_drone_corrections",
          "signature": "apply_drone_corrections(*, cube: NeonCube, envi_img: Path, envi_hdr: Path, corrected_stem: Path, apply_topo: bool, apply_brdf: bool, use_ndvi_brdf_bins: bool=False, overwrite: bool=False) -> tuple[Path, Path, dict[str, Any]]",
          "summary": "Apply optional topo/BRDF corrections to a drone ENVI export.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2664,
          "methods": [],
          "name": "_write_json",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "payload"
            }
          ],
          "path": "spectralbridge.pipelines.drone._write_json",
          "signature": "_write_json(path: Path, payload: dict[str, Any]) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2670,
          "methods": [],
          "name": "_remove_file_if_exists",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._remove_file_if_exists",
          "signature": "_remove_file_if_exists(path: Path) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2678,
          "methods": [],
          "name": "_cleanup_envi_pair",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone._cleanup_envi_pair",
          "signature": "_cleanup_envi_pair(img_path: Path, hdr_path: Path) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2683,
          "methods": [],
          "name": "_write_drone_audit_json",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "file_audit"
            }
          ],
          "path": "spectralbridge.pipelines.drone._write_drone_audit_json",
          "signature": "_write_drone_audit_json(file_audit: dict[str, Any]) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2695,
          "methods": [],
          "name": "_normalise_bounds",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bounds"
            }
          ],
          "path": "spectralbridge.pipelines.drone._normalise_bounds",
          "signature": "_normalise_bounds(bounds: Any) -> list[float] | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2702,
          "methods": [],
          "name": "_normalise_transform",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "transform"
            }
          ],
          "path": "spectralbridge.pipelines.drone._normalise_transform",
          "signature": "_normalise_transform(transform: Any) -> list[float] | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2711,
          "methods": [],
          "name": "_crs_to_string",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "crs"
            }
          ],
          "path": "spectralbridge.pipelines.drone._crs_to_string",
          "signature": "_crs_to_string(crs: Any) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Collect drone-only raster/polygon overlay diagnostics before extraction.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.collect_drone_spatial_diagnostics"
          ],
          "kind": "function",
          "line": 2722,
          "methods": [],
          "name": "collect_drone_spatial_diagnostics",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raster_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "polygons_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone.collect_drone_spatial_diagnostics",
          "signature": "collect_drone_spatial_diagnostics(*, raster_img: Path, polygons_path: Path) -> dict[str, Any]",
          "summary": "Collect drone-only raster/polygon overlay diagnostics before extraction.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Write a lightweight overlay PNG for drone polygon/raster diagnostics.",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.drone.save_drone_overlay_debug_plot"
          ],
          "kind": "function",
          "line": 2787,
          "methods": [],
          "name": "save_drone_overlay_debug_plot",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "polygons_path"
            },
            {
              "annotation": "list[float] | tuple[float, float, float, float]",
              "default": null,
              "kind": "keyword-only",
              "name": "raster_bounds"
            },
            {
              "annotation": "str | None",
              "default": null,
              "kind": "keyword-only",
              "name": "raster_crs"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_path"
            }
          ],
          "path": "spectralbridge.pipelines.drone.save_drone_overlay_debug_plot",
          "signature": "save_drone_overlay_debug_plot(*, polygons_path: Path, raster_bounds: list[float] | tuple[float, float, float, float], raster_crs: str | None, output_path: Path) -> Path",
          "summary": "Write a lightweight overlay PNG for drone polygon/raster diagnostics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2846,
          "methods": [],
          "name": "_build_polygon_pixel_index_for_raster",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raster_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raster_hdr"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "polygons_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_id"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.pipelines.drone._build_polygon_pixel_index_for_raster",
          "signature": "_build_polygon_pixel_index_for_raster(*, raster_img: Path, raster_hdr: Path, polygons_path: Path, output_path: Path, flight_id: str, overwrite: bool=False) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2944,
          "methods": [],
          "name": "_merge_drone_polygon_outputs",
          "parameters": [
            {
              "annotation": "list[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "outputs"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.pipelines.drone._merge_drone_polygon_outputs",
          "signature": "_merge_drone_polygon_outputs(outputs: list[str], output_path: Path, overwrite: bool=False) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Attach polygon index metadata to each extracted drone pixel row.\n\nThe raw ENVI extraction step writes only the pixel-level spectral fields.\nFor downstream CSV review and modeling we want each pixel row to also carry\nthe polygon identifier and all non-geometry polygon attributes from the\nindex parquet. This helper rewrites the polygon parquet in-place so the\nenriched schema propagates to both the per-flight CSV and the merged output.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2969,
          "methods": [],
          "name": "_enrich_drone_polygon_parquet_with_index",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_parquet_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_index_path"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.pipelines.drone._enrich_drone_polygon_parquet_with_index",
          "signature": "_enrich_drone_polygon_parquet_with_index(polygon_parquet_path: Path, polygon_index_path: Path, *, overwrite: bool=True) -> Path",
          "summary": "Attach polygon index metadata to each extracted drone pixel row.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Write a CSV sidecar from an existing Parquet table for portability.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3035,
          "methods": [],
          "name": "_export_csv_copy_from_parquet",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "csv_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.pipelines.drone._export_csv_copy_from_parquet",
          "signature": "_export_csv_copy_from_parquet(parquet_path: Path, csv_path: Path | None=None, *, overwrite: bool=False) -> Path",
          "summary": "Write a CSV sidecar from an existing Parquet table for portability.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Attempt CSV sidecar export without blocking the main drone outputs.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3070,
          "methods": [],
          "name": "_try_export_csv_copy_from_parquet",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "csv_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "context_label"
            }
          ],
          "path": "spectralbridge.pipelines.drone._try_export_csv_copy_from_parquet",
          "signature": "_try_export_csv_copy_from_parquet(parquet_path: Path, csv_path: Path | None=None, *, overwrite: bool=False, context_label: str) -> tuple[Path | None, str | None]",
          "summary": "Attempt CSV sidecar export without blocking the main drone outputs.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3098,
          "methods": [],
          "name": "_drone_status_color",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "status"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_status_color",
          "signature": "_drone_status_color(status: str) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3110,
          "methods": [],
          "name": "_supports_ansi",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stream"
            }
          ],
          "path": "spectralbridge.pipelines.drone._supports_ansi",
          "signature": "_supports_ansi(stream: Any) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3114,
          "methods": [],
          "name": "_colorize_drone_message",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "message"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "status"
            }
          ],
          "path": "spectralbridge.pipelines.drone._colorize_drone_message",
          "signature": "_colorize_drone_message(message: str, *, status: str | None=None) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3123,
          "methods": [],
          "name": "_drone_emit",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "message"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "status"
            }
          ],
          "path": "spectralbridge.pipelines.drone._drone_emit",
          "signature": "_drone_emit(message: str, *, status: str | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3134,
          "methods": [],
          "name": "_format_elapsed",
          "parameters": [
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "seconds"
            }
          ],
          "path": "spectralbridge.pipelines.drone._format_elapsed",
          "signature": "_format_elapsed(seconds: float) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3144,
          "methods": [],
          "name": "_format_eta",
          "parameters": [
            {
              "annotation": "list[float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "elapsed_samples"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "remaining"
            }
          ],
          "path": "spectralbridge.pipelines.drone._format_eta",
          "signature": "_format_eta(elapsed_samples: list[float], remaining: int) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3151,
          "methods": [],
          "name": "_classify_drone_exception",
          "parameters": [
            {
              "annotation": "Exception",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "exc"
            }
          ],
          "path": "spectralbridge.pipelines.drone._classify_drone_exception",
          "signature": "_classify_drone_exception(exc: Exception) -> tuple[str, str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Separate scientific caution from successful pipeline execution.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3158,
          "methods": [],
          "name": "_scientific_qa_status",
          "parameters": [
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "file_audit"
            }
          ],
          "path": "spectralbridge.pipelines.drone._scientific_qa_status",
          "signature": "_scientific_qa_status(file_audit: Mapping[str, Any]) -> str",
          "summary": "Separate scientific caution from successful pipeline execution.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3175,
          "methods": [],
          "name": "_has_drone_qa_inputs",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "file_audit"
            }
          ],
          "path": "spectralbridge.pipelines.drone._has_drone_qa_inputs",
          "signature": "_has_drone_qa_inputs(file_audit: dict[str, Any]) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Demote flights missing requested artifacts before counting success.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3181,
          "methods": [],
          "name": "_reconcile_drone_completion",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "results"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "extraction_mode"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "apply_topo"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "apply_brdf"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "apply_translation"
            },
            {
              "annotation": "bool | None",
              "default": null,
              "kind": "keyword-only",
              "name": "report_valid"
            }
          ],
          "path": "spectralbridge.pipelines.drone._reconcile_drone_completion",
          "signature": "_reconcile_drone_completion(results: dict[str, Any], *, output_dir: Path, extraction_mode: str, apply_topo: bool, apply_brdf: bool, apply_translation: bool, report_valid: bool | None) -> dict[str, int]",
          "summary": "Demote flights missing requested artifacts before counting success.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Run the drone pipeline from local HDF5 or reflectance TIFF sources.\n\nParameters\n----------\ninput_h5_dir : str | Path\n    Existing local supported HDF5/TIFF file or directory; discovery recurses through source packages.\npolygon_path : str | Path | None, default=None\n    Existing polygon vector dataset for extraction; coordinates are handled by the established polygon workflow.\noutput_dir : str | Path, default='.'\n    Directory for generated products; bulk outputs must be outside the read-only input tree.\napply_topo : bool, default=True\n    Enable the existing topographic correction when required terrain/geometry metadata are available.\napply_brdf : bool, default=True\n    Enable the existing BRDF correction when required angular metadata are available.\nuse_ndvi_brdf_bins : bool, default=False\n    Opt into the existing NDVI-stratified BRDF fitting behavior rather than the default fit.\napply_brightness_adjustment : bool, default=False\n    Opt into the established brightness adjustment; does not change the packaged coefficients.\noverwrite : bool, default=False\n    Replace existing requested products; False preserves reusable products or rejects a conflicting destination.\ntiff_wavelengths_nm : Sequence[float] | np.ndarray | None, default=None\n    Explicit per-band center wavelengths in nanometers for TIFF inputs lacking embedded spectral metadata; must match band order/count.\ntiff_fwhm_nm : Sequence[float] | np.ndarray | None, default=None\n    Per-band full widths at half maximum in nanometers, aligned with TIFF bands; None uses supported metadata.\ntiff_solar_zenith_deg : float | None, default=None\n    Explicit TIFF solar zenith in degrees when valid embedded metadata are unavailable.\ntiff_solar_azimuth_deg : float | None, default=None\n    Explicit TIFF solar azimuth in degrees when valid embedded metadata are unavailable.\ntiff_sensor_zenith_deg : float | None, default=None\n    Explicit TIFF view zenith in degrees when valid embedded metadata are unavailable.\ntiff_sensor_azimuth_deg : float | None, default=None\n    Explicit TIFF view azimuth in degrees when valid embedded metadata are unavailable.\ndrone_manifest_path : str | Path | None, default=None\n    Existing flight manifest providing acquisition identity/time; None uses supported discovery or embedded metadata.\ndrone_manifest_timezone : str | None, default='UTC'\n    Timezone used to interpret manifest acquisition times; the default is UTC.\nrequire_solar_geometry : bool, default=True\n    Require scientifically usable solar geometry before correction rather than silently proceeding without it.\nextraction_mode : str | None, default=None\n    'full' writes pixel Parquet, 'polygon' requires polygons; None preserves the entry point's documented default extraction behavior.\nparquet_chunk_size : int, default=2048\n    Positive pixel/window processing budget for bounded extraction; the default and interpretation follow the selected producer.\nmerge_extractions : bool, default=False\n    Explicit opt-in to legacy campaign-wide pixel-table merging; normal bulk consumers use separate completed flights.\napply_translation : bool, default=False\n    Create separate Landsat-like application products using the reviewed coefficient registry; does not overwrite corrected native MicaSense.\ntranslation_coefficients : str | Path | None, default=None\n    Optional reviewed registry JSON path; None uses the packaged static coefficient set.\ntranslation_weighting : str | None, default=None\n    Optional reviewed weighting selection; normal production uses the predetermined site-balanced weighting.\ntranslation_strict : bool, default=False\n    Treat unsupported/flagged translation conditions as blocking rather than returning the configured non-strict status.\nlandsat_qa : bool, default=False\n    Enable actual Landsat comparison QA for translated products; requires apply_translation=True and appropriate data/dependencies.\nlandsat_product : str | Path | None, default=None\n    Optional existing actual Landsat product for independent comparison; None permits the documented search path.\nlandsat_search_days : int, default=16\n    Nonnegative acquisition-date search radius in days for actual Landsat comparison.\ncomparison_neon_product : str | Path | None, default=None\n    Optional independent NEON product for common-support comparison QA.\nraise_on_incomplete : bool, default=True\n    Raise DronePipelineIncompleteError when flights fail or are scientifically blocked; its results attribute retains structured status.\nsolar_qa_timezone : str | None, default=None\n    Optional timezone override for solar-geometry QA; None follows the existing metadata/timezone resolution.\n\nReturns\n-------\ndict[str, Any]\n    Per-flight processed/reused/failed/blocked outcomes and QA/output paths; incomplete runs normally raise with this payload attached.\n\nRaises\n------\nDroneCorrectionUnavailableError\n    If scientifically required correction inputs cannot be validated.\nDronePipelineIncompleteError\n    If any requested flight is incomplete and raise_on_incomplete is True; inspect the attached results.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\n``extraction_mode=\"full\"`` writes a full-pixel Parquet table from the\ncorrected drone ENVI product. ``\"polygon\"`` uses ``polygon_path`` and the\nexisting polygon extraction path. The default preserves historical\nbehavior: polygon mode when polygons are supplied, otherwise QA-only.\nPer-flight extraction products remain separate by default;\n``merge_extractions=True`` opts into legacy campaign-wide pixel-table\nmaterialization. Bulk analysis does not require that merge.\nTranslation is opt-in and consumes a versioned packaged registry by default,\nor an explicitly supplied reviewed bulk artifact. The predetermined\nproduction weighting is site-balanced. It creates separate Landsat-like\nproducts; corrected native MicaSense is never overwritten.\nBy default an incomplete run raises :class:`DronePipelineIncompleteError`\nwith the structured result available as ``exc.results``.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\nRequires an existing supported source tree with usable spectral/spatial/solar metadata. Choose a separate output directory.\n\n>>> from spectralbridge import run_drone_pipeline\n>>> result = run_drone_pipeline(input_h5_dir=source_dir, output_dir=output_dir)  # doctest: +SKIP",
          "examples": [
            "examples/release_candidate_smoke.py",
            "examples/run_drone_pipeline.py"
          ],
          "exports": [
            "spectralbridge.run_drone_pipeline",
            "spectralbridge.pipelines.run_drone_pipeline",
            "spectralbridge.pipelines.drone.run_drone_pipeline"
          ],
          "kind": "function",
          "line": 3298,
          "methods": [],
          "name": "run_drone_pipeline",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_h5_dir"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "polygon_path"
            },
            {
              "annotation": "str | Path",
              "default": "'.'",
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "apply_topo"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "apply_brdf"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "apply_brightness_adjustment"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "overwrite"
            },
            {
              "annotation": "Sequence[float] | np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "tiff_wavelengths_nm"
            },
            {
              "annotation": "Sequence[float] | np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "tiff_fwhm_nm"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "tiff_solar_zenith_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "tiff_solar_azimuth_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "tiff_sensor_zenith_deg"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "tiff_sensor_azimuth_deg"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "drone_manifest_path"
            },
            {
              "annotation": "str | None",
              "default": "'UTC'",
              "kind": "positional-or-keyword",
              "name": "drone_manifest_timezone"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "require_solar_geometry"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "extraction_mode"
            },
            {
              "annotation": "int",
              "default": "2048",
              "kind": "positional-or-keyword",
              "name": "parquet_chunk_size"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "merge_extractions"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "apply_translation"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "translation_coefficients"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "translation_weighting"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "translation_strict"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "landsat_qa"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "landsat_product"
            },
            {
              "annotation": "int",
              "default": "16",
              "kind": "positional-or-keyword",
              "name": "landsat_search_days"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "comparison_neon_product"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "raise_on_incomplete"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "solar_qa_timezone"
            }
          ],
          "path": "spectralbridge.pipelines.drone.run_drone_pipeline",
          "signature": "run_drone_pipeline(input_h5_dir: str | Path, polygon_path: str | Path | None=None, output_dir: str | Path='.', apply_topo: bool=True, apply_brdf: bool=True, use_ndvi_brdf_bins: bool=False, apply_brightness_adjustment: bool=False, overwrite: bool=False, tiff_wavelengths_nm: Sequence[float] | np.ndarray | None=None, tiff_fwhm_nm: Sequence[float] | np.ndarray | None=None, tiff_solar_zenith_deg: float | None=None, tiff_solar_azimuth_deg: float | None=None, tiff_sensor_zenith_deg: float | None=None, tiff_sensor_azimuth_deg: float | None=None, drone_manifest_path: str | Path | None=None, drone_manifest_timezone: str | None='UTC', require_solar_geometry: bool=True, extraction_mode: str | None=None, parquet_chunk_size: int=2048, merge_extractions: bool=False, apply_translation: bool=False, translation_coefficients: str | Path | None=None, translation_weighting: str | None=None, translation_strict: bool=False, landsat_qa: bool=False, landsat_product: str | Path | None=None, landsat_search_days: int=16, comparison_neon_product: str | Path | None=None, raise_on_incomplete: bool=True, solar_qa_timezone: str | None=None) -> dict[str, Any]",
          "summary": "Run the drone pipeline from local HDF5 or reflectance TIFF sources.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/pipelines/drone.py",
      "sha256": "a0c60926f80e279071856dab5153b6bfebec3ac54eb208023e72998fdbb4c743"
    },
    {
      "area": "pipelines",
      "constants": [],
      "declared_exports": [],
      "docstring": "cross_sensor_cal.pipelines.pipeline\n-----------------------------------\n\nUpdated October 2025\n\nThis module implements the core single-flightline and multi-flightline processing pipeline\nfor NEON hyperspectral flight lines. The pipeline is now:\n\n    1. ENVI export from NEON .h5\n    2. BRDF/topo correction parameter JSON build\n    3. BRDF + topographic correction\n    4. Sensor convolution/resampling\n    5. Parquet export for every ENVI reflectance product\n    6. DuckDB merge of original/corrected/resampled Parquet tables\n\nKey guarantees:\n- The stages ALWAYS run in the order above.\n- Convolution/resampling ALWAYS uses the BRDF+topo corrected ENVI product\n  (<flight_stem>_brdfandtopo_corrected_envi.img/.hdr), never the raw .h5.\n- Each stage is idempotent:\n    * If valid outputs already exist, that stage logs \"\u2705 ... skipping\" and returns.\n    * If outputs are missing or corrupted, that stage recomputes them.\n- The pipeline is restart-safe. You can rerun go_forth_and_multiply() after an interruption\n  and it will resume where it left off without recomputing successfully completed work.\n- All file naming and file locations are defined centrally by get_flightline_products().\n  Stages do not hardcode filenames directly.\n\nTypical usage:\n\n    from pathlib import Path\n    from cross_sensor_cal.pipelines.pipeline import go_forth_and_multiply\n\n    go_forth_and_multiply(\n        base_folder=Path(\"output_tester\"),\n        site_code=\"NIWO\",\n        year_month=\"2023-08\",\n        flight_lines=[\n            \"NEON_D13_NIWO_DP1_L019-1_20230815_directional_reflectance\",\n            \"NEON_D13_NIWO_DP1_L020-1_20230815_directional_reflectance\",\n        ],\n    )\n\nLogs will include messages like:\n    \"\ud83d\udd0e ENVI export target for ... is <stem>_envi.img / <stem>_envi.hdr\"\n    \"\u2705 ENVI export already complete ... (skipping heavy export)\"\n    \"\u2705 BRDF+topo correction already complete ... (skipping)\"\n    \"\ud83c\udfaf Convolving corrected reflectance for ...\"\n    \"\ud83c\udf89 Finished pipeline for <flight_stem>\"\n\nThese logs confirm both correct ordering and skip behavior.",
      "export_expressions": [],
      "imports": {
        "Any": "typing.Any",
        "FlightlinePaths": "spectralbridge.paths.FlightlinePaths",
        "Literal": "typing.Literal",
        "NEONReflectanceBRDFCorrectedENVIFile": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIFile",
        "NEONReflectanceENVIFile": "spectralbridge.file_types.NEONReflectanceENVIFile",
        "NEONReflectanceResampledENVIFile": "spectralbridge.file_types.NEONReflectanceResampledENVIFile",
        "NamedTuple": "typing.NamedTuple",
        "Path": "pathlib.Path",
        "ProcessPoolExecutor": "concurrent.futures.ProcessPoolExecutor",
        "Sequence": "typing.Sequence",
        "ThreadPoolExecutor": "concurrent.futures.ThreadPoolExecutor",
        "TileProgressReporter": "spectralbridge.progress_utils.TileProgressReporter",
        "_Path": "pathlib.Path",
        "_ensure_parquet": "spectralbridge.parquet_export.ensure_parquet_for_envi",
        "_filter_no_data_rows_from_parquet": "spectralbridge.merge_duckdb._filter_no_data_rows_from_parquet",
        "_quote_path": "spectralbridge.merge_duckdb._quote_path",
        "_ray_map": "spectralbridge._ray_utils.ray_map",
        "annotations": "__future__.annotations",
        "apply_brdf_topo_core": "spectralbridge.brdf_topo.apply_brdf_topo_core",
        "as_completed": "concurrent.futures.as_completed",
        "build_correction_parameters_dict": "spectralbridge.brdf_topo.build_correction_parameters_dict",
        "build_polygon_pixel_index": "spectralbridge.polygons.build_polygon_pixel_index",
        "clean_memory": "spectralbridge.utils.memory.clean_memory",
        "collect_issues": "spectralbridge.parquet_validation.collect_issues",
        "contextmanager": "contextlib.contextmanager",
        "control_function_for_extraction": "spectralbridge.polygon_extraction.control_function_for_extraction",
        "create_dummy_polygon": "spectralbridge.polygons.create_dummy_polygon",
        "download_neon_file": "spectralbridge.envi_download.download_neon_file",
        "emit_stage_qa": "spectralbridge.qa.emit_stage_qa",
        "ensure_parquet_for_envi": "spectralbridge.parquet_export.ensure_parquet_for_envi",
        "extract_all_polygon_parquets_from_envi": "spectralbridge.polygons.extract_all_polygon_parquets_from_envi",
        "extract_polygon_parquets_for_flightline": "spectralbridge.polygons.extract_polygon_parquets_for_flightline",
        "filter_polygons_by_overlap": "spectralbridge.polygons.filter_polygons_by_overlap",
        "generate_file_move_list": "spectralbridge.file_sort.generate_file_move_list",
        "get_flightline_products": "spectralbridge.utils.naming.get_flightline_products",
        "get_package_data_path": "spectralbridge.utils.get_package_data_path",
        "half_flight_id": "spectralbridge.half_flight.half_flight_id",
        "is_valid_json": "spectralbridge.utils_checks.is_valid_json",
        "load_brightness_coefficients": "spectralbridge.brightness_config.load_brightness_coefficients",
        "make_micasense_vs_landsat_panels": "spectralbridge.sensor_panel_plots.make_micasense_vs_landsat_panels",
        "make_sensor_vs_neon_panels": "spectralbridge.sensor_panel_plots.make_sensor_vs_neon_panels",
        "mask_raster_with_polygons": "spectralbridge.mask_raster.mask_raster_with_polygons",
        "merge_flightline": "spectralbridge.merge_duckdb.merge_flightline",
        "merge_polygon_parquets_for_flightline": "spectralbridge.polygons.merge_polygon_parquets_for_flightline",
        "neon_to_envi_no_hytools": "spectralbridge.neon_to_envi.neon_to_envi_no_hytools",
        "normalize_brdf_model_path": "spectralbridge.paths.normalize_brdf_model_path",
        "plan_half_flight": "spectralbridge.half_flight.plan_half_flight",
        "render_flightline_panel": "spectralbridge.qa_plots.render_flightline_panel",
        "resample_chunk_to_sensor": "spectralbridge.resample.resample_chunk_to_sensor",
        "resolve": "spectralbridge.io.neon_schema.resolve",
        "run_completed_flightline_qa": "spectralbridge.qa.run_completed_flightline_qa",
        "tqdm": "tqdm.tqdm",
        "translate_to_other_sensors": "spectralbridge.standard_resample.translate_to_other_sensors",
        "visualize_polygons_on_envi": "spectralbridge.polygons.visualize_polygons_on_envi"
      },
      "module": "spectralbridge.pipelines.pipeline",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Lazy proxy to the shared Ray helper.\n\nKeeping this symbol at module scope preserves the public/test-facing API\nwithout importing Ray until the helper is actually used.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 165,
          "methods": [],
          "name": "ray_map",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "func"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "iterable"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "num_cpus"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.ray_map",
          "signature": "ray_map(func, iterable, *, num_cpus=None)",
          "summary": "Lazy proxy to the shared Ray helper.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Rename and cast Parquet tables to the canonical schema.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 222,
          "methods": [],
          "name": "_to_canonical_table",
          "parameters": [
            {
              "annotation": "pa.Table",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "tbl"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._to_canonical_table",
          "signature": "_to_canonical_table(tbl: pa.Table) -> pa.Table",
          "summary": "Rename and cast Parquet tables to the canonical schema.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 311,
          "methods": [],
          "name": "_env_flag",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._env_flag",
          "signature": "_env_flag(name: str) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Temporarily wrap module logger methods to prefix messages.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 326,
          "methods": [],
          "name": "_scoped_log_prefix",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._scoped_log_prefix",
          "signature": "_scoped_log_prefix(prefix: str)",
          "summary": "Temporarily wrap module logger methods to prefix messages.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a short, readable label for a flight line (prefer the tile like L019-1).\nFalls back to the original string if no tile pattern found.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 354,
          "methods": [],
          "name": "_pretty_line",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "line"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._pretty_line",
          "signature": "_pretty_line(line: str) -> str",
          "summary": "Return a short, readable label for a flight line (prefer the tile like L019-1).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Print a human-readable message without mangling tqdm bars.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 364,
          "methods": [],
          "name": "_emit",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "msg"
            },
            {
              "annotation": "dict[str, tqdm] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bars"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "keyword-only",
              "name": "verbose"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._emit",
          "signature": "_emit(msg: str, bars: dict[str, tqdm] | None, *, verbose: bool) -> None",
          "summary": "Print a human-readable message without mangling tqdm bars.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Emit a friendly skip line when expected outputs already exist.\n\nscope: optional short context like a tile id (e.g., L019-1)",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 380,
          "methods": [],
          "name": "_warn_skip_exists",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "step"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "targets"
            },
            {
              "annotation": "bool",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "verbose"
            },
            {
              "annotation": "dict[str, tqdm] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "bars"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "scope"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._warn_skip_exists",
          "signature": "_warn_skip_exists(step: str, targets, verbose: bool, bars: dict[str, tqdm] | None=None, scope: str | None=None) -> None",
          "summary": "Emit a friendly skip line when expected outputs already exist.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Guidance appended to exceptions to hint at corrupt/stale artifacts.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 408,
          "methods": [],
          "name": "_stale_hint",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "step"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._stale_hint",
          "signature": "_stale_hint(step: str) -> str",
          "summary": "Guidance appended to exceptions to hint at corrupt/stale artifacts.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 417,
          "methods": [],
          "name": "_belongs_to",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "line"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path_obj"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._belongs_to",
          "signature": "_belongs_to(line: str, path_obj: Path) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 422,
          "methods": [],
          "name": "_safe_total",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "total"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._safe_total",
          "signature": "_safe_total(total: int) -> int",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return True iff both main and ancillary ENVI outputs for flight line exist.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 426,
          "methods": [],
          "name": "_line_outputs_present",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_line"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._line_outputs_present",
          "signature": "_line_outputs_present(base: Path, flight_line: str) -> bool",
          "summary": "Return True iff both main and ancillary ENVI outputs for flight line exist.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Tick the download slot for a flight line once at least one matching .h5 exists.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 447,
          "methods": [],
          "name": "_tick_download_slot",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_line"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "tick_cb"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._tick_download_slot",
          "signature": "_tick_download_slot(base: Path, flight_line: str, tick_cb) -> None",
          "summary": "Tick the download slot for a flight line once at least one matching .h5 exists.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "A text stream that drops lines matching noise patterns; tee others to a sink.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 473,
          "methods": [
            {
              "docstring": "",
              "line": 476,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "sink"
                },
                {
                  "annotation": "bool",
                  "default": "True",
                  "kind": "positional-or-keyword",
                  "name": "keep_saved"
                }
              ],
              "private": true,
              "signature": "__init__(self, sink, keep_saved: bool=True) -> None"
            },
            {
              "docstring": "",
              "line": 481,
              "name": "write",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "s"
                }
              ],
              "private": false,
              "signature": "write(self, s: str) -> None"
            },
            {
              "docstring": "",
              "line": 501,
              "name": "flush",
              "parameters": [],
              "private": false,
              "signature": "flush(self) -> None"
            },
            {
              "docstring": "",
              "line": 510,
              "name": "_emit",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "text"
                }
              ],
              "private": true,
              "signature": "_emit(self, text: str) -> None"
            },
            {
              "docstring": "",
              "line": 525,
              "name": "_is_noise",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "line"
                }
              ],
              "private": true,
              "signature": "_is_noise(self, line: str) -> bool"
            }
          ],
          "name": "_FilterStream",
          "parameters": [],
          "path": "spectralbridge.pipelines.pipeline._FilterStream",
          "signature": null,
          "summary": "A text stream that drops lines matching noise patterns; tee others to a sink.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Context manager to silence noisy third-party output when enabled=True.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 532,
          "methods": [],
          "name": "_silence_noise",
          "parameters": [
            {
              "annotation": "bool",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "enabled"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._silence_noise",
          "signature": "_silence_noise(enabled: bool)",
          "summary": "Context manager to silence noisy third-party output when enabled=True.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return ``True`` when both ENVI files exist and are non-empty.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 553,
          "methods": [],
          "name": "is_valid_envi_pair",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.is_valid_envi_pair",
          "signature": "is_valid_envi_pair(img_path: Path, hdr_path: Path) -> bool",
          "summary": "Return ``True`` when both ENVI files exist and are non-empty.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Stage: Parquet export for ENVI reflectance products.\n\nReturns the list of Parquet sidecars that exist (either newly written or\npreviously present and validated).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 572,
          "methods": [],
          "name": "_export_parquet_stage",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_stem"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "parquet_chunk_size"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "logger"
            },
            {
              "annotation": "int | None",
              "default": null,
              "kind": "keyword-only",
              "name": "ray_cpus"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._export_parquet_stage",
          "signature": "_export_parquet_stage(*, base_folder: Path, product_code: str, flight_stem: str, parquet_chunk_size: int, logger, ray_cpus: int | None) -> list[Path]",
          "summary": "Stage: Parquet export for ENVI reflectance products.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 670,
          "methods": [],
          "name": "_coerce_scalar",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._coerce_scalar",
          "signature": "_coerce_scalar(value: str)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 685,
          "methods": [],
          "name": "_parse_envi_header",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._parse_envi_header",
          "signature": "_parse_envi_header(hdr_path: Path) -> dict",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 769,
          "methods": [],
          "name": "_format_envi_scalar",
          "parameters": [
            {
              "annotation": "object",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._format_envi_scalar",
          "signature": "_format_envi_scalar(value: object) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 777,
          "methods": [],
          "name": "_format_envi_value",
          "parameters": [
            {
              "annotation": "object",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._format_envi_value",
          "signature": "_format_envi_value(value: object) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 791,
          "methods": [],
          "name": "_build_resample_header_text",
          "parameters": [
            {
              "annotation": "dict",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._build_resample_header_text",
          "signature": "_build_resample_header_text(header: dict) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 799,
          "methods": [],
          "name": "_with_undarkened_suffix",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_stem"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._with_undarkened_suffix",
          "signature": "_with_undarkened_suffix(out_stem: Path) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 808,
          "methods": [],
          "name": "_build_convolution_header",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "samples"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "lines"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "out_bands"
            },
            {
              "annotation": "list[str]",
              "default": null,
              "kind": "keyword-only",
              "name": "sensor_band_names"
            },
            {
              "annotation": "dict",
              "default": null,
              "kind": "keyword-only",
              "name": "src_header"
            },
            {
              "annotation": "dict[str, dict[int, float]] | None",
              "default": null,
              "kind": "keyword-only",
              "name": "brightness_map"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._build_convolution_header",
          "signature": "_build_convolution_header(*, samples: int, lines: int, out_bands: int, sensor_band_names: list[str], src_header: dict, brightness_map: dict[str, dict[int, float]] | None) -> dict",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 845,
          "methods": [],
          "name": "_sensor_requires_landsat_adjustment",
          "parameters": [
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_name"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._sensor_requires_landsat_adjustment",
          "signature": "_sensor_requires_landsat_adjustment(sensor_name: str | None) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Adjust Landsat-convolved cube brightness relative to MicaSense.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 852,
          "methods": [],
          "name": "_apply_landsat_brightness_adjustment",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "str",
              "default": "'landsat_to_micasense'",
              "kind": "positional-or-keyword",
              "name": "system_pair"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "nodata_value"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._apply_landsat_brightness_adjustment",
          "signature": "_apply_landsat_brightness_adjustment(cube: np.ndarray, system_pair: str='landsat_to_micasense', *, nodata_value: float | None=None) -> dict[int, float]",
          "summary": "Adjust Landsat-convolved cube brightness relative to MicaSense.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Stream a corrected BSQ cube through supplied spectral-response weights into canonical target-sensor products.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 892,
          "methods": [],
          "name": "convolve_resample_product",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corrected_hdr_path"
            },
            {
              "annotation": "dict[str, np.ndarray]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_srf"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_stem_resampled"
            },
            {
              "annotation": "int",
              "default": "100",
              "kind": "positional-or-keyword",
              "name": "tile_y"
            },
            {
              "annotation": "int",
              "default": "100",
              "kind": "positional-or-keyword",
              "name": "tile_x"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "progress_label"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "interactive_mode"
            },
            {
              "annotation": "int",
              "default": "25",
              "kind": "keyword-only",
              "name": "log_every"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensor_name"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "brightness_system_pair"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.convolve_resample_product",
          "signature": "convolve_resample_product(corrected_hdr_path: Path, sensor_srf: dict[str, np.ndarray], out_stem_resampled: Path, tile_y: int=100, tile_x: int=100, progress_label: str | None=None, *, interactive_mode: bool=True, log_every: int=25, sensor_name: str | None=None, brightness_system_pair: str | None=None) -> dict[str, dict[int, float]]",
          "summary": "Stream a corrected BSQ cube through supplied spectral-response weights into canonical target-sensor products.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the numeric component of a DP1 product code.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1075,
          "methods": [],
          "name": "_normalize_product_code",
          "parameters": [
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._normalize_product_code",
          "signature": "_normalize_product_code(value: str | None) -> str",
          "summary": "Return the numeric component of a DP1 product code.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Locate the NEON HDF5 file corresponding to *flight_stem*.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1097,
          "methods": [],
          "name": "_find_h5_for_flightline",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._find_h5_for_flightline",
          "signature": "_find_h5_for_flightline(base_folder: Path, flight_stem: str) -> Path",
          "summary": "Locate the NEON HDF5 file corresponding to *flight_stem*.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Load the spectral response functions used for convolution.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1129,
          "methods": [],
          "name": "_load_sensor_library",
          "parameters": [],
          "path": "spectralbridge.pipelines.pipeline._load_sensor_library",
          "signature": "_load_sensor_library() -> dict[str, dict[str, list[float]]]",
          "summary": "Load the spectral response functions used for convolution.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1156,
          "methods": [],
          "name": "_build_sensor_srfs",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "Sequence[float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "centers"
            },
            {
              "annotation": "Sequence[float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fwhm"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "method"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._build_sensor_srfs",
          "signature": "_build_sensor_srfs(wavelengths: np.ndarray, centers: Sequence[float], fwhm: Sequence[float], method: str) -> dict[str, np.ndarray]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1190,
          "methods": [],
          "name": "_prepare_sensor_targets",
          "parameters": [
            {
              "annotation": "NEONReflectanceBRDFCorrectedENVIFile",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_file"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_hdr_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "resample_method"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_code"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._prepare_sensor_targets",
          "signature": "_prepare_sensor_targets(*, corrected_file: NEONReflectanceBRDFCorrectedENVIFile, corrected_hdr_path: Path, resample_method: str, product_code: str) -> tuple[dict[str, dict[str, np.ndarray]], dict[str, Path]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [
            "docs/reference/extending.md"
          ],
          "docstring": "Resolve ``sensor_name`` within ``sensor_library`` while tolerating unknown sensors.\n\nReturns the matching (key, entry) if found, otherwise ``(None, None)``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1260,
          "methods": [],
          "name": "_safe_resolve_sensor_entry",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_name"
            },
            {
              "annotation": "dict[str, dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_library"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._safe_resolve_sensor_entry",
          "signature": "_safe_resolve_sensor_entry(sensor_name: str, sensor_library: dict[str, dict[str, Any]]) -> tuple[str | None, dict[str, Any] | None]",
          "summary": "Resolve ``sensor_name`` within ``sensor_library`` while tolerating unknown sensors.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Construct target-band response weights from source wavelength metadata and a registered sensor specification.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1311,
          "methods": [],
          "name": "resample_to_sensor_bands",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_hdr_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "sensor_name"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "method"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensor_entry"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "resolved_name"
            },
            {
              "annotation": "dict[str, dict[str, Any]] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensor_library"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.resample_to_sensor_bands",
          "signature": "resample_to_sensor_bands(*, corrected_img_path: Path, corrected_hdr_path: Path, sensor_name: str, method: str, sensor_entry: dict[str, Any] | None=None, resolved_name: str | None=None, sensor_library: dict[str, dict[str, Any]] | None=None) -> dict[str, np.ndarray]",
          "summary": "Construct target-band response weights from source wavelength metadata and a registered sensor specification.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Delegate target-response convolution and writing using the canonical sensor output stem.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1369,
          "methods": [],
          "name": "write_resampled_product",
          "parameters": [
            {
              "annotation": "dict[str, np.ndarray]",
              "default": null,
              "kind": "keyword-only",
              "name": "arr"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "out_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "sensor_name"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_stem"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_hdr_path"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "interactive_mode"
            },
            {
              "annotation": "int",
              "default": "25",
              "kind": "keyword-only",
              "name": "log_every"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.write_resampled_product",
          "signature": "write_resampled_product(*, arr: dict[str, np.ndarray], out_path: Path, sensor_name: str, flight_stem: str, corrected_hdr_path: Path, interactive_mode: bool=True, log_every: int=25) -> dict[str, dict[int, float]]",
          "summary": "Delegate target-response convolution and writing using the canonical sensor output stem.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Persist a resampled sensor bandstack to ENVI ``.img``/``.hdr`` files.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1394,
          "methods": [],
          "name": "write_resampled_envi_cube",
          "parameters": [
            {
              "annotation": "dict[str, np.ndarray]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bandstack_array"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_hdr_path"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "progress_label"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "interactive_mode"
            },
            {
              "annotation": "int",
              "default": "25",
              "kind": "keyword-only",
              "name": "log_every"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sensor_name"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.write_resampled_envi_cube",
          "signature": "write_resampled_envi_cube(bandstack_array: dict[str, np.ndarray], img_path: Path, hdr_path: Path, *, corrected_hdr_path: Path, progress_label: str | None=None, interactive_mode: bool=True, log_every: int=25, sensor_name: str | None=None) -> dict[str, dict[int, float]]",
          "summary": "Persist a resampled sensor bandstack to ENVI ``.img``/``.hdr`` files.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Ensure ``<base_folder>/<flight_stem>.h5`` exists and is non-empty.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1447,
          "methods": [],
          "name": "stage_download_h5",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "site_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "year_month"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.stage_download_h5",
          "signature": "stage_download_h5(base_folder: Path, site_code: str, year_month: str, product_code: str, flight_stem: str) -> Path",
          "summary": "Ensure ``<base_folder>/<flight_stem>.h5`` exists and is non-empty.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Ensure we have the uncorrected ENVI export (.img/.hdr) for this flightline.\n\nReturns\n-------\n(raw_img_path, raw_hdr_path)\n\nBehavior\n--------\n1. Compute the canonical raw ENVI paths inside the per-flightline work directory.\n2. If those paths already exist and validate, SKIP heavy export immediately.\n   This prevents re-loading huge (>20 GB) hyperspectral cubes on reruns.\n3. Otherwise, run neon_to_envi_no_hytools() ONE TIME to generate ENVI.\n4. After export, if the canonical paths STILL aren't valid, raise RuntimeError\n   that includes a diff of which new files appeared. That diff is then used to\n   correct get_flightline_products(), so on the next run we really will skip.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1517,
          "methods": [],
          "name": "stage_export_envi_from_h5",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "brightness_offset"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "parallel_mode"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "recover_missing_raw"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "source_h5"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_start"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_stop"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "line_start"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "line_stop"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.stage_export_envi_from_h5",
          "signature": "stage_export_envi_from_h5(base_folder: Path, product_code: str, flight_stem: str, brightness_offset: float | None=None, *, parallel_mode: bool=False, recover_missing_raw: bool=True, source_h5: Path | str | None=None, sample_start: int | None=None, sample_stop: int | None=None, line_start: int | None=None, line_stop: int | None=None) -> tuple[Path, Path]",
          "summary": "Ensure we have the uncorrected ENVI export (.img/.hdr) for this flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Compute + persist BRDF/topo correction parameters (illumination geometry, slope/aspect,\nBRDF coefficients, etc.) before applying correction.\n\nWrites the canonical correction JSON, returns its path.\nSkips if valid.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1751,
          "methods": [],
          "name": "stage_build_and_write_correction_json",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_stem"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_hdr_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "parallel_mode"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "source_h5"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_start"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_stop"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "line_start"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "line_stop"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.stage_build_and_write_correction_json",
          "signature": "stage_build_and_write_correction_json(*, base_folder: Path, product_code: str, flight_stem: str, raw_img_path: Path, raw_hdr_path: Path, use_ndvi_brdf_bins: bool=False, parallel_mode: bool=False, source_h5: Path | str | None=None, sample_start: int | None=None, sample_stop: int | None=None, line_start: int | None=None, line_stop: int | None=None) -> Path",
          "summary": "Compute + persist BRDF/topo correction parameters (illumination geometry, slope/aspect,",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Apply BRDF + topographic correction using the precomputed JSON.\nProduces the canonical corrected ENVI:\n    *_brdfandtopo_corrected_envi.img/.hdr\n\nReturns (corrected_img_path, corrected_hdr_path).\nSkips if already valid.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1829,
          "methods": [],
          "name": "stage_apply_brdf_topo_correction",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_stem"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_hdr_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "correction_json_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "str",
              "default": "'scene'",
              "kind": "keyword-only",
              "name": "topo_fit_mode"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "parallel_mode"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.stage_apply_brdf_topo_correction",
          "signature": "stage_apply_brdf_topo_correction(*, base_folder: Path, product_code: str, flight_stem: str, raw_img_path: Path, raw_hdr_path: Path, correction_json_path: Path, use_ndvi_brdf_bins: bool=False, topo_fit_mode: str='scene', parallel_mode: bool=False) -> tuple[Path, Path]",
          "summary": "Apply BRDF + topographic correction using the precomputed JSON.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Convolve the BRDF+topo corrected ENVI cube into sensor bandstacks.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1907,
          "methods": [],
          "name": "stage_convolve_all_sensors",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_stem"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "corrected_img_path"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "corrected_hdr_path"
            },
            {
              "annotation": "str | None",
              "default": "'convolution'",
              "kind": "keyword-only",
              "name": "resample_method"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "parallel_mode"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "ray_cpus"
            },
            {
              "annotation": "float | str | None",
              "default": "64.0",
              "kind": "keyword-only",
              "name": "merge_memory_limit_gb"
            },
            {
              "annotation": "int | None",
              "default": "4",
              "kind": "keyword-only",
              "name": "merge_threads"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merge_row_group_size"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merge_temp_directory"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "polygon_path"
            },
            {
              "annotation": "tuple[int, int] | None",
              "default": "(4, 4)",
              "kind": "keyword-only",
              "name": "polygon_pixel_size"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "polygon_overwrite"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "polygon_min_overlap"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "polygon_search_buffer_m"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "extraction_mode"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.stage_convolve_all_sensors",
          "signature": "stage_convolve_all_sensors(*, base_folder: Path, product_code: str, flight_stem: str, corrected_img_path: Path | None=None, corrected_hdr_path: Path | None=None, resample_method: str | None='convolution', parallel_mode: bool=False, ray_cpus: int | None=None, merge_memory_limit_gb: float | str | None=64.0, merge_threads: int | None=4, merge_row_group_size: int | None=None, merge_temp_directory: Path | None=None, polygon_path: Path | str | None=None, polygon_pixel_size: tuple[int, int] | None=(4, 4), polygon_overwrite: bool=False, polygon_min_overlap: float=0.0, polygon_search_buffer_m: float=0.0, extraction_mode: str | None=None)",
          "summary": "Convolve the BRDF+topo corrected ENVI cube into sensor bandstacks.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Emit stage QA without hiding a successful scientific stage on QA failure.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2433,
          "methods": [],
          "name": "_emit_stage_qa_safe",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "qa_mode"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-keyword",
              "name": "kwargs"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._emit_stage_qa_safe",
          "signature": "_emit_stage_qa_safe(*, qa_mode: str, **kwargs) -> None",
          "summary": "Emit stage QA without hiding a successful scientific stage on QA failure.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Run new stage QA from on-disk artifacts, then the legacy flightline panel.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2456,
          "methods": [],
          "name": "_run_end_of_pipeline_qa",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "qa_mode"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "topo_fit_mode"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._run_end_of_pipeline_qa",
          "signature": "_run_end_of_pipeline_qa(*, qa_mode: str, flightline_dir: Path, topo_fit_mode: str) -> None",
          "summary": "Run new stage QA from on-disk artifacts, then the legacy flightline panel.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Run the structured, skip-aware workflow for a single flightline.\n\nParameters\n----------\nbase_folder : Path\n    Local NEON download and per-flightline output root; canonical filename helpers determine stage paths.\nproduct_code : str\n    NEON product identifier; the normal directional-reflectance workflow uses DP1.30006.001.\nflight_stem : str\n    Canonical source flightline identifier used by naming helpers, excluding the .h5 extension.\nresample_method : str | None, default='convolution'\n    Target-sensor method: 'convolution' (also selected by None), 'gaussian', 'straight', or the retained 'legacy'/'resample' adapter.\nbrightness_offset : float | None, default=None\n    Optional legacy additive brightness offset in stored reflectance units; None preserves the normal correction behavior.\nuse_ndvi_brdf_bins : bool, default=False\n    Opt into the existing NDVI-stratified BRDF fitting behavior rather than the default fit.\nparallel_mode : bool, default=False\n    Internal orchestration flag controlling nested execution; direct single-flightline callers normally retain False.\nparquet_chunk_size : int, default=50000\n    Positive pixel/window processing budget for bounded extraction; the default and interpretation follow the selected producer.\nray_cpus : int | None, default=None\n    Optional CPU allocation for Ray-backed work; None delegates to established resource selection.\nmerge_memory_limit_gb : float | str | None, default=64.0\n    DuckDB merge memory budget in GiB when numeric, or an accepted memory string; None follows the merge default.\nmerge_threads : int | None, default=4\n    Positive DuckDB thread budget; None delegates to the established database default.\nmerge_row_group_size : int | None, default=None\n    Positive rows per written Parquet row group; None in the merge workflow delegates to its established default.\nmerge_temp_directory : Path | None, default=None\n    DuckDB spill directory; bulk temporary storage must be outside the read-only source tree.\npolygon_path : Path | str | None, default=None\n    Existing polygon vector dataset for extraction; coordinates are handled by the established polygon workflow.\npolygon_pixel_size : tuple[int, int] | None, default=(4, 4)\n    Requested (x, y) pixel-size pair for polygon indexing; None delegates to raster-derived sizing. Units follow the raster coordinate system.\npolygon_overwrite : bool, default=False\n    Rebuild existing polygon-derived products instead of reusing them.\npolygon_min_overlap : float, default=0.0\n    Minimum fractional polygon/pixel overlap admitted by the existing extraction routine.\npolygon_search_buffer_m : float, default=0.0\n    Search expansion in meters for polygon/raster matching; does not change source polygon geometry.\nextraction_mode : str | None, default=None\n    'full' writes pixel Parquet, 'polygon' requires polygons; None preserves the entry point's documented default extraction behavior.\ntopo_fit_mode : str, default='scene'\n    Topographic fit mode passed to correction/QA; the default 'scene' retains the existing scene-wide fit.\nqa_mode : Literal['off', 'standard', 'deep'], default='standard'\n    QA coverage: 'off', 'standard', or 'deep'; deep diagnostics do not replace scientific validation of correction assumptions.\nsource_h5 : Path | str | None, default=None\n    Optional explicit existing HDF5 backing this flightline, used for windowed half-route processing without copying the source.\nsample_start : int | None, default=None\n    Optional zero-based half-open bounds on the across-track sample axis; None uses the corresponding full-axis bound.\nsample_stop : int | None, default=None\n    Optional zero-based half-open bounds on the across-track sample axis; None uses the corresponding full-axis bound.\nline_start : int | None, default=None\n    Optional zero-based half-open bounds on the along-track line axis; None uses the corresponding full-axis bound.\nline_stop : int | None, default=None\n    Optional zero-based half-open bounds on the along-track line axis; None uses the corresponding full-axis bound.\n\nReturns\n-------\nNone\n    No in-memory result. Canonical ENVI, correction JSON, sensor products, extraction tables and QA artifacts are written or reused on disk.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nRuntimeError\n    If required processing or artifact validation cannot complete.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nEnforced stage order:\n  1) export ENVI from H5\n  2) build correction JSON\n  3) apply BRDF + topographic correction\n  4) convolve / resample to target sensors\n  5) export Parquet sidecars for all reflectance ENVI outputs\n  6) merge Parquet sidecars into a DuckDB master table\n  7) optional polygon extraction\n  8) stage QA from on-disk artifacts, then the legacy flightline QA panel\n\nEach stage:\n  - uses get_flightline_products() for canonical file naming\n  - checks if its outputs already exist and are valid\n  - skips if possible\n  - re-runs only missing or invalid work\n\nPartially written / corrupt files will fail validation and\ntrigger recomputation so partial runs recover safely.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\nUse an existing downloaded flight HDF5 and its canonical stem; this call writes real processing outputs.\n\n>>> from spectralbridge import process_one_flightline\n>>> process_one_flightline(base_folder=base_folder, product_code=\"DP1.30006.001\", flight_stem=flight_stem)  # doctest: +SKIP",
          "examples": [],
          "exports": [
            "spectralbridge.process_one_flightline"
          ],
          "kind": "function",
          "line": 2493,
          "methods": [],
          "name": "process_one_flightline",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "flight_stem"
            },
            {
              "annotation": "str | None",
              "default": "'convolution'",
              "kind": "keyword-only",
              "name": "resample_method"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "brightness_offset"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "parallel_mode"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "parquet_chunk_size"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "ray_cpus"
            },
            {
              "annotation": "float | str | None",
              "default": "64.0",
              "kind": "keyword-only",
              "name": "merge_memory_limit_gb"
            },
            {
              "annotation": "int | None",
              "default": "4",
              "kind": "keyword-only",
              "name": "merge_threads"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merge_row_group_size"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merge_temp_directory"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "polygon_path"
            },
            {
              "annotation": "tuple[int, int] | None",
              "default": "(4, 4)",
              "kind": "keyword-only",
              "name": "polygon_pixel_size"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "polygon_overwrite"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "polygon_min_overlap"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "polygon_search_buffer_m"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "extraction_mode"
            },
            {
              "annotation": "str",
              "default": "'scene'",
              "kind": "keyword-only",
              "name": "topo_fit_mode"
            },
            {
              "annotation": "Literal['off', 'standard', 'deep']",
              "default": "'standard'",
              "kind": "keyword-only",
              "name": "qa_mode"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "source_h5"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_start"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_stop"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "line_start"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "line_stop"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.process_one_flightline",
          "signature": "process_one_flightline(*, base_folder: Path, product_code: str, flight_stem: str, resample_method: str | None='convolution', brightness_offset: float | None=None, use_ndvi_brdf_bins: bool=False, parallel_mode: bool=False, parquet_chunk_size: int=50000, ray_cpus: int | None=None, merge_memory_limit_gb: float | str | None=64.0, merge_threads: int | None=4, merge_row_group_size: int | None=None, merge_temp_directory: Path | None=None, polygon_path: Path | str | None=None, polygon_pixel_size: tuple[int, int] | None=(4, 4), polygon_overwrite: bool=False, polygon_min_overlap: float=0.0, polygon_search_buffer_m: float=0.0, extraction_mode: str | None=None, topo_fit_mode: str='scene', qa_mode: Literal['off', 'standard', 'deep']='standard', source_h5: Path | str | None=None, sample_start: int | None=None, sample_stop: int | None=None, line_start: int | None=None, line_stop: int | None=None)",
          "summary": "Run the structured, skip-aware workflow for a single flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "flight_stem"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "resample_method"
            },
            {
              "annotation": "float | None",
              "default": null,
              "name": "brightness_offset"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "parallel_mode"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "parquet_chunk_size"
            },
            {
              "annotation": "int | None",
              "default": null,
              "name": "ray_cpus"
            },
            {
              "annotation": "float | str | None",
              "default": null,
              "name": "merge_memory_limit_gb"
            },
            {
              "annotation": "int | None",
              "default": null,
              "name": "merge_threads"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "merge_row_group_size"
            },
            {
              "annotation": "Path | None",
              "default": null,
              "name": "merge_temp_directory"
            },
            {
              "annotation": "Path | str | None",
              "default": null,
              "name": "polygon_path"
            },
            {
              "annotation": "tuple[int, int] | None",
              "default": null,
              "name": "polygon_pixel_size"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "polygon_overwrite"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "polygon_min_overlap"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "polygon_search_buffer_m"
            },
            {
              "annotation": "str | None",
              "default": null,
              "name": "extraction_mode"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "topo_fit_mode"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "qa_mode"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "source_h5"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "sample_start"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "sample_stop"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "line_start"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "line_stop"
            }
          ],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Inputs required to process a single flightline.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 2783,
          "methods": [],
          "name": "_FlightlineTask",
          "parameters": [],
          "path": "spectralbridge.pipelines.pipeline._FlightlineTask",
          "signature": null,
          "summary": "Inputs required to process a single flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Worker wrapper that executes :func:`process_one_flightline`.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2814,
          "methods": [],
          "name": "_execute_flightline",
          "parameters": [
            {
              "annotation": "'_FlightlineTask'",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "task"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._execute_flightline",
          "signature": "_execute_flightline(task: '_FlightlineTask') -> str",
          "summary": "Worker wrapper that executes :func:`process_one_flightline`.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Yield completed flightline identifiers using ``concurrent.futures``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2849,
          "methods": [],
          "name": "_iter_executor_results",
          "parameters": [
            {
              "annotation": "Sequence[_FlightlineTask]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "tasks"
            },
            {
              "annotation": "Literal['thread', 'process']",
              "default": null,
              "kind": "keyword-only",
              "name": "engine"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "max_workers"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._iter_executor_results",
          "signature": "_iter_executor_results(tasks: Sequence[_FlightlineTask], *, engine: Literal['thread', 'process'], max_workers: int)",
          "summary": "Yield completed flightline identifiers using ``concurrent.futures``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Execute flightline tasks with Ray parallelism.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2864,
          "methods": [],
          "name": "_run_flightlines_with_ray",
          "parameters": [
            {
              "annotation": "Sequence[_FlightlineTask]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "tasks"
            },
            {
              "annotation": "int | None",
              "default": null,
              "kind": "keyword-only",
              "name": "num_cpus"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._run_flightlines_with_ray",
          "signature": "_run_flightlines_with_ray(tasks: Sequence[_FlightlineTask], *, num_cpus: int | None) -> list[str]",
          "summary": "Execute flightline tasks with Ray parallelism.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2911,
          "methods": [],
          "name": "_iter_engine_results",
          "parameters": [
            {
              "annotation": "Sequence[_FlightlineTask]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "tasks"
            },
            {
              "annotation": "Literal['thread', 'process', 'ray']",
              "default": null,
              "kind": "keyword-only",
              "name": "engine"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "max_workers"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline._iter_engine_results",
          "signature": "_iter_engine_results(tasks: Sequence[_FlightlineTask], *, engine: Literal['thread', 'process', 'ray'], max_workers: int)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Generate file sorting list and optionally sync files to iRODS using gocmd.\n\nParameters:\n- base_folder: Base directory containing processed files\n- remote_prefix: Optional custom path to add after i:/iplant/ for remote paths\n- sync_files: Whether to actually sync files (True) or just generate the list (False)",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2949,
          "methods": [],
          "name": "sort_and_sync_files",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": "''",
              "kind": "positional-or-keyword",
              "name": "remote_prefix"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "sync_files"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.sort_and_sync_files",
          "signature": "sort_and_sync_files(base_folder: str, remote_prefix: str='', sync_files: bool=True)",
          "summary": "Generate file sorting list and optionally sync files to iRODS using gocmd.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "High-level orchestrator for processing multiple flight lines.\n\nParameters\n----------\nbase_folder : Path\n    Local NEON download and per-flightline output root; canonical filename helpers determine stage paths.\nsite_code : str\n    NEON site code used for source discovery, for example NIWO.\nyear_month : str\n    Acquisition month in YYYY-MM form used by NEON download discovery.\nflight_lines : list[str]\n    Canonical NEON flightline identifiers to stage and process; source downloads are performed serially before parallel processing.\nproduct_code : str, default='DP1.30006.001'\n    NEON product identifier; the normal directional-reflectance workflow uses DP1.30006.001.\nresample_method : str | None, default='convolution'\n    Target-sensor method: 'convolution' (also selected by None), 'gaussian', 'straight', or the retained 'legacy'/'resample' adapter.\nbrightness_offset : float | None, default=None\n    Optional legacy additive brightness offset in stored reflectance units; None preserves the normal correction behavior.\nuse_ndvi_brdf_bins : bool, default=False\n    Opt into the existing NDVI-stratified BRDF fitting behavior rather than the default fit.\nmax_workers : int, default=8\n    Positive parallel worker budget; eight by default for the batch NEON orchestrator.\nparquet_chunk_size : int, default=50000\n    Positive pixel/window processing budget for bounded extraction; the default and interpretation follow the selected producer.\nengine : Literal['thread', 'process', 'ray'], default='ray'\n    Parallel backend: 'ray', 'thread', or 'process'; existing Ray state must be compatible with the chosen engine.\nmerge_memory_limit_gb : float | str | None, default=64.0\n    DuckDB merge memory budget in GiB when numeric, or an accepted memory string; None follows the merge default.\nmerge_threads : int | None, default=4\n    Positive DuckDB thread budget; None delegates to the established database default.\nmerge_row_group_size : int | None, default=None\n    Positive rows per written Parquet row group; None in the merge workflow delegates to its established default.\nmerge_temp_directory : Path | None, default=None\n    DuckDB spill directory; bulk temporary storage must be outside the read-only source tree.\npolygon_path : Path | str | None, default=None\n    Existing polygon vector dataset for extraction; coordinates are handled by the established polygon workflow.\npolygon_pixel_size : tuple[int, int] | None, default=(4, 4)\n    Requested (x, y) pixel-size pair for polygon indexing; None delegates to raster-derived sizing. Units follow the raster coordinate system.\npolygon_overwrite : bool, default=False\n    Rebuild existing polygon-derived products instead of reusing them.\npolygon_min_overlap : float, default=0.0\n    Minimum fractional polygon/pixel overlap admitted by the existing extraction routine.\npolygon_search_buffer_m : float, default=0.0\n    Search expansion in meters for polygon/raster matching; does not change source polygon geometry.\nextraction_mode : str | None, default=None\n    'full' writes pixel Parquet, 'polygon' requires polygons; None preserves the entry point's documented default extraction behavior.\ntopo_fit_mode : str, default='scene'\n    Topographic fit mode passed to correction/QA; the default 'scene' retains the existing scene-wide fit.\nqa_mode : Literal['off', 'standard', 'deep'], default='standard'\n    QA coverage: 'off', 'standard', or 'deep'; deep diagnostics do not replace scientific validation of correction assumptions.\nsplit_across_track : bool, default=False\n    Produce two canonical half-route windows from each original HDF5, retaining shared source provenance; False processes full scenes.\n\nReturns\n-------\nNone\n    No in-memory result. Requested flightline products and associated canonical sidecars are persisted under base_folder.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\nRuntimeError\n    If required processing or artifact validation cannot complete.\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nSteps:\n\n  1. Ensure the NEON ``.h5`` for each ``flight_stem`` is present locally via\n     :func:`stage_download_h5` (performed serially).\n  2. Run the per-flightline pipeline (ENVI export \u2192 corrections \u2192 resample \u2192\n     Parquet) by delegating to :func:`process_one_flightline` in parallel.\n\nThe function maintains canonical naming, idempotent stage behavior, and\noptional legacy resample translation. ``max_workers`` controls Ray CPU\nparallelism (default eight cores) and is interpreted as the worker budget\nfor thread/process fallbacks. ``engine`` selects the parallel backend:\nRay (default), threads, or multiprocessing.\n\n``split_across_track=False`` (default) processes each ``flight_lines``\nentry as a full scene. When ``True``, each original ID is downloaded once\ninto ``<base_folder>/<flight_stem>.h5`` and then processed as two renamed\nhalf-route products that share that H5:\n\n* north\u2013south elongated footprints \u2192 ``_left`` / ``_right`` line windows\n  (northern half, then southern half)\n* east\u2013west elongated footprints \u2192 ``_left`` / ``_right`` sample windows\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\nRequires real NEON flight identifiers and network/download access; see the NEON workflow for preparing these arguments.\n\n>>> from spectralbridge import go_forth_and_multiply\n>>> go_forth_and_multiply(base_folder, site_code, year_month, flight_lines, engine=\"thread\", max_workers=1)  # doctest: +SKIP",
          "examples": [
            "examples/release_candidate_smoke.py",
            "examples/run_neon_pipeline.py"
          ],
          "exports": [
            "spectralbridge.go_forth_and_multiply"
          ],
          "kind": "function",
          "line": 3012,
          "methods": [],
          "name": "go_forth_and_multiply",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "site_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "year_month"
            },
            {
              "annotation": "list[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_lines"
            },
            {
              "annotation": "str",
              "default": "'DP1.30006.001'",
              "kind": "keyword-only",
              "name": "product_code"
            },
            {
              "annotation": "str | None",
              "default": "'convolution'",
              "kind": "keyword-only",
              "name": "resample_method"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "brightness_offset"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "int",
              "default": "8",
              "kind": "keyword-only",
              "name": "max_workers"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "parquet_chunk_size"
            },
            {
              "annotation": "Literal['thread', 'process', 'ray']",
              "default": "'ray'",
              "kind": "keyword-only",
              "name": "engine"
            },
            {
              "annotation": "float | str | None",
              "default": "64.0",
              "kind": "keyword-only",
              "name": "merge_memory_limit_gb"
            },
            {
              "annotation": "int | None",
              "default": "4",
              "kind": "keyword-only",
              "name": "merge_threads"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merge_row_group_size"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merge_temp_directory"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "polygon_path"
            },
            {
              "annotation": "tuple[int, int] | None",
              "default": "(4, 4)",
              "kind": "keyword-only",
              "name": "polygon_pixel_size"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "polygon_overwrite"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "polygon_min_overlap"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "polygon_search_buffer_m"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "extraction_mode"
            },
            {
              "annotation": "str",
              "default": "'scene'",
              "kind": "keyword-only",
              "name": "topo_fit_mode"
            },
            {
              "annotation": "Literal['off', 'standard', 'deep']",
              "default": "'standard'",
              "kind": "keyword-only",
              "name": "qa_mode"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "split_across_track"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.go_forth_and_multiply",
          "signature": "go_forth_and_multiply(base_folder: Path, site_code: str, year_month: str, flight_lines: list[str], *, product_code: str='DP1.30006.001', resample_method: str | None='convolution', brightness_offset: float | None=None, use_ndvi_brdf_bins: bool=False, max_workers: int=8, parquet_chunk_size: int=50000, engine: Literal['thread', 'process', 'ray']='ray', merge_memory_limit_gb: float | str | None=64.0, merge_threads: int | None=4, merge_row_group_size: int | None=None, merge_temp_directory: Path | None=None, polygon_path: Path | str | None=None, polygon_pixel_size: tuple[int, int] | None=(4, 4), polygon_overwrite: bool=False, polygon_min_overlap: float=0.0, polygon_search_buffer_m: float=0.0, extraction_mode: str | None=None, topo_fit_mode: str='scene', qa_mode: Literal['off', 'standard', 'deep']='standard', split_across_track: bool=False) -> None",
          "summary": "High-level orchestrator for processing multiple flight lines.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run the retained legacy sensor-translation adapter across discovered corrected ENVI products.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3419,
          "methods": [],
          "name": "resample_translation_to_other_sensors",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.resample_translation_to_other_sensors",
          "signature": "resample_translation_to_other_sensors(base_folder: Path)",
          "summary": "Run the retained legacy sensor-translation adapter across discovered corrected ENVI products.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Processes subdirectories in a base folder, finding raster files and applying analysis.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3433,
          "methods": [],
          "name": "process_base_folder",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_layer"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-keyword",
              "name": "kwargs"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.process_base_folder",
          "signature": "process_base_folder(base_folder: Path, polygon_layer: str, **kwargs)",
          "summary": "Processes subdirectories in a base folder, finding raster files and applying analysis.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Searches and processes all subdirectories.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3473,
          "methods": [],
          "name": "process_all_subdirectories",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parent_directory"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_path"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.process_all_subdirectories",
          "signature": "process_all_subdirectories(parent_directory: Path, polygon_path)",
          "summary": "Searches and processes all subdirectories.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "A control function that orchestrates the processing of spectral data.\nIt first calls go_forth_and_multiply to generate necessary data and structures,\nthen processes all subdirectories within the base_folder, and finally sorts\nand syncs files to iRODS.\n\nParameters:\n- base_folder (str): The base directory for both operations.\n- site_code (str): Site code for go_forth_and_multiply.\n- year_month (str): Year and month for go_forth_and_multiply.\n- flight_lines (list): A list of flight lines for go_forth_and_multiply.\n- polygon_layer_path (str): Path to polygon shapefile or GeoJSON.\n- remote_prefix (str): Optional custom path to add after i:/iplant/ for remote paths.\n- sync_files (bool): Whether to sync files to iRODS or just generate the list.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 3486,
          "methods": [],
          "name": "jefe",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "site_code"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "year_month"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_lines"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_layer_path"
            },
            {
              "annotation": "str",
              "default": "''",
              "kind": "positional-or-keyword",
              "name": "remote_prefix"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "sync_files"
            },
            {
              "annotation": "str",
              "default": "'convolution'",
              "kind": "positional-or-keyword",
              "name": "resample_method"
            },
            {
              "annotation": "int",
              "default": "1",
              "kind": "positional-or-keyword",
              "name": "max_workers"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "skip_download_if_present"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "force_config"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "positional-or-keyword",
              "name": "brightness_offset"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "use_ndvi_brdf_bins"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "verbose"
            },
            {
              "annotation": "Literal['thread', 'process', 'ray']",
              "default": "'thread'",
              "kind": "positional-or-keyword",
              "name": "engine"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.jefe",
          "signature": "jefe(base_folder, site_code, year_month, flight_lines, polygon_layer_path: str, remote_prefix: str='', sync_files: bool=True, resample_method: str='convolution', max_workers: int=1, skip_download_if_present: bool=True, force_config: bool=False, brightness_offset: float=0.0, use_ndvi_brdf_bins: bool=False, verbose: bool=False, engine: Literal['thread', 'process', 'ray']='thread')",
          "summary": "A control function that orchestrates the processing of spectral data.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 3559,
          "methods": [],
          "name": "parse_args",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.parse_args",
          "signature": "parse_args(argv: Sequence[str] | None=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [
            "spectralbridge.pipelines.run_pipeline"
          ],
          "kind": "function",
          "line": 3610,
          "methods": [],
          "name": "run_pipeline",
          "parameters": [
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.pipelines.pipeline.run_pipeline",
          "signature": "run_pipeline(argv: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/pipelines/pipeline.py",
      "sha256": "83a48521192cba5bae35b9bc003a62efcbfd11838d6156f2cb07ece6ae57bbc3"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Conditional empirical PFT contrasts; fitted quantile curves are never replicates.\n\nThese are associational randomization diagnostics of the supplied sampled plants,\nconditional on exchangeability within recorded blocks, not causal/transfer tests.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "UNASSIGNED": "spectralbridge.plant_spectral_pfts.UNASSIGNED",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_model_inputs": "spectralbridge.plant_spectral_quantiles._model_inputs",
        "_year_plant_spectra": "spectralbridge.plant_spectral_years._year_plant_spectra",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "combinations": "itertools.combinations",
        "dataclass": "dataclasses.dataclass",
        "load_pft_crosswalk": "spectralbridge.plant_spectral_pfts.load_pft_crosswalk",
        "rankdata": "scipy.stats.rankdata",
        "tag_pfts": "spectralbridge.plant_spectral_pfts.tag_pfts"
      },
      "module": "spectralbridge.plant_pft_statistics",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "int",
              "default": "9999",
              "name": "permutations"
            },
            {
              "annotation": "int",
              "default": "999",
              "name": "bootstraps"
            },
            {
              "annotation": "int",
              "default": "10",
              "name": "min_plants"
            },
            {
              "annotation": "int",
              "default": "20261014",
              "name": "seed"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "('raw', 'corr', 'olioli')",
              "name": "stages"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Explicit, reproducible inferential choices (not acceptance thresholds).",
          "examples": [
            "examples/plant_pft_statistics.py"
          ],
          "exports": [],
          "kind": "class",
          "line": 31,
          "methods": [
            {
              "docstring": "",
              "line": 39,
              "name": "validate",
              "parameters": [],
              "private": false,
              "signature": "validate(self)"
            }
          ],
          "name": "PFTStatisticsConfig",
          "parameters": [],
          "path": "spectralbridge.plant_pft_statistics.PFTStatisticsConfig",
          "signature": null,
          "summary": "Explicit, reproducible inferential choices (not acceptance thresholds).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Holm family-wise adjustment; valid under arbitrary dependence.",
          "examples": [
            "examples/manuscript_synthesis/figure_data.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 46,
          "methods": [],
          "name": "holm",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pvalues"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics.holm",
          "signature": "holm(pvalues)",
          "summary": "Holm family-wise adjustment; valid under arbitrary dependence.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/figure_panels.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 57,
          "methods": [],
          "name": "_center",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "blocks"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics._center",
          "signature": "_center(values, blocks)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Shuffle whole plant labels jointly across bands, preserving block counts.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 65,
          "methods": [],
          "name": "permute_within",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "blocks"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rng"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics.permute_within",
          "signature": "permute_within(labels, blocks, rng)",
          "summary": "Shuffle whole plant labels jointly across bands, preserving block counts.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Block-adjusted binary coefficient with fixed null scaling and max-T.\n\nMixed blocks only; beta weights block contrasts by nA*nB/(nA+nB).\nNull scaling uses block-centered variation independent of PFT labels.\nWhole-curve max |T| and each-band max-T probabilities share one permutation\ndistribution. Bootstrap intervals are pointwise/descriptive, not simultaneous.",
          "examples": [
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/plant_pft_statistics.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/figure_panels.py",
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 74,
          "methods": [],
          "name": "contrast",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "blocks"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "permutations"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "bootstraps"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics.contrast",
          "signature": "contrast(values, labels, blocks, *, permutations, bootstraps, seed)",
          "summary": "Block-adjusted binary coefficient with fixed null scaling and max-T.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 156,
          "methods": [],
          "name": "_seed",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "key"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics._seed",
          "signature": "_seed(config, key)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 160,
          "methods": [],
          "name": "_write_json",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics._write_json",
          "signature": "_write_json(path, value)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Exact observation histories, including source and local polygon identity.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 166,
          "methods": [],
          "name": "_history_keys",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics._history_keys",
          "signature": "_history_keys(source)",
          "summary": "Exact observation histories, including source and local polygon identity.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 179,
          "methods": [],
          "name": "_plot_summary",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "summary"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics._plot_summary",
          "signature": "_plot_summary(root, summary)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 210,
          "methods": [],
          "name": "_plot_effects",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "summary"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bands"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics._plot_effects",
          "signature": "_plot_effects(root, summary, bands)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read verified compact products in place and write resumable statistics.",
          "examples": [
            "examples/plant_pft_statistics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 248,
          "methods": [],
          "name": "run_pft_statistics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparisons"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "crosswalk"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics.run_pft_statistics",
          "signature": "run_pft_statistics(comparisons, output, *, config=None, crosswalk=None)",
          "summary": "Read verified compact products in place and write resumable statistics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 346,
          "methods": [],
          "name": "_write_report",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "summary"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bands"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comp"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "audits"
            }
          ],
          "path": "spectralbridge.plant_pft_statistics._write_report",
          "signature": "_write_report(root, summary, bands, comp, config, audits)",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/plant_pft_statistics.py",
      "sha256": "4f8adf8d8c08045850fa2882531acf22e4cbfc4df50989e18edf69e835abc27d"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Descending quantile overlays from verified individual-plant checkpoints.",
      "export_expressions": [],
      "imports": {
        "Line2D": "matplotlib.lines.Line2D",
        "LineCollection": "matplotlib.collections.LineCollection",
        "MaxNLocator": "matplotlib.ticker.MaxNLocator",
        "Path": "pathlib.Path",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_micasense_labels_unverified": "spectralbridge.plant_spectral_comparison._micasense_labels_unverified"
      },
      "module": "spectralbridge.plant_quantile_overlays",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "One collection per percentile, with one unchanged trace per GlobalID.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 16,
          "methods": [],
          "name": "_overlay_figure",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "curves"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "species"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage"
            },
            {
              "annotation": null,
              "default": "'species'",
              "kind": "keyword-only",
              "name": "group_name"
            }
          ],
          "path": "spectralbridge.plant_quantile_overlays._overlay_figure",
          "signature": "_overlay_figure(wavelengths, curves, species, stage, *, group_name='species')",
          "summary": "One collection per percentile, with one unchanged trace per GlobalID.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render 100 slots (100 unfitted, then 99\u20131) without changing any fit.",
          "examples": [
            "examples/plant_quantile_overlays.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 119,
          "methods": [],
          "name": "run_quantile_overlays",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "models"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "('corr', 'raw')",
              "kind": "keyword-only",
              "name": "stages"
            }
          ],
          "path": "spectralbridge.plant_quantile_overlays.run_quantile_overlays",
          "signature": "run_quantile_overlays(models, output, *, stages=('corr', 'raw'))",
          "summary": "Render 100 slots (100 unfitted, then 99\u20131) without changing any fit.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/plant_quantile_overlays.py",
      "sha256": "8603ebf75ebe4b361832c1b68af247c933195ae7b1b190c6ea427d452d09a3ba"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Plant-balanced atlas for union-schema corrected polygon extraction tables.\n\nReads projected spectral batches; never copies the source pixel table. Global\nplant identity is explicit: repeated flight observations receive equal weight.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "TemporaryDirectory": "tempfile.TemporaryDirectory",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.plant_spectral_atlas",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Linearly harmonize one spectrum without bridging unsupported intervals.\n\nArgs:\n    wavelengths (array-like): Increasing native coordinates in nm, shape (B,).\n    values (array-like): Same-shape stored reflectance values; nonfinite\n        entries break support. Finite negatives and zeros are preserved.\n    target (array-like): Output wavelength coordinates in nm.\n    excluded (sequence): Inclusive wavelength intervals in nm to omit.\n    max_gap_nm (float): Largest adjacent native interval to interpolate.\n\nReturns:\n    numpy.ndarray: Target-shaped values in unchanged input units. Unsupported\n        coordinates are NaN; no extrapolation, scaling or clipping occurs.\n\nRaises:\n    ValueError: Native lengths differ or coordinates are not increasing.\n\nExact isolated samples survive, but do not connect across gaps.",
          "examples": [
            "examples/scientific_workflows_offline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 24,
          "methods": [],
          "name": "harmonize_spectrum",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "target"
            },
            {
              "annotation": null,
              "default": "((1340, 1450), (1790, 2000))",
              "kind": "keyword-only",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": "8",
              "kind": "keyword-only",
              "name": "max_gap_nm"
            }
          ],
          "path": "spectralbridge.plant_spectral_atlas.harmonize_spectrum",
          "signature": "harmonize_spectrum(wavelengths, values, target, *, excluded=((1340, 1450), (1790, 2000)), max_gap_nm=8) -> np.ndarray",
          "summary": "Linearly harmonize one spectrum without bridging unsupported intervals.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/validate_figures.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 67,
          "methods": [],
          "name": "_median",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "positional-or-keyword",
              "name": "axis"
            }
          ],
          "path": "spectralbridge.plant_spectral_atlas._median",
          "signature": "_median(values, axis=0)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Audit, aggregate pixels to observations to plants, and render an atlas.\n\nIdentity fields are required, not inferred from local polygon numbering.\nSpecies-only main figure excludes genus-only labels and Other/Unidentified;\nsupplementary atlas includes identified genus labels. Outputs are rerunnable\nderivatives; the original library is opened read-only.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 73,
          "methods": [],
          "name": "_build_plant_spectral_atlas",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": null,
              "default": "10",
              "kind": "keyword-only",
              "name": "min_plants_per_species"
            },
            {
              "annotation": null,
              "default": "'GlobalID'",
              "kind": "keyword-only",
              "name": "plant_field"
            },
            {
              "annotation": null,
              "default": "'flight_id'",
              "kind": "keyword-only",
              "name": "flight_field"
            },
            {
              "annotation": null,
              "default": "'source_image'",
              "kind": "keyword-only",
              "name": "source_field"
            },
            {
              "annotation": null,
              "default": "'species'",
              "kind": "keyword-only",
              "name": "species_field"
            },
            {
              "annotation": null,
              "default": "((1340, 1450), (1790, 2000))",
              "kind": "keyword-only",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": "5",
              "kind": "keyword-only",
              "name": "grid_step_nm"
            },
            {
              "annotation": null,
              "default": "8",
              "kind": "keyword-only",
              "name": "max_gap_nm"
            },
            {
              "annotation": null,
              "default": "32",
              "kind": "keyword-only",
              "name": "band_batch_size"
            },
            {
              "annotation": null,
              "default": "350",
              "kind": "keyword-only",
              "name": "dpi"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "supplementary"
            },
            {
              "annotation": null,
              "default": "'corr'",
              "kind": "keyword-only",
              "name": "spectral_stage"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "make_figures"
            }
          ],
          "path": "spectralbridge.plant_spectral_atlas._build_plant_spectral_atlas",
          "signature": "_build_plant_spectral_atlas(source, output_dir, *, min_plants_per_species=10, plant_field='GlobalID', flight_field='flight_id', source_field='source_image', species_field='species', excluded=((1340, 1450), (1790, 2000)), grid_step_nm=5, max_gap_nm=8, band_batch_size=32, dpi=350, supplementary=True, spectral_stage='corr', make_figures=True)",
          "summary": "Audit, aggregate pixels to observations to plants, and render an atlas.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/validate_figures.py",
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 423,
          "methods": [],
          "name": "_file_hash",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.plant_spectral_atlas._file_hash",
          "signature": "_file_hash(path)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Create/reuse empirical plant-atlas derivatives without copying source pixels.\n\nArgs:\n    source (str or pathlib.Path): Existing merged polygon Parquet, read in place.\n    output_dir (str or pathlib.Path): Directory for compact products/manifest.\n    **kwargs (object): Atlas options: plant_field='GlobalID', flight_field='flight_id',\n        source_field='source_image', species_field='species',\n        min_plants_per_species=10, spectral_stage='corr', grid_step_nm=5,\n        max_gap_nm=8, excluded=((1340,1450),(1790,2000)), band_batch_size=32,\n        dpi=350, supplementary=True, make_figures=True. Set grid_step_nm=None\n        for exact shared discrete sensor coordinates; make_figures=False\n        skips figures. Wavelengths are nm; stored reflectance units unchanged.\n\nReturns:\n    dict: Audit counts, grids, support and output provenance. Derivative\n        Parquets/CSVs and optional PDF/PNG/SVG persist in output_dir.\n\nRaises:\n    ValueError: Missing/conflicting identities, ambiguous native grids,\n        undeclared nodata sentinel, or no sufficiently supported taxa.\n    OSError: Source/products cannot be read or written.\n\nPixel medians form polygon/flight/source observations, then equal-observation\nplant medians. Structural NaNs are native-grid absence, not zero values.\nCompleted output is reused only when source/options/code/output hashes match.\nFailed reruns preserve completed products. Years require the separate\nyear-aware workflow; this default atlas aggregates across observations.",
          "examples": [
            "examples/plant_spectral_atlas.py",
            "examples/scientific_workflows_offline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 431,
          "methods": [],
          "name": "run_plant_spectral_atlas",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-keyword",
              "name": "kwargs"
            }
          ],
          "path": "spectralbridge.plant_spectral_atlas.run_plant_spectral_atlas",
          "signature": "run_plant_spectral_atlas(source, output_dir, **kwargs) -> dict",
          "summary": "Create/reuse empirical plant-atlas derivatives without copying source pixels.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 495,
          "methods": [],
          "name": "_plot_atlas",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "w"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "destination"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "species_field"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dpi"
            },
            {
              "annotation": null,
              "default": "'Corrected spectral value (native stored units)'",
              "kind": "positional-or-keyword",
              "name": "axis_label"
            }
          ],
          "path": "spectralbridge.plant_spectral_atlas._plot_atlas",
          "signature": "_plot_atlas(plants, spectra, w, labels, destination, species_field, excluded, dpi, axis_label='Corrected spectral value (native stored units)')",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 570,
          "methods": [],
          "name": "_plot_grids",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "grids"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "coverage"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "excluded"
            }
          ],
          "path": "spectralbridge.plant_spectral_atlas._plot_grids",
          "signature": "_plot_grids(grids, coverage, out, excluded)",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/plant_spectral_atlas.py",
      "sha256": "aa4b98b8c6919eac4bb9b99ec09bfcf5a3ad9097adc81d6fcc595f504ccd9248"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Matched independent-plant layouts for NEON and derived sensor products.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "SENSOR_WAVELENGTHS_NM": "spectralbridge.exports.schema_utils.SENSOR_WAVELENGTHS_NM",
        "TemporaryDirectory": "tempfile.TemporaryDirectory",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "annotations": "__future__.annotations",
        "run_plant_spectral_atlas": "spectralbridge.plant_spectral_atlas.run_plant_spectral_atlas"
      },
      "module": "spectralbridge.plant_spectral_comparison",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Intersect plant identities, never positional rows or pixel-count weights.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 34,
          "methods": [],
          "name": "_matched_products",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "min_plants"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._matched_products",
          "signature": "_matched_products(root, min_plants)",
          "summary": "Intersect plant identities, never positional rows or pixel-count weights.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Plant traces at supported NEON wavelengths or discrete sensor band centers.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 81,
          "methods": [],
          "name": "_draw_product",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "band_diagnostics"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._draw_product",
          "signature": "_draw_product(ax, stage, wavelengths, values, *, excluded, band_diagnostics)",
          "summary": "Plant traces at supported NEON wavelengths or discrete sensor band centers.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/validate_figures.py",
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 127,
          "methods": [],
          "name": "_limits",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._limits",
          "signature": "_limits(plants, products, labels)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 135,
          "methods": [],
          "name": "_finish_axis",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "limits"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "bottom"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._finish_axis",
          "signature": "_finish_axis(ax, limits, *, bottom)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 143,
          "methods": [],
          "name": "_save",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fig"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "destination"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "dpi"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._save",
          "signature": "_save(fig, destination, dpi)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 152,
          "methods": [],
          "name": "_row_layout",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "destination"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "dpi"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "limits"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "region_label"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._row_layout",
          "signature": "_row_layout(plants, products, labels, columns, destination, *, dpi, excluded, limits, region_label=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 267,
          "methods": [],
          "name": "_atlas_block",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fig"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stages"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "title"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "limits"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "region_label"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._atlas_block",
          "signature": "_atlas_block(fig, plants, products, labels, stages, title, *, excluded, limits, region_label=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 321,
          "methods": [],
          "name": "_render_comparisons",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "dpi"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "limits"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "region_label"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._render_comparisons",
          "signature": "_render_comparisons(plants, products, labels, out, *, dpi, excluded, limits=None, region_label=None)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render alphabetical species rows using matched independent plants.\n\nUses raw/corr NEON spectra, darkened olioli and micasense derived bands.\nBroadband band centers are retained exactly, connected visually without adding\ninterpolated samples; NaN bands break individual traces.\nAll layouts use alphabetical species order, plant cohorts and full y limits.\nEach species occupies its own row in three-column comparisons and single-product atlases.\nProduct tables/checkpoints are compact observation/plant spectra, not pixels.",
          "examples": [
            "examples/plant_spectral_comparison.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 406,
          "methods": [],
          "name": "run_plant_comparison_atlas",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": null,
              "default": "10",
              "kind": "keyword-only",
              "name": "min_plants_per_species"
            },
            {
              "annotation": null,
              "default": "350",
              "kind": "keyword-only",
              "name": "dpi"
            },
            {
              "annotation": null,
              "default": "((1340, 1450), (1790, 2000))",
              "kind": "keyword-only",
              "name": "excluded"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison.run_plant_comparison_atlas",
          "signature": "run_plant_comparison_atlas(source, output_dir, *, min_plants_per_species=10, dpi=350, excluded=((1340, 1450), (1790, 2000)))",
          "summary": "Render alphabetical species rows using matched independent plants.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Detect extra band labels padded after the legacy five-band fallback.\n\nThis flags a provenance problem; it does not infer replacement wavelengths.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 528,
          "methods": [],
          "name": "_micasense_labels_unverified",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            }
          ],
          "path": "spectralbridge.plant_spectral_comparison._micasense_labels_unverified",
          "signature": "_micasense_labels_unverified(wavelengths)",
          "summary": "Detect extra band labels padded after the legacy five-band fallback.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/plant_spectral_comparison.py",
      "sha256": "2834a48da0b0806324aac3c856497b5e66ae50a2732a12e738a5a30b0763824e"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Auditable name-derived PFT tags and plant-balanced grouped spectral reports.",
      "export_expressions": [],
      "imports": {
        "MaxNLocator": "matplotlib.ticker.MaxNLocator",
        "Path": "pathlib.Path",
        "QuantileModelConfig": "spectralbridge.plant_spectral_quantiles.QuantileModelConfig",
        "ThreadPoolExecutor": "concurrent.futures.ThreadPoolExecutor",
        "_draw_product": "spectralbridge.plant_spectral_comparison._draw_product",
        "_draw_quantile_panel": "spectralbridge.plant_spectral_quantiles._draw_quantile_panel",
        "_evaluate_matching": "spectralbridge.plant_spectral_quantiles._evaluate_matching",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_fit_checkpoint": "spectralbridge.plant_spectral_quantiles._fit_checkpoint",
        "_micasense_labels_unverified": "spectralbridge.plant_spectral_comparison._micasense_labels_unverified",
        "_model_inputs": "spectralbridge.plant_spectral_quantiles._model_inputs",
        "_overlay_figure": "spectralbridge.plant_quantile_overlays._overlay_figure",
        "_save": "spectralbridge.plant_spectral_comparison._save",
        "_split_plants": "spectralbridge.plant_spectral_quantiles._split_plants",
        "_year_plant_spectra": "spectralbridge.plant_spectral_years._year_plant_spectra",
        "annotations": "__future__.annotations",
        "as_completed": "concurrent.futures.as_completed",
        "asdict": "dataclasses.asdict",
        "files": "importlib.resources.files"
      },
      "module": "spectralbridge.plant_spectral_pfts",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Load the explicit, versioned lookup; never infer a species from a genus.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 44,
          "methods": [],
          "name": "load_pft_crosswalk",
          "parameters": [
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.plant_spectral_pfts.load_pft_crosswalk",
          "signature": "load_pft_crosswalk(path=None)",
          "summary": "Load the explicit, versioned lookup; never infer a species from a genus.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 83,
          "methods": [],
          "name": "_taxon_key",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.plant_spectral_pfts._taxon_key",
          "signature": "_taxon_key(value)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Add tags while retaining verbatim species and all observation identities.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 87,
          "methods": [],
          "name": "tag_pfts",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "crosswalk"
            }
          ],
          "path": "spectralbridge.plant_spectral_pfts.tag_pfts",
          "signature": "tag_pfts(table, crosswalk)",
          "summary": "Add tags while retaining verbatim species and all observation identities.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Fit group distributions from individual plants, never from species medians.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 113,
          "methods": [],
          "name": "_requests_for_pfts",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "years"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "year_columns"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cohort"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.plant_spectral_pfts._requests_for_pfts",
          "signature": "_requests_for_pfts(plants, data, years, year_columns, cohort, config)",
          "summary": "Fit group distributions from individual plants, never from species medians.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "One PFT per row; each column selects exactly one scope and sensor.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 194,
          "methods": [],
          "name": "_pft_panel",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "index"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "counts"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "title"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "limits"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "empirical"
            }
          ],
          "path": "spectralbridge.plant_spectral_pfts._pft_panel",
          "signature": "_pft_panel(root, index, counts, columns, labels, title, limits, *, empirical=None)",
          "summary": "One PFT per row; each column selects exactly one scope and sensor.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Reuse unchanged existing individual fits in place; fit only newly admitted taxa.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 336,
          "methods": [],
          "name": "_individual_references",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observations"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_models"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out"
            }
          ],
          "path": "spectralbridge.plant_spectral_pfts._individual_references",
          "signature": "_individual_references(plants, observations, config, source_models, out)",
          "summary": "Reuse unchanged existing individual fits in place; fit only newly admitted taxa.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Write additive PFT products; the original species products stay immutable.",
          "examples": [
            "examples/plant_spectral_pfts.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 418,
          "methods": [],
          "name": "run_pft_spectral_analysis",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparisons"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "crosswalk"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "individual_overlays"
            }
          ],
          "path": "spectralbridge.plant_spectral_pfts.run_pft_spectral_analysis",
          "signature": "run_pft_spectral_analysis(comparisons, output, *, crosswalk=None, config=None, individual_overlays=True)",
          "summary": "Write additive PFT products; the original species products stay immutable.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/plant_spectral_pfts.py",
      "sha256": "fe586150d9cbe80208db956bd3ebd85eb08d1cf16535526c8e47669d3752591f"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Checkpointed boosted conditional quantile signatures and held-plant matching.\n\nFitted curves are representations, never synthetic independent plant observations.\nSpecies fits use independent polygon medians; individual fits use repeated-flight\npolygon medians. Unsupported NEON segments are trained separately.",
      "export_expressions": [],
      "imports": {
        "MaxNLocator": "matplotlib.ticker.MaxNLocator",
        "Path": "pathlib.Path",
        "PdfPages": "matplotlib.backends.backend_pdf.PdfPages",
        "ThreadPoolExecutor": "concurrent.futures.ThreadPoolExecutor",
        "_STAGES": "spectralbridge.plant_spectral_comparison._STAGES",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_micasense_labels_unverified": "spectralbridge.plant_spectral_comparison._micasense_labels_unverified",
        "_save": "spectralbridge.plant_spectral_comparison._save",
        "_verified_products": "spectralbridge.plant_spectral_regions._verified_products",
        "annotations": "__future__.annotations",
        "as_completed": "concurrent.futures.as_completed",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "harmonize_spectrum": "spectralbridge.plant_spectral_atlas.harmonize_spectrum"
      },
      "module": "spectralbridge.plant_spectral_quantiles",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "tuple[float, ...]",
              "default": "QUANTILES",
              "name": "quantiles"
            },
            {
              "annotation": "int",
              "default": "80",
              "name": "boosting_rounds"
            },
            {
              "annotation": "float",
              "default": "0.1",
              "name": "learning_rate"
            },
            {
              "annotation": "int",
              "default": "5",
              "name": "max_depth"
            },
            {
              "annotation": "int",
              "default": "256",
              "name": "max_bin"
            },
            {
              "annotation": "int",
              "default": "0",
              "name": "seed"
            },
            {
              "annotation": "int",
              "default": "10",
              "name": "min_plants_per_species"
            },
            {
              "annotation": "float",
              "default": "0.2",
              "name": "holdout_fraction"
            },
            {
              "annotation": "int",
              "default": "4",
              "name": "workers"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "_STAGES",
              "name": "stages"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Configure historical boosted quantile spectral models, group eligibility and rendering budgets.",
          "examples": [
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_years.py"
          ],
          "exports": [],
          "kind": "class",
          "line": 31,
          "methods": [
            {
              "docstring": "",
              "line": 45,
              "name": "validate",
              "parameters": [],
              "private": false,
              "signature": "validate(self)"
            }
          ],
          "name": "QuantileModelConfig",
          "parameters": [],
          "path": "spectralbridge.plant_spectral_quantiles.QuantileModelConfig",
          "signature": null,
          "summary": "Configure historical boosted quantile spectral models, group eligibility and rendering budgets.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 77,
          "methods": [],
          "name": "_xgboost",
          "parameters": [],
          "path": "spectralbridge.plant_spectral_quantiles._xgboost",
          "signature": "_xgboost()",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 87,
          "methods": [],
          "name": "_segments",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "w"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "supported"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "hyperspectral"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._segments",
          "signature": "_segments(w, supported, *, hyperspectral)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fit exact supplied wavelengths with equal total weight per input spectrum.\n\nNaN columns and >8 nm hyperspectral gaps split independent boosting models.\nReturns raw fitted quantiles and explicitly pointwise-rearranged ordered\nquantiles. No clipping, normalization, extrapolation or added samples.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 97,
          "methods": [],
          "name": "fit_quantile_signature",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "hyperspectral"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles.fit_quantile_signature",
          "signature": "fit_quantile_signature(wavelengths, spectra, *, config=None, hyperspectral=True)",
          "summary": "Fit exact supplied wavelengths with equal total weight per input spectrum.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Mean pinball loss times two: a discrete 1\u201399% integrated-score approximation.\n\nLower is a closer match in supplied units. It is not a class probability and\ntreats wavelengths marginally, without estimating spectral covariance.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 190,
          "methods": [],
          "name": "quantile_distance",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observed"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "curves"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "quantiles"
            },
            {
              "annotation": null,
              "default": "2",
              "kind": "keyword-only",
              "name": "minimum_bands"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles.quantile_distance",
          "signature": "quantile_distance(observed, curves, quantiles, *, minimum_bands=2)",
          "summary": "Mean pinball loss times two: a discrete 1\u201399% integrated-score approximation.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Deterministic disjoint GlobalID split; all repeated flights stay together.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 212,
          "methods": [],
          "name": "_split_plants",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._split_plants",
          "signature": "_split_plants(plants, config)",
          "summary": "Deterministic disjoint GlobalID split; all repeated flights stay together.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/evaluate_quantile_matches.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 230,
          "methods": [],
          "name": "_model_inputs",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparisons"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._model_inputs",
          "signature": "_model_inputs(comparisons)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 270,
          "methods": [],
          "name": "_identity_digest",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._identity_digest",
          "signature": "_identity_digest(value)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 274,
          "methods": [],
          "name": "_fit_checkpoint",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "meta"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "w"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identity"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._fit_checkpoint",
          "signature": "_fit_checkpoint(directory, meta, w, values, config, identity)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 344,
          "methods": [],
          "name": "_tasks",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observations"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._tasks",
          "signature": "_tasks(plants, data, observations, config)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 395,
          "methods": [],
          "name": "_evaluate_matching",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cohort"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "index"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._evaluate_matching",
          "signature": "_evaluate_matching(cohort, data, index, directory, config)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Rank supplied native-unit spectra against full quantile references.\n\nPointwise pinball ranking is exploratory; scores are not identification\nprobabilities. Query gaps/exclusions are preserved, with no extrapolation.\nIndividual references represent repeated observations of one polygon.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 501,
          "methods": [],
          "name": "rank_unknown_spectrum",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths_nm"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": "'corr'",
              "kind": "keyword-only",
              "name": "stage"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "region"
            },
            {
              "annotation": null,
              "default": "'species'",
              "kind": "keyword-only",
              "name": "level"
            },
            {
              "annotation": null,
              "default": "()",
              "kind": "keyword-only",
              "name": "exclude_plant_ids"
            },
            {
              "annotation": null,
              "default": "0.5",
              "kind": "keyword-only",
              "name": "minimum_shared_fraction"
            },
            {
              "annotation": null,
              "default": "False",
              "kind": "keyword-only",
              "name": "allow_unverified_export_coordinates"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles.rank_unknown_spectrum",
          "signature": "rank_unknown_spectrum(output_dir, wavelengths_nm, values, *, stage='corr', region=None, level='species', exclude_plant_ids=(), minimum_shared_fraction=0.5, allow_unverified_export_coordinates=False)",
          "summary": "Rank supplied native-unit spectra against full quantile references.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fit species/site and individual-polygon quantile signatures with checkpoints.\n\nAll 1\u201399% quantiles are jointly trained with separate quantile tree outputs.\nUses completed compact tables only. Models/plots are derivatives; original\npixel library and parent plant tables remain immutable.",
          "examples": [
            "examples/plant_spectral_quantiles.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 602,
          "methods": [],
          "name": "run_boosted_quantile_atlas",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparisons_dir"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "make_individual_pdf"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles.run_boosted_quantile_atlas",
          "signature": "run_boosted_quantile_atlas(comparisons_dir, output_dir, *, config=None, make_individual_pdf=True)",
          "summary": "Fit species/site and individual-polygon quantile signatures with checkpoints.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Rank held-out plants against other training polygons within the known site.\n\nOne fit belongs only to its own GlobalID, so filtering the held-out identities\nfrom references eliminates leakage without refitting individual models.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 756,
          "methods": [],
          "name": "_evaluate_individual_matching",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cohort"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "index"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._evaluate_individual_matching",
          "signature": "_evaluate_individual_matching(cohort, data, index, directory, config)",
          "summary": "Rank held-out plants against other training polygons within the known site.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 821,
          "methods": [],
          "name": "_draw_quantile_panel",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "limits"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stages"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._draw_quantile_panel",
          "signature": "_draw_quantile_panel(ax, records, root, excluded, limits, stages)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 871,
          "methods": [],
          "name": "_quantile_figure",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row_keys"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "title"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "limits"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": "False",
              "kind": "keyword-only",
              "name": "individual"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._quantile_figure",
          "signature": "_quantile_figure(root, records, row_keys, columns, title, limits, excluded, *, individual=False)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 959,
          "methods": [],
          "name": "_plot_quantile_reports",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "index"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "make_individual_pdf"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._plot_quantile_reports",
          "signature": "_plot_quantile_reports(root, index, config, *, make_individual_pdf)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Exact vector pinball scores via sorted-quantile prefix sums.\n\nAvoids a query-by-quantile-by-band tensor when ranking many held-out plants.\nNaN-query cases use the scalar finite-band contract.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1049,
          "methods": [],
          "name": "_quantile_distances_many",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observations"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ordered_curves"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "quantiles"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._quantile_distances_many",
          "signature": "_quantile_distances_many(observations, ordered_curves, quantiles)",
          "summary": "Exact vector pinball scores via sorted-quantile prefix sums.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Scope/CPU settings do not alter an already supplied training matrix.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1080,
          "methods": [],
          "name": "_fitting_parameters",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parameters"
            }
          ],
          "path": "spectralbridge.plant_spectral_quantiles._fitting_parameters",
          "signature": "_fitting_parameters(parameters)",
          "summary": "Scope/CPU settings do not alter an already supplied training matrix.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/plant_spectral_quantiles.py",
      "sha256": "8599b958a2d1754759c236dee10c520a874b1c8e4487373f27e7e1fae27b8aa5"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Site-resolved plant atlases backed by extraction-table provenance.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "TemporaryDirectory": "tempfile.TemporaryDirectory",
        "_STAGES": "spectralbridge.plant_spectral_comparison._STAGES",
        "_draw_product": "spectralbridge.plant_spectral_comparison._draw_product",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_finish_axis": "spectralbridge.plant_spectral_comparison._finish_axis",
        "_limits": "spectralbridge.plant_spectral_comparison._limits",
        "_matched_products": "spectralbridge.plant_spectral_comparison._matched_products",
        "_micasense_labels_unverified": "spectralbridge.plant_spectral_comparison._micasense_labels_unverified",
        "_render_comparisons": "spectralbridge.plant_spectral_comparison._render_comparisons",
        "_save": "spectralbridge.plant_spectral_comparison._save",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.plant_spectral_regions",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read a site only from the NEON table basename, never an ancestor path.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 31,
          "methods": [],
          "name": "_site_from_table",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.plant_spectral_regions._site_from_table",
          "signature": "_site_from_table(value)",
          "summary": "Read a site only from the NEON table basename, never an ancestor path.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 40,
          "methods": [],
          "name": "_regional_provenance",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            }
          ],
          "path": "spectralbridge.plant_spectral_regions._regional_provenance",
          "signature": "_regional_provenance(source)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Validate existing compact checkpoints; never reopen spectral pixel columns.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 102,
          "methods": [],
          "name": "_verified_products",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_hash"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products_dir"
            }
          ],
          "path": "spectralbridge.plant_spectral_regions._verified_products",
          "signature": "_verified_products(source_hash, products_dir)",
          "summary": "Validate existing compact checkpoints; never reopen spectral pixel columns.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 128,
          "methods": [],
          "name": "_regional_counts",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "min_plants"
            }
          ],
          "path": "spectralbridge.plant_spectral_regions._regional_counts",
          "signature": "_regional_counts(plants, min_plants)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Use explicit unavailable cells rather than hiding regional absence.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 145,
          "methods": [],
          "name": "_cross_region_atlas",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plants"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "regions"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "names"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "dpi"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "excluded"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "limits"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "keyword-only",
              "name": "min_plants"
            }
          ],
          "path": "spectralbridge.plant_spectral_regions._cross_region_atlas",
          "signature": "_cross_region_atlas(plants, products, labels, regions, names, out, *, dpi, excluded, limits, min_plants)",
          "summary": "Use explicit unavailable cells rather than hiding regional absence.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Reuse completed plant spectra for source-table site comparisons.\n\nRegion codes must agree with flight IDs and populated aop_site metadata.\nGlobalID cannot span regions. Thresholds apply separately within each site;\nshared axes use full finite bounds across all eligible regional cohorts.\nThe original source is read only for identity/provenance, not spectral values.",
          "examples": [
            "examples/plant_spectral_regions.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 248,
          "methods": [],
          "name": "run_regional_plant_atlas",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparisons_dir"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": null,
              "default": "10",
              "kind": "keyword-only",
              "name": "min_plants_per_species"
            },
            {
              "annotation": null,
              "default": "350",
              "kind": "keyword-only",
              "name": "dpi"
            }
          ],
          "path": "spectralbridge.plant_spectral_regions.run_regional_plant_atlas",
          "signature": "run_regional_plant_atlas(source, comparisons_dir, output_dir, *, min_plants_per_species=10, dpi=350)",
          "summary": "Reuse completed plant spectra for source-table site comparisons.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/plant_spectral_regions.py",
      "sha256": "cb78bc2575253e069c9b8776adf068c56a46c9f081371ce54906023cfd27170f"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Acquisition-year/site boosted species panels from compact plant-flight spectra.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "QuantileModelConfig": "spectralbridge.plant_spectral_quantiles.QuantileModelConfig",
        "ThreadPoolExecutor": "concurrent.futures.ThreadPoolExecutor",
        "_draw_quantile_panel": "spectralbridge.plant_spectral_quantiles._draw_quantile_panel",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_fit_checkpoint": "spectralbridge.plant_spectral_quantiles._fit_checkpoint",
        "_micasense_labels_unverified": "spectralbridge.plant_spectral_comparison._micasense_labels_unverified",
        "_model_inputs": "spectralbridge.plant_spectral_quantiles._model_inputs",
        "_regional_counts": "spectralbridge.plant_spectral_regions._regional_counts",
        "_save": "spectralbridge.plant_spectral_comparison._save",
        "_site_from_table": "spectralbridge.plant_spectral_regions._site_from_table",
        "as_completed": "concurrent.futures.as_completed",
        "asdict": "dataclasses.asdict"
      },
      "module": "spectralbridge.plant_spectral_years",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 27,
          "methods": [],
          "name": "_acquisition_group",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.plant_spectral_years._acquisition_group",
          "signature": "_acquisition_group(name)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Equal observation medians within GlobalID/year; never reuse all-year medians.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 37,
          "methods": [],
          "name": "_year_plant_spectra",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observations"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage"
            }
          ],
          "path": "spectralbridge.plant_spectral_years._year_plant_spectra",
          "signature": "_year_plant_spectra(observations, stage)",
          "summary": "Equal observation medians within GlobalID/year; never reuse all-year medians.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 87,
          "methods": [],
          "name": "_year_site_figure",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "index"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "counts"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "years"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sites"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "limits"
            }
          ],
          "path": "spectralbridge.plant_spectral_years._year_site_figure",
          "signature": "_year_site_figure(root, index, counts, stage, years, sites, labels, limits)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fit or reuse boosted spectral quantiles within eligible species-by-site-by-year cohorts.",
          "examples": [
            "examples/plant_spectral_years.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 218,
          "methods": [],
          "name": "run_year_site_quantiles",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "comparisons"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.plant_spectral_years.run_year_site_quantiles",
          "signature": "run_year_site_quantiles(comparisons, output, *, config=None)",
          "summary": "Fit or reuse boosted spectral quantiles within eligible species-by-site-by-year cohorts.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/plant_spectral_years.py",
      "sha256": "47ad326ce899ffb4ef4c8e2a673bd9d71f71c289dd6cbd4e819cefc1205f43f8"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Callable": "typing.Callable",
        "DataFile": "spectralbridge.file_types.DataFile",
        "List": "typing.List",
        "NEONReflectanceBRDFCorrectedENVIFile": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIFile",
        "NEONReflectanceENVIFile": "spectralbridge.file_types.NEONReflectanceENVIFile",
        "NEONReflectanceResampledENVIFile": "spectralbridge.file_types.NEONReflectanceResampledENVIFile",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "ProcessPoolExecutor": "concurrent.futures.ProcessPoolExecutor",
        "SENSOR_WAVELENGTHS_NM": "spectralbridge.exports.schema_utils.SENSOR_WAVELENGTHS_NM",
        "Set": "typing.Set",
        "SpectralDataParquetFile": "spectralbridge.file_types.SpectralDataParquetFile",
        "as_completed": "concurrent.futures.as_completed",
        "defaultdict": "collections.defaultdict",
        "ensure_coord_columns": "spectralbridge.exports.schema_utils.ensure_coord_columns",
        "import_module": "importlib.import_module",
        "infer_stage_from_name": "spectralbridge.exports.schema_utils.infer_stage_from_name",
        "parse_envi_wavelengths_nm": "spectralbridge.exports.schema_utils.parse_envi_wavelengths_nm",
        "require_geopandas": "spectralbridge._optional.require_geopandas",
        "require_rasterio": "spectralbridge._optional.require_rasterio",
        "sort_and_rename_spectral_columns": "spectralbridge.exports.schema_utils.sort_and_rename_spectral_columns"
      },
      "module": "spectralbridge.polygon_extraction",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Thin wrapper that defers importing optional dependencies until accessed.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 27,
          "methods": [
            {
              "docstring": "",
              "line": 30,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "module_path"
                },
                {
                  "annotation": "str | None",
                  "default": "None",
                  "kind": "keyword-only",
                  "name": "attr"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "install_hint"
                }
              ],
              "private": true,
              "signature": "__init__(self, module_path: str, *, attr: str | None=None, install_hint: str)"
            },
            {
              "docstring": "",
              "line": 36,
              "name": "_load",
              "parameters": [],
              "private": true,
              "signature": "_load(self)"
            },
            {
              "docstring": "",
              "line": 48,
              "name": "__getattr__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "item"
                }
              ],
              "private": true,
              "signature": "__getattr__(self, item)"
            },
            {
              "docstring": "",
              "line": 51,
              "name": "__call__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "variadic-positional",
                  "name": "args"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "variadic-keyword",
                  "name": "kwargs"
                }
              ],
              "private": true,
              "signature": "__call__(self, *args, **kwargs)"
            }
          ],
          "name": "_LazyModule",
          "parameters": [],
          "path": "spectralbridge.polygon_extraction._LazyModule",
          "signature": null,
          "summary": "Thin wrapper that defers importing optional dependencies until accessed.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 66,
          "methods": [],
          "name": "tqdm",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-positional",
              "name": "args"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "variadic-keyword",
              "name": "kwargs"
            }
          ],
          "path": "spectralbridge.polygon_extraction.tqdm",
          "signature": "tqdm(*args, **kwargs)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Lazy import pyarrow with a helpful error message.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 70,
          "methods": [],
          "name": "_require_pyarrow",
          "parameters": [],
          "path": "spectralbridge.polygon_extraction._require_pyarrow",
          "signature": "_require_pyarrow()",
          "summary": "Lazy import pyarrow with a helpful error message.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Lazy import pyarrow.parquet via :func:`_require_pyarrow`.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 84,
          "methods": [],
          "name": "_require_pyarrow_parquet",
          "parameters": [],
          "path": "spectralbridge.polygon_extraction._require_pyarrow_parquet",
          "signature": "_require_pyarrow_parquet()",
          "summary": "Lazy import pyarrow.parquet via :func:`_require_pyarrow`.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the leading run of band columns (in stored order).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 93,
          "methods": [],
          "name": "_leading_band_columns",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "colnames"
            }
          ],
          "path": "spectralbridge.polygon_extraction._leading_band_columns",
          "signature": "_leading_band_columns(colnames)",
          "summary": "Return the leading run of band columns (in stored order).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the integer band indices extracted from band column names.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 106,
          "methods": [],
          "name": "_band_indices",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band_cols"
            }
          ],
          "path": "spectralbridge.polygon_extraction._band_indices",
          "signature": "_band_indices(band_cols)",
          "summary": "Return the integer band indices extracted from band column names.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validate band layout and sample values for each Parquet file in ``directory``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 117,
          "methods": [],
          "name": "validate_bands_in_dir",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": "int",
              "default": "426",
              "kind": "positional-or-keyword",
              "name": "expected_bands"
            },
            {
              "annotation": "int",
              "default": "4000",
              "kind": "positional-or-keyword",
              "name": "sample_rows"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "recursive"
            },
            {
              "annotation": "tuple | None",
              "default": "(0.0, 1.0)",
              "kind": "positional-or-keyword",
              "name": "value_range"
            },
            {
              "annotation": "float",
              "default": "1e-12",
              "kind": "positional-or-keyword",
              "name": "eps_all_zero"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "show_preview"
            },
            {
              "annotation": null,
              "default": "('raster_file', 'crs', 'chunk', 'x', 'y', 'Raster_File', 'CRS', 'Chunk_Number', 'Pixel_X', 'Pixel_Y')",
              "kind": "positional-or-keyword",
              "name": "meta_cols"
            }
          ],
          "path": "spectralbridge.polygon_extraction.validate_bands_in_dir",
          "signature": "validate_bands_in_dir(directory, expected_bands: int=426, sample_rows: int=4000, recursive: bool=True, value_range: tuple | None=(0.0, 1.0), eps_all_zero: float=1e-12, show_preview: bool=True, meta_cols=('raster_file', 'crs', 'chunk', 'x', 'y', 'Raster_File', 'CRS', 'Chunk_Number', 'Pixel_X', 'Pixel_Y'))",
          "summary": "Validate band layout and sample values for each Parquet file in ``directory``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 281,
          "methods": [],
          "name": "_leading_band_columns_sorted",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "colnames"
            }
          ],
          "path": "spectralbridge.polygon_extraction._leading_band_columns_sorted",
          "signature": "_leading_band_columns_sorted(colnames)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 293,
          "methods": [],
          "name": "_process_single_raster",
          "parameters": [
            {
              "annotation": "DataFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raster_file"
            },
            {
              "annotation": "Optional[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.polygon_extraction._process_single_raster",
          "signature": "_process_single_raster(raster_file: DataFile, polygon_path: Optional[Path], *, overwrite: bool=False)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Finds and processes raster files in a directory.\nProcesses data in chunks and saves output to Parquet.\n\nWhen more than one raster file is found, the extractions run in parallel using a\nprocess pool. The ``max_workers`` argument can be used to control the number of\nconcurrent processes. By default, existing extraction outputs are reused; pass\n``overwrite=True`` to regenerate them.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 318,
          "methods": [],
          "name": "control_function_for_extraction",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": "Optional[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_path"
            },
            {
              "annotation": "Optional[int]",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "max_workers"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.polygon_extraction.control_function_for_extraction",
          "signature": "control_function_for_extraction(directory, polygon_path: Optional[Path], max_workers: Optional[int]=None, *, overwrite: bool=False)",
          "summary": "Finds and processes raster files in a directory.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 379,
          "methods": [],
          "name": "_validate_extracted_directories",
          "parameters": [
            {
              "annotation": "Set[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plot_directories"
            }
          ],
          "path": "spectralbridge.polygon_extraction._validate_extracted_directories",
          "signature": "_validate_extracted_directories(plot_directories: Set[Path]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 394,
          "methods": [],
          "name": "_generate_spectral_plots",
          "parameters": [
            {
              "annotation": "Set[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "plot_directories"
            }
          ],
          "path": "spectralbridge.polygon_extraction._generate_spectral_plots",
          "signature": "_generate_spectral_plots(plot_directories: Set[Path]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Generate spectral plots for each Parquet file within ``directory``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 410,
          "methods": [],
          "name": "plot_spectra_from_parquet_dir",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": "Optional[str]",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "output_dir"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "recursive"
            },
            {
              "annotation": "int",
              "default": "5000",
              "kind": "positional-or-keyword",
              "name": "max_lines_per_file"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "positional-or-keyword",
              "name": "median_sample_rows"
            },
            {
              "annotation": "float",
              "default": "-9990",
              "kind": "positional-or-keyword",
              "name": "sentinel_at_or_below"
            },
            {
              "annotation": "int",
              "default": "1",
              "kind": "positional-or-keyword",
              "name": "mask_integer_lo"
            },
            {
              "annotation": "int",
              "default": "255",
              "kind": "positional-or-keyword",
              "name": "mask_integer_hi"
            },
            {
              "annotation": "int",
              "default": "200",
              "kind": "positional-or-keyword",
              "name": "dpi"
            }
          ],
          "path": "spectralbridge.polygon_extraction.plot_spectra_from_parquet_dir",
          "signature": "plot_spectra_from_parquet_dir(directory, output_dir: Optional[str]=None, recursive: bool=True, max_lines_per_file: int=5000, median_sample_rows: int=50000, sentinel_at_or_below: float=-9990, mask_integer_lo: int=1, mask_integer_hi: int=255, dpi: int=200)",
          "summary": "Generate spectral plots for each Parquet file within ``directory``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Choose one product per domain/site/date/time group, preferring masked and BRDF-corrected ENVI candidates.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 547,
          "methods": [],
          "name": "select_best_files",
          "parameters": [
            {
              "annotation": "List[DataFile]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "files"
            }
          ],
          "path": "spectralbridge.polygon_extraction.select_best_files",
          "signature": "select_best_files(files: List[DataFile]) -> List[DataFile]",
          "summary": "Choose one product per domain/site/date/time group, preferring masked and BRDF-corrected ENVI candidates.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Discover typed resampled products and apply the established per-flight product preference.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 571,
          "methods": [],
          "name": "find_best_resampled_files",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "suffix"
            }
          ],
          "path": "spectralbridge.polygon_extraction.find_best_resampled_files",
          "signature": "find_best_resampled_files(directory: Path, suffix: str) -> List[NEONReflectanceResampledENVIFile]",
          "summary": "Discover typed resampled products and apply the established per-flight product preference.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return all raster files in ``base_dir`` prioritising BRDF corrected files first.\n\nPreviously this function attempted to select a single \"best\" raster per\n(domain, site, date, time) combination which meant only one file was\nprocessed when multiple valid rasters were present in the directory.  The\npolygon extraction workflow now requires that every available raster be\nprocessed, so we gather all matches while still preferring BRDF corrected\nrasters when duplicates exist.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 578,
          "methods": [],
          "name": "get_all_priority_rasters",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_dir"
            },
            {
              "annotation": "str",
              "default": "'envi'",
              "kind": "positional-or-keyword",
              "name": "suffix"
            }
          ],
          "path": "spectralbridge.polygon_extraction.get_all_priority_rasters",
          "signature": "get_all_priority_rasters(base_dir: Path, suffix: str='envi') -> List[DataFile]",
          "summary": "Return all raster files in ``base_dir`` prioritising BRDF corrected files first.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Reads an ENVI .hdr file and extracts the CRS as a Proj string or EPSG code.\n\nParameters:\n- hdr_path (str): Path to the .hdr file.\n\nReturns:\n- crs (rasterio.crs.CRS or None): CRS object if found, else None.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 612,
          "methods": [],
          "name": "get_crs_from_hdr",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.polygon_extraction.get_crs_from_hdr",
          "signature": "get_crs_from_hdr(hdr_path)",
          "summary": "Reads an ENVI .hdr file and extracts the CRS as a Proj string or EPSG code.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Processes a raster file in chunks, intersects pixels with a polygon, and writes extracted\nspectral and spatial data to a Parquet file. Existing outputs are reused unless\n``overwrite`` is ``True``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 662,
          "methods": [],
          "name": "process_raster_in_chunks",
          "parameters": [
            {
              "annotation": "DataFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raster_file"
            },
            {
              "annotation": "Optional[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_path"
            },
            {
              "annotation": "DataFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_parquet_file"
            },
            {
              "annotation": null,
              "default": "100000",
              "kind": "positional-or-keyword",
              "name": "chunk_size"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.polygon_extraction.process_raster_in_chunks",
          "signature": "process_raster_in_chunks(raster_file: DataFile, polygon_path: Optional[Path], output_parquet_file: DataFile, chunk_size=100000, *, overwrite: bool=False)",
          "summary": "Processes a raster file in chunks, intersects pixels with a polygon, and writes extracted",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/polygon_extraction.py",
      "sha256": "002a918db72826a75d5c088014679ac6e1c11ecf4487b5dd58d2f6349a748f0a"
    },
    {
      "area": "io",
      "constants": [],
      "declared_exports": [
        "build_polygon_pixel_index",
        "create_dummy_polygon",
        "extract_polygon_parquets_for_flightline",
        "filter_polygons_by_overlap",
        "merge_polygon_parquets_for_flightline",
        "run_polygon_pipeline_for_flightline",
        "validate_coordinate_match",
        "visualize_polygons_on_envi"
      ],
      "docstring": "Polygon extraction helpers for building spectral libraries.\n\nThis module provides utilities for extracting polygon-based subsets from the\nper-pixel Parquet products that the SpectralBridge pipeline already\nproduces.  The helpers are intentionally orthogonal to the default flightline\npipeline so that they can be orchestrated separately while the workflow is\nstabilised.",
      "export_expressions": [
        "__all__ = ['build_polygon_pixel_index', 'extract_polygon_parquets_for_flightline', 'merge_polygon_parquets_for_flightline', 'run_polygon_pipeline_for_flightline', 'create_dummy_polygon', 'filter_polygons_by_overlap', 'visualize_polygons_on_envi', 'validate_coordinate_match']"
      ],
      "imports": {
        "AffineClass": "affine.Affine",
        "Dict": "typing.Dict",
        "FlightlinePaths": "spectralbridge.paths.FlightlinePaths",
        "Mapping": "typing.Mapping",
        "Path": "pathlib.Path",
        "_map_info_core": "cross_sensor_cal.io.neon._map_info_core",
        "_parse_envi_header_tolerant": "cross_sensor_cal.envi._parse_envi_header_tolerant",
        "_write_parquet_chunks": "cross_sensor_cal.parquet_export._write_parquet_chunks",
        "annotations": "__future__.annotations",
        "box": "shapely.geometry.box",
        "ensure_coord_columns": "cross_sensor_cal.exports.schema_utils.ensure_coord_columns",
        "get_crs_from_hdr": "cross_sensor_cal.polygon_extraction.get_crs_from_hdr",
        "hdr_to_dict": "cross_sensor_cal.envi.hdr_to_dict",
        "infer_stage_from_name": "cross_sensor_cal.exports.schema_utils.infer_stage_from_name",
        "is_bool_dtype": "pandas.api.types.is_bool_dtype",
        "is_datetime64_any_dtype": "pandas.api.types.is_datetime64_any_dtype",
        "is_float_dtype": "pandas.api.types.is_float_dtype",
        "is_integer_dtype": "pandas.api.types.is_integer_dtype",
        "is_numeric_dtype": "pandas.api.types.is_numeric_dtype",
        "is_object_dtype": "pandas.api.types.is_object_dtype",
        "is_string_dtype": "pandas.api.types.is_string_dtype",
        "rasterize": "rasterio.features.rasterize",
        "read_envi_in_chunks": "cross_sensor_cal.parquet_export.read_envi_in_chunks",
        "require_geopandas": "spectralbridge._optional.require_geopandas",
        "require_rasterio": "spectralbridge._optional.require_rasterio",
        "wavelengths_from_hdr": "cross_sensor_cal.header_utils.wavelengths_from_hdr",
        "xy": "rasterio.transform.xy"
      },
      "module": "spectralbridge.polygons",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 38,
          "methods": [],
          "name": "_series_has_binary_values",
          "parameters": [
            {
              "annotation": "pd.Series",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "series"
            }
          ],
          "path": "spectralbridge.polygons._series_has_binary_values",
          "signature": "_series_has_binary_values(series: pd.Series) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Infer stable pandas dtypes for polygon metadata columns.\n\nChunked polygon extraction writes Parquet incrementally. If the first chunk\nhappens to contain only missing values for a text field, PyArrow can infer\nArrow ``null`` and lock the file schema before later chunks contribute real\nstrings. We infer stable metadata dtypes from the full polygon index so\nevery emitted chunk keeps the same text/binary/datetime/int contract.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 46,
          "methods": [],
          "name": "_infer_polygon_metadata_dtypes",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_index_df"
            }
          ],
          "path": "spectralbridge.polygons._infer_polygon_metadata_dtypes",
          "signature": "_infer_polygon_metadata_dtypes(polygon_index_df: pd.DataFrame) -> dict[str, object]",
          "summary": "Infer stable pandas dtypes for polygon metadata columns.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Normalize polygon metadata columns to stable chunk-safe dtypes.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 114,
          "methods": [],
          "name": "_normalize_polygon_metadata_chunk",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df"
            },
            {
              "annotation": "Mapping[str, object]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metadata_dtypes"
            }
          ],
          "path": "spectralbridge.polygons._normalize_polygon_metadata_chunk",
          "signature": "_normalize_polygon_metadata_chunk(df: pd.DataFrame, metadata_dtypes: Mapping[str, object]) -> pd.DataFrame",
          "summary": "Normalize polygon metadata columns to stable chunk-safe dtypes.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Create a dummy polygon covering a portion of the flightline.\n\nCreates a simple rectangular polygon. If `pixel_size` is provided, creates\na polygon covering exactly that many pixels (e.g., (4, 4) for a 4x4 pixel\npolygon). Otherwise, creates a polygon covering (100 - buffer_pct*2)% of\nthe image, centered.\n\nParameters\n----------\nflight_paths : FlightlinePaths\n    Flightline paths object\nreference_product : str, default \"brdfandtopo_corrected_envi\"\n    Reference product to use for determining image bounds\npixel_size : tuple[int, int] | None, optional\n    Size of polygon in pixels (width, height). If provided, creates a\n    polygon covering exactly these pixels from the center of the image.\n    Example: (4, 4) for a 4x4 pixel polygon.\n    If None, uses buffer_pct instead.\nbuffer_pct : float, default 0.1\n    Percentage to buffer from edges (0.1 = 10% buffer on each side).\n    Only used if pixel_size is None.\noutput_path : Path | str | None, optional\n    Output path for the dummy polygon GeoJSON. If None, creates:\n    <flight_id>_dummy_polygon.geojson\n\nReturns\n-------\nPath\n    Path to the created dummy polygon GeoJSON file\n\nNotes\n-----\nTo use a different polygon, provide a GeoJSON file path to `polygon_path`\nin `go_forth_and_multiply()` instead of using this function.",
          "examples": [],
          "exports": [
            "spectralbridge.polygons.create_dummy_polygon"
          ],
          "kind": "function",
          "line": 175,
          "methods": [],
          "name": "create_dummy_polygon",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "str",
              "default": "'brdfandtopo_corrected_envi'",
              "kind": "positional-or-keyword",
              "name": "reference_product"
            },
            {
              "annotation": "tuple[int, int] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "pixel_size"
            },
            {
              "annotation": "float",
              "default": "0.1",
              "kind": "positional-or-keyword",
              "name": "buffer_pct"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "output_path"
            }
          ],
          "path": "spectralbridge.polygons.create_dummy_polygon",
          "signature": "create_dummy_polygon(flight_paths: FlightlinePaths, reference_product: str='brdfandtopo_corrected_envi', pixel_size: tuple[int, int] | None=None, buffer_pct: float=0.1, output_path: Path | str | None=None) -> Path",
          "summary": "Create a dummy polygon covering a portion of the flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validate that polygon and ENVI coordinates match.\n\nParameters\n----------\npolygons\n    GeoDataFrame containing polygons to validate\nimg_path : Path\n    Path to ENVI image file\nhdr_path : Path\n    Path to ENVI header file\ntolerance_m : float, default 100.0\n    Tolerance in meters for coordinate validation\n\nReturns\n-------\ntuple[bool, str]\n    (is_valid, message) - True if coordinates match, False otherwise with error message",
          "examples": [],
          "exports": [
            "spectralbridge.polygons.validate_coordinate_match"
          ],
          "kind": "function",
          "line": 561,
          "methods": [],
          "name": "validate_coordinate_match",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygons"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            },
            {
              "annotation": "float",
              "default": "10000.0",
              "kind": "keyword-only",
              "name": "tolerance_m"
            }
          ],
          "path": "spectralbridge.polygons.validate_coordinate_match",
          "signature": "validate_coordinate_match(polygons, img_path: Path, hdr_path: Path, *, tolerance_m: float=10000.0) -> tuple[bool, str]",
          "summary": "Validate that polygon and ENVI coordinates match.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Filter polygons from GeoJSON that overlap the flightline.\n\nParameters\n----------\npolygons_path : str | Path\n    Path to GeoJSON file containing polygons\nflight_paths : FlightlinePaths\n    Flightline paths object\nreference_product : str, default \"brdfandtopo_corrected_envi\"\n    Reference product to use for determining flightline bounds\nmin_overlap_pct : float, default 0.0\n    Minimum percentage of polygon area that must overlap with flightline.\n    Set to 0.0 to include any polygon that touches the flightline.\n    Set to 1.0 to only include polygons completely inside the flightline.\noutput_path : Path | str | None, optional\n    Path to save filtered GeoJSON. If None, saves to flightline directory.\nsearch_buffer_m : float, default 0.0\n    Buffer distance in meters to expand the flightline search area.\n    Polygons within this distance of the flightline will be included even if\n    they don't directly overlap. Useful when polygons are nearby but don't\n    intersect due to precision issues or small gaps.\n\nReturns\n-------\ntuple[Path, pd.DataFrame]\n    Path to filtered GeoJSON file and DataFrame with overlap statistics",
          "examples": [],
          "exports": [
            "spectralbridge.polygons.filter_polygons_by_overlap"
          ],
          "kind": "function",
          "line": 701,
          "methods": [],
          "name": "filter_polygons_by_overlap",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygons_path"
            },
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "str",
              "default": "'brdfandtopo_corrected_envi'",
              "kind": "positional-or-keyword",
              "name": "reference_product"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "positional-or-keyword",
              "name": "min_overlap_pct"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "output_path"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "validate_coords"
            },
            {
              "annotation": "float",
              "default": "0.0",
              "kind": "keyword-only",
              "name": "search_buffer_m"
            }
          ],
          "path": "spectralbridge.polygons.filter_polygons_by_overlap",
          "signature": "filter_polygons_by_overlap(polygons_path: str | Path, flight_paths: FlightlinePaths, reference_product: str='brdfandtopo_corrected_envi', min_overlap_pct: float=0.0, *, output_path: Path | str | None=None, validate_coords: bool=True, search_buffer_m: float=0.0) -> tuple[Path, pd.DataFrame]",
          "summary": "Filter polygons from GeoJSON that overlap the flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Create a visualization showing polygons overlaid on ENVI RGB image.\n\nParameters\n----------\nflight_paths : FlightlinePaths\n    Flightline paths object\npolygons_path : str | Path\n    Path to GeoJSON file containing polygons\nreference_product : str, default \"brdfandtopo_corrected_envi\"\n    Reference product to use for RGB visualization\noutput_path : Path | str | None, optional\n    Path to save visualization PNG. If None, saves to flightline directory.\nrgb_bands : tuple[float, float, float] | None, optional\n    Wavelengths (nm) for R, G, B bands. If None, uses default (660, 560, 490).\ndpi : int, default 300\n    Resolution for output image\n\nReturns\n-------\nPath\n    Path to saved visualization PNG",
          "examples": [],
          "exports": [
            "spectralbridge.polygons.visualize_polygons_on_envi"
          ],
          "kind": "function",
          "line": 1288,
          "methods": [],
          "name": "visualize_polygons_on_envi",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygons_path"
            },
            {
              "annotation": "str",
              "default": "'brdfandtopo_corrected_envi'",
              "kind": "positional-or-keyword",
              "name": "reference_product"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "tuple[float, float, float] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "rgb_bands"
            },
            {
              "annotation": "int",
              "default": "300",
              "kind": "keyword-only",
              "name": "dpi"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "validate_coords"
            }
          ],
          "path": "spectralbridge.polygons.visualize_polygons_on_envi",
          "signature": "visualize_polygons_on_envi(flight_paths: FlightlinePaths, polygons_path: str | Path, reference_product: str='brdfandtopo_corrected_envi', output_path: Path | str | None=None, *, rgb_bands: tuple[float, float, float] | None=None, dpi: int=300, validate_coords: bool=True) -> Path",
          "summary": "Create a visualization showing polygons overlaid on ENVI RGB image.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Escape a filesystem path for embedding inside DuckDB SQL strings.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1499,
          "methods": [],
          "name": "_quote_path",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.polygons._quote_path",
          "signature": "_quote_path(path: Path) -> str",
          "summary": "Escape a filesystem path for embedding inside DuckDB SQL strings.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a double-quoted SQL identifier.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1505,
          "methods": [],
          "name": "_quote_identifier",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.polygons._quote_identifier",
          "signature": "_quote_identifier(name: str) -> str",
          "summary": "Return a double-quoted SQL identifier.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a DuckDB-safe identifier derived from ``name``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1511,
          "methods": [],
          "name": "_sanitise_alias",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.polygons._sanitise_alias",
          "signature": "_sanitise_alias(name: str) -> str",
          "summary": "Return a DuckDB-safe identifier derived from ``name``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return ``(img, hdr)`` paths for the requested reference product.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1522,
          "methods": [],
          "name": "_resolve_reference_raster",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "reference_product"
            }
          ],
          "path": "spectralbridge.polygons._resolve_reference_raster",
          "signature": "_resolve_reference_raster(flight_paths: FlightlinePaths, reference_product: str) -> tuple[Path, Path]",
          "summary": "Return ``(img, hdr)`` paths for the requested reference product.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return known per-product parquet paths for ``flight_paths``.\n\nThis function discovers ALL parquet files in the flightline directory,\nincluding originals, corrected, resampled (Landsat, MicaSense, etc.),\nand undarkened parquets.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1543,
          "methods": [],
          "name": "_available_product_parquets",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            }
          ],
          "path": "spectralbridge.polygons._available_product_parquets",
          "signature": "_available_product_parquets(flight_paths: FlightlinePaths) -> Dict[str, Path]",
          "summary": "Return known per-product parquet paths for ``flight_paths``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return column names for a parquet file using DuckDB DESCRIBE.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1626,
          "methods": [],
          "name": "_describe_parquet_columns",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.polygons._describe_parquet_columns",
          "signature": "_describe_parquet_columns(con: duckdb.DuckDBPyConnection, path: Path) -> list[str]",
          "summary": "Return column names for a parquet file using DuckDB DESCRIBE.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Persist a DataFrame to parquet via DuckDB to avoid pyarrow dependency.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1633,
          "methods": [],
          "name": "_write_dataframe_parquet",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.polygons._write_dataframe_parquet",
          "signature": "_write_dataframe_parquet(df: pd.DataFrame, path: Path) -> None",
          "summary": "Persist a DataFrame to parquet via DuckDB to avoid pyarrow dependency.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Create a pixel\u2192polygon lookup table for ``flight_paths``.\n\nThe resulting Parquet table includes one row per pixel that intersects any\npolygon.  Columns comprise the canonical pixel identifiers plus polygon\nattributes and geometry stored as WKB.",
          "examples": [],
          "exports": [
            "spectralbridge.polygons.build_polygon_pixel_index"
          ],
          "kind": "function",
          "line": 1650,
          "methods": [],
          "name": "build_polygon_pixel_index",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygons_path"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": "'brdfandtopo_corrected_envi'",
              "kind": "keyword-only",
              "name": "reference_product"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "all_touched"
            }
          ],
          "path": "spectralbridge.polygons.build_polygon_pixel_index",
          "signature": "build_polygon_pixel_index(flight_paths: FlightlinePaths, polygons_path: str | Path, output_path: Path | str | None=None, *, reference_product: str='brdfandtopo_corrected_envi', overwrite: bool=False, all_touched: bool=False) -> Path",
          "summary": "Create a pixel\u2192polygon lookup table for ``flight_paths``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Extract polygon-filtered parquet directly from ENVI file.\n\nThis function reads an ENVI file and extracts only pixels that intersect\nwith the polygon, writing directly to a parquet file. This avoids creating\nthe full parquet file first.\n\nParameters\n----------\nenvi_img : Path\n    Path to ENVI .img file\nenvi_hdr : Path\n    Path to ENVI .hdr file\npolygon_index_path : Path\n    Path to polygon pixel index parquet (from build_polygon_pixel_index)\noutput_parquet_path : Path\n    Output path for the polygon-filtered parquet\nchunk_size : int, default 50_000\n    Chunk size for reading ENVI file\noverwrite : bool, default False\n    Whether to overwrite existing parquet file\n\nReturns\n-------\nPath\n    Path to the created polygon parquet file",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1995,
          "methods": [],
          "name": "extract_polygon_parquet_from_envi",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_img"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "envi_hdr"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_index_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_parquet_path"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.polygons.extract_polygon_parquet_from_envi",
          "signature": "extract_polygon_parquet_from_envi(envi_img: Path, envi_hdr: Path, polygon_index_path: Path, output_parquet_path: Path, *, chunk_size: int=50000, overwrite: bool=False) -> Path",
          "summary": "Extract polygon-filtered parquet directly from ENVI file.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Extract polygon parquets directly from all ENVI files in flightline.\n\nThis discovers all ENVI files and extracts polygon-filtered parquets\ndirectly from them, skipping full parquet creation.\n\nParameters\n----------\nflight_paths : FlightlinePaths\n    Flightline paths object\npolygon_index_path : Path\n    Path to polygon pixel index parquet\nchunk_size : int, default 50_000\n    Chunk size for reading ENVI files\noverwrite : bool, default False\n    Whether to overwrite existing polygon parquets\n\nReturns\n-------\nDict[str, Path]\n    Dictionary mapping product names to polygon parquet paths",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2213,
          "methods": [],
          "name": "extract_all_polygon_parquets_from_envi",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_index_path"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "chunk_size"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.polygons.extract_all_polygon_parquets_from_envi",
          "signature": "extract_all_polygon_parquets_from_envi(flight_paths: FlightlinePaths, polygon_index_path: Path, *, chunk_size: int=50000, overwrite: bool=False) -> Dict[str, Path]",
          "summary": "Extract polygon parquets directly from all ENVI files in flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Filter per-product Parquet tables down to polygon pixels.",
          "examples": [],
          "exports": [
            "spectralbridge.polygons.extract_polygon_parquets_for_flightline"
          ],
          "kind": "function",
          "line": 2299,
          "methods": [],
          "name": "extract_polygon_parquets_for_flightline",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "Path | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_index_path"
            },
            {
              "annotation": "list[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "products"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.polygons.extract_polygon_parquets_for_flightline",
          "signature": "extract_polygon_parquets_for_flightline(flight_paths: FlightlinePaths, polygon_index_path: Path | str, products: list[str] | None=None, *, overwrite: bool=False) -> Dict[str, Path]",
          "summary": "Filter per-product Parquet tables down to polygon pixels.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Merge polygon-filtered Parquet tables into one spectral library.",
          "examples": [],
          "exports": [
            "spectralbridge.polygons.merge_polygon_parquets_for_flightline"
          ],
          "kind": "function",
          "line": 2382,
          "methods": [],
          "name": "merge_polygon_parquets_for_flightline",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "Path | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_index_path"
            },
            {
              "annotation": "Mapping[str, Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "product_polygon_parquets"
            },
            {
              "annotation": "Path | str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            },
            {
              "annotation": "int",
              "default": "25000",
              "kind": "keyword-only",
              "name": "row_group_size"
            }
          ],
          "path": "spectralbridge.polygons.merge_polygon_parquets_for_flightline",
          "signature": "merge_polygon_parquets_for_flightline(flight_paths: FlightlinePaths, polygon_index_path: Path | str, product_polygon_parquets: Mapping[str, Path], output_path: Path | str | None=None, *, overwrite: bool=False, row_group_size: int=25000) -> Path",
          "summary": "Merge polygon-filtered Parquet tables into one spectral library.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Execute the polygon pipeline end-to-end for one flightline.",
          "examples": [],
          "exports": [
            "spectralbridge.polygons.run_polygon_pipeline_for_flightline"
          ],
          "kind": "function",
          "line": 2488,
          "methods": [],
          "name": "run_polygon_pipeline_for_flightline",
          "parameters": [
            {
              "annotation": "FlightlinePaths",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_paths"
            },
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygons_path"
            },
            {
              "annotation": "list[str] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "products"
            },
            {
              "annotation": "str",
              "default": "'brdfandtopo_corrected_envi'",
              "kind": "keyword-only",
              "name": "reference_product"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "overwrite"
            }
          ],
          "path": "spectralbridge.polygons.run_polygon_pipeline_for_flightline",
          "signature": "run_polygon_pipeline_for_flightline(flight_paths: FlightlinePaths, polygons_path: str | Path, *, products: list[str] | None=None, reference_product: str='brdfandtopo_corrected_envi', overwrite: bool=False) -> Dict[str, object]",
          "summary": "Execute the polygon pipeline end-to-end for one flightline.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/polygons.py",
      "sha256": "484afaa6a87e6cc240ffd914a6ac709eb21cbf586c6722838d88303a789a9dd8"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "Utilities for consistent tile-based progress reporting.",
      "export_expressions": [],
      "imports": {
        "Optional": "typing.Optional",
        "annotations": "__future__.annotations",
        "tqdm": "tqdm.tqdm"
      },
      "module": "spectralbridge.progress_utils",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Unified progress reporter for tile-based loops.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 11,
          "methods": [
            {
              "docstring": "",
              "line": 14,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "stage_name"
                },
                {
                  "annotation": "int",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "total_tiles"
                },
                {
                  "annotation": "bool",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "interactive_mode"
                },
                {
                  "annotation": "int",
                  "default": "25",
                  "kind": "positional-or-keyword",
                  "name": "log_every"
                }
              ],
              "private": true,
              "signature": "__init__(self, stage_name: str, total_tiles: int, interactive_mode: bool, log_every: int=25) -> None"
            },
            {
              "docstring": "",
              "line": 40,
              "name": "update",
              "parameters": [
                {
                  "annotation": "int",
                  "default": "1",
                  "kind": "positional-or-keyword",
                  "name": "n"
                }
              ],
              "private": false,
              "signature": "update(self, n: int=1) -> None"
            },
            {
              "docstring": "",
              "line": 55,
              "name": "close",
              "parameters": [],
              "private": false,
              "signature": "close(self) -> None"
            }
          ],
          "name": "TileProgressReporter",
          "parameters": [],
          "path": "spectralbridge.progress_utils.TileProgressReporter",
          "signature": null,
          "summary": "Unified progress reporter for tile-based loops.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/progress_utils.py",
      "sha256": "03192732afc0df21f619d5fcefd6780ed0d597314a5e83d786380b6521b8f5e2"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "QAStatus",
        "QAThresholds",
        "StageQAReport",
        "assemble_combined_report",
        "brightness_correction_metrics",
        "chunk_invariance_metrics",
        "cycle_consistency_metrics",
        "emit_stage_qa",
        "grouped_residual_metrics",
        "linear_diagnostic",
        "path_consistency_metrics",
        "reflectance_summary",
        "residual_metrics",
        "run_completed_flightline_qa",
        "seam_score",
        "spectral_response_support",
        "translation_edge_metrics"
      ],
      "docstring": "Stage-level and cross-stage scientific quality assurance.\n\nThe legacy :mod:`spectralbridge.qa_plots` renderer remains supported.  This\npackage adds deterministic machine-readable stage reports, explicit status\nclassification, reusable diagnostics, and combined report assembly.",
      "export_expressions": [
        "__all__ = ['QAStatus', 'QAThresholds', 'StageQAReport', 'assemble_combined_report', 'brightness_correction_metrics', 'chunk_invariance_metrics', 'cycle_consistency_metrics', 'emit_stage_qa', 'grouped_residual_metrics', 'linear_diagnostic', 'reflectance_summary', 'residual_metrics', 'run_completed_flightline_qa', 'path_consistency_metrics', 'seam_score', 'spectral_response_support', 'translation_edge_metrics']"
      ],
      "imports": {
        "QAStatus": "spectralbridge.qa.schema.QAStatus",
        "QAThresholds": "spectralbridge.qa.thresholds.QAThresholds",
        "StageQAReport": "spectralbridge.qa.schema.StageQAReport",
        "assemble_combined_report": "spectralbridge.qa.reporting.assemble_combined_report",
        "brightness_correction_metrics": "spectralbridge.qa.brightness.brightness_correction_metrics",
        "chunk_invariance_metrics": "spectralbridge.qa.metrics.chunk_invariance_metrics",
        "cycle_consistency_metrics": "spectralbridge.qa.network.cycle_consistency_metrics",
        "emit_stage_qa": "spectralbridge.qa.stages.emit_stage_qa",
        "grouped_residual_metrics": "spectralbridge.qa.network.grouped_residual_metrics",
        "linear_diagnostic": "spectralbridge.qa.metrics.linear_diagnostic",
        "path_consistency_metrics": "spectralbridge.qa.network.path_consistency_metrics",
        "reflectance_summary": "spectralbridge.qa.metrics.reflectance_summary",
        "residual_metrics": "spectralbridge.qa.metrics.residual_metrics",
        "run_completed_flightline_qa": "spectralbridge.qa.runner.run_completed_flightline_qa",
        "seam_score": "spectralbridge.qa.metrics.seam_score",
        "spectral_response_support": "spectralbridge.qa.metrics.spectral_response_support",
        "translation_edge_metrics": "spectralbridge.qa.network.translation_edge_metrics"
      },
      "module": "spectralbridge.qa",
      "objects": [],
      "path": "src/spectralbridge/qa/__init__.py",
      "sha256": "69728a21086698628004da6eaea6d43a44b912f0db9a15c88320f2475da9e470"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "brightness_correction_metrics"
      ],
      "docstring": "Numerical diagnostics for the persisted brightness-correction step.\n\nThese helpers audit before/after products.  They do not apply, refit, or\notherwise change the correction coefficients used by the pipeline.",
      "export_expressions": [
        "__all__ = ['brightness_correction_metrics']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Mapping": "typing.Mapping",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.qa.brightness",
      "objects": [
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Summarize a bandwise multiplicative brightness correction.\n\nParameters\n----------\nbefore, after : numpy.ndarray\n    Matching band-first arrays in unit reflectance. Invalid cells must be\n    represented by ``NaN`` before calling this function.\nexpected_percent : Mapping[int, float], optional\n    One-based band indices mapped to the configured percent adjustment.\n\nReturns\n-------\ndict\n    Per-band fitted gains, intercepts, fit quality, quantiles, and the\n    difference between fitted and configured gain.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.brightness_correction_metrics",
            "spectralbridge.qa.brightness.brightness_correction_metrics"
          ],
          "kind": "function",
          "line": 14,
          "methods": [],
          "name": "brightness_correction_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "before"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "after"
            },
            {
              "annotation": "Mapping[int, float] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "expected_percent"
            }
          ],
          "path": "spectralbridge.qa.brightness.brightness_correction_metrics",
          "signature": "brightness_correction_metrics(before: np.ndarray, after: np.ndarray, *, expected_percent: Mapping[int, float] | None=None) -> dict[str, Any]",
          "summary": "Summarize a bandwise multiplicative brightness correction.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/brightness.py",
      "sha256": "7fcf60a1b2dd10ae82e286d43d4d60476ef83a628ae0f172f75c4f412ef371d3"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "chunk_invariance_metrics",
        "linear_diagnostic",
        "reflectance_summary",
        "residual_metrics",
        "seam_score",
        "spectral_response_support"
      ],
      "docstring": "Reusable deterministic numerical diagnostics for scientific QA.",
      "export_expressions": [
        "__all__ = ['chunk_invariance_metrics', 'linear_diagnostic', 'reflectance_summary', 'residual_metrics', 'seam_score', 'spectral_response_support']"
      ],
      "imports": {
        "Any": "typing.Any",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.qa.metrics",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 10,
          "methods": [],
          "name": "_finite_values",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "nodata"
            }
          ],
          "path": "spectralbridge.qa.metrics._finite_values",
          "signature": "_finite_values(values: np.ndarray, nodata: float | None=None) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Summarize valid support and distribution without changing reflectance scale.\n\nParameters\n----------\nvalues : np.ndarray\n    Numeric reflectance values of any shape; stored scale is retained and finite values are summarized without clipping.\nnodata : float | None, default=None\n    Optional numeric nodata sentinel excluded alongside nonfinite values; None excludes only nonfinite values.\nplausible_max : float, default=1.2\n    Upper reflectance screening threshold for the reported overbright fraction, in the input units; values are counted, not clipped.\n\nReturns\n-------\ndict[str, float | int | None]\n    Total/valid counts, valid/missing fractions, quantiles, extrema and negative/overbright fractions; unsupported numeric summaries are None.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\n>>> from spectralbridge.qa.metrics import reflectance_summary\n>>> result = reflectance_summary([.1, .2, float(\"nan\")])\n>>> assert result[\"n_valid\"] == 2",
          "examples": [],
          "exports": [
            "spectralbridge.qa.reflectance_summary",
            "spectralbridge.qa.metrics.reflectance_summary"
          ],
          "kind": "function",
          "line": 21,
          "methods": [],
          "name": "reflectance_summary",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "nodata"
            },
            {
              "annotation": "float",
              "default": "1.2",
              "kind": "keyword-only",
              "name": "plausible_max"
            }
          ],
          "path": "spectralbridge.qa.metrics.reflectance_summary",
          "signature": "reflectance_summary(values: np.ndarray, *, nodata: float | None=None, plausible_max: float=1.2) -> dict[str, float | int | None]",
          "summary": "Summarize valid support and distribution without changing reflectance scale.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Fit ``y = intercept + slope*x`` for diagnostic, not inferential, use.\n\nParameters\n----------\nx : np.ndarray\n    Paired numeric observations flattened to equal-length vectors; nonfinite pairs are omitted from descriptive linear fitting.\ny : np.ndarray\n    Paired numeric observations flattened to equal-length vectors; nonfinite pairs are omitted from descriptive linear fitting.\n\nReturns\n-------\ndict[str, float | int | None]\n    Finite-pair count, intercept, slope, correlation, squared correlation and fitted-line RMSE; insufficient or constant-x support yields None metrics.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.\n\nExamples\n--------\n>>> from spectralbridge.qa.metrics import linear_diagnostic\n>>> result = linear_diagnostic([.1, .2, .3], [.2, .4, .6])\n>>> assert abs(result[\"slope\"] - 2) < 1e-12",
          "examples": [],
          "exports": [
            "spectralbridge.qa.linear_diagnostic",
            "spectralbridge.qa.metrics.linear_diagnostic"
          ],
          "kind": "function",
          "line": 93,
          "methods": [],
          "name": "linear_diagnostic",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            }
          ],
          "path": "spectralbridge.qa.metrics.linear_diagnostic",
          "signature": "linear_diagnostic(x: np.ndarray, y: np.ndarray) -> dict[str, float | int | None]",
          "summary": "Fit ``y = intercept + slope*x`` for diagnostic, not inferential, use.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Return held-out-style residual metrics for paired observations.\n\nParameters\n----------\nobserved : np.ndarray\n    Paired measured/reference and predicted values in common units; nonfinite pairs are omitted and residuals are predicted minus observed.\npredicted : np.ndarray\n    Paired measured/reference and predicted values in common units; nonfinite pairs are omitted and residuals are predicted minus observed.\n\nReturns\n-------\ndict[str, float | int | None]\n    Finite-pair count, predicted-minus-observed bias, MAE, RMSE, unbiased RMSE and descriptive fit diagnostics; no support yields None metrics.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.\n\nExamples\n--------\n>>> from spectralbridge.qa.metrics import residual_metrics\n>>> assert residual_metrics([.1, .2], [.1, .2])[\"rmse\"] == 0",
          "examples": [],
          "exports": [
            "spectralbridge.qa.residual_metrics",
            "spectralbridge.qa.metrics.residual_metrics"
          ],
          "kind": "function",
          "line": 149,
          "methods": [],
          "name": "residual_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observed"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predicted"
            }
          ],
          "path": "spectralbridge.qa.metrics.residual_metrics",
          "signature": "residual_metrics(observed: np.ndarray, predicted: np.ndarray) -> dict[str, float | int | None]",
          "summary": "Return held-out-style residual metrics for paired observations.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 209,
          "methods": [],
          "name": "_as_band_first",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "image"
            }
          ],
          "path": "spectralbridge.qa.metrics._as_band_first",
          "signature": "_as_band_first(image: np.ndarray) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Compare gradients crossing chunk boundaries with interior neighbors.\n\nParameters\n----------\nimage : np.ndarray\n    Raster diagnostic array; two-dimensional data or the established band-first cube convention is expected, with no implicit unit conversion.\nchunk_rows : int\n    Positive computational block size in rows/columns, used to locate expected processing seams.\nchunk_cols : int\n    Positive computational block size in rows/columns, used to locate expected processing seams.\nnodata : float | None, default=None\n    Optional numeric nodata sentinel excluded alongside nonfinite values; None excludes only nonfinite values.\n\nReturns\n-------\ndict[str, Any]\n    Per-band seam/interior gradient ratios and median, 95th-percentile and maximum seam scores; landscape edges can also produce large ratios.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nA score near one means chunk boundaries are not unusually discontinuous.\nScores above one require interpretation because genuine landscape edges can\ncoincide with a computational boundary.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.seam_score",
            "spectralbridge.qa.metrics.seam_score"
          ],
          "kind": "function",
          "line": 222,
          "methods": [],
          "name": "seam_score",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "image"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_rows"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_cols"
            },
            {
              "annotation": "float | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "nodata"
            }
          ],
          "path": "spectralbridge.qa.metrics.seam_score",
          "signature": "seam_score(image: np.ndarray, *, chunk_rows: int, chunk_cols: int, nodata: float | None=None) -> dict[str, Any]",
          "summary": "Compare gradients crossing chunk boundaries with interior neighbors.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Compare two outputs that should be scientifically identical.\n\nParameters\n----------\nbaseline : np.ndarray\n    Same-shaped reference and comparison outputs; only jointly finite cells contribute to invariance diagnostics.\ncandidate : np.ndarray\n    Same-shaped reference and comparison outputs; only jointly finite cells contribute to invariance diagnostics.\ntolerance : float, default=1e-06\n    Absolute numerical tolerance in the compared quantity: reflectance for chunk checks, additive RMSE for candidate ambiguity.\n\nReturns\n-------\ndict[str, float | int | None]\n    Jointly finite count, absolute-difference quantiles, RMSE and fraction exceeding tolerance; invalid-support differences are not counted.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.\n\nExamples\n--------\n>>> from spectralbridge.qa.metrics import chunk_invariance_metrics\n>>> assert chunk_invariance_metrics([.1, .2], [.1, .2])[\"rmse\"] == 0",
          "examples": [],
          "exports": [
            "spectralbridge.qa.chunk_invariance_metrics",
            "spectralbridge.qa.metrics.chunk_invariance_metrics"
          ],
          "kind": "function",
          "line": 326,
          "methods": [],
          "name": "chunk_invariance_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "baseline"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "candidate"
            },
            {
              "annotation": "float",
              "default": "1e-06",
              "kind": "keyword-only",
              "name": "tolerance"
            }
          ],
          "path": "spectralbridge.qa.metrics.chunk_invariance_metrics",
          "signature": "chunk_invariance_metrics(baseline: np.ndarray, candidate: np.ndarray, *, tolerance: float=1e-06) -> dict[str, float | int | None]",
          "summary": "Compare two outputs that should be scientifically identical.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Quantify SRF normalization and support on available source wavelengths.\n\nParameters\n----------\nsource_wavelengths : np.ndarray\n    Finite wavelength coordinates in nanometers, aligned with spectral columns; numerical analysis routines require strictly increasing unique coordinates.\nresponse : np.ndarray\n    Spectral-response weights aligned with source_wavelengths; finite nonnegative support determines normalization and effective wavelength.\nvalid_source_mask : np.ndarray | None, default=None\n    Optional boolean vector matching the spectral response; True marks available source coordinates for coverage reporting.\n\nReturns\n-------\ndict[str, float | int | None]\n    Response weight sum, effective wavelength in nanometers, admitted coverage fraction and source-support counts.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.spectral_response_support",
            "spectralbridge.qa.metrics.spectral_response_support"
          ],
          "kind": "function",
          "line": 393,
          "methods": [],
          "name": "spectral_response_support",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_wavelengths"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "response"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "valid_source_mask"
            }
          ],
          "path": "spectralbridge.qa.metrics.spectral_response_support",
          "signature": "spectral_response_support(source_wavelengths: np.ndarray, response: np.ndarray, *, valid_source_mask: np.ndarray | None=None) -> dict[str, float | int | None]",
          "summary": "Quantify SRF normalization and support on available source wavelengths.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/metrics.py",
      "sha256": "eb1d2b806f3e06345ed22a59254936c8dbba90d3fc29eebceb9ec5f9880f8af8"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "cycle_consistency_metrics",
        "grouped_residual_metrics",
        "path_consistency_metrics",
        "translation_edge_metrics"
      ],
      "docstring": "Diagnostics for empirical sensor translations and translation networks.\n\nThese functions evaluate supplied predictions. They do not fit translation\nmodels and therefore cannot accidentally turn in-sample fits into validation\nevidence.",
      "export_expressions": [
        "__all__ = ['cycle_consistency_metrics', 'grouped_residual_metrics', 'path_consistency_metrics', 'translation_edge_metrics']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Iterable": "collections.abc.Iterable",
        "annotations": "__future__.annotations",
        "residual_metrics": "spectralbridge.qa.metrics.residual_metrics"
      },
      "module": "spectralbridge.qa.network",
      "objects": [
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Evaluate one sensor-to-sensor edge from paired held-out observations.\n\nParameters\n----------\nobserved : np.ndarray\n    Paired measured/reference and predicted values in common units; nonfinite pairs are omitted and residuals are predicted minus observed.\npredicted : np.ndarray\n    Paired measured/reference and predicted values in common units; nonfinite pairs are omitted and residuals are predicted minus observed.\n\nReturns\n-------\ndict[str, float | int | None]\n    Paired residual metrics in the target units; high R-squared alone does not certify interchangeability.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.translation_edge_metrics",
            "spectralbridge.qa.network.translation_edge_metrics"
          ],
          "kind": "function",
          "line": 18,
          "methods": [],
          "name": "translation_edge_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observed"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predicted"
            }
          ],
          "path": "spectralbridge.qa.network.translation_edge_metrics",
          "signature": "translation_edge_metrics(observed: np.ndarray, predicted: np.ndarray) -> dict[str, float | int | None]",
          "summary": "Evaluate one sensor-to-sensor edge from paired held-out observations.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Return residual metrics by an explicit validation block.\n\nParameters\n----------\nobserved : np.ndarray\n    Paired measured/reference and predicted values in common units; nonfinite pairs are omitted and residuals are predicted minus observed.\npredicted : np.ndarray\n    Paired measured/reference and predicted values in common units; nonfinite pairs are omitted and residuals are predicted minus observed.\ngroups : Iterable[Any]\n    Aligned independent-unit identifiers; keep repeated observations or parent-connected mixtures in the same group. None uses the function-specific row-based convention described in Notes.\n\nReturns\n-------\ndict[str, Any]\n    Explicit per-group residual summaries and an overall paired summary; the supplied group variable is not independently validated.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\n``groups`` should identify held-out sites, dates, campaigns, or flightlines.\nThe function reports, but does not invent, the blocking strategy.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.grouped_residual_metrics",
            "spectralbridge.qa.network.grouped_residual_metrics"
          ],
          "kind": "function",
          "line": 44,
          "methods": [],
          "name": "grouped_residual_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "observed"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predicted"
            },
            {
              "annotation": "Iterable[Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "groups"
            }
          ],
          "path": "spectralbridge.qa.network.grouped_residual_metrics",
          "signature": "grouped_residual_metrics(observed: np.ndarray, predicted: np.ndarray, groups: Iterable[Any]) -> dict[str, Any]",
          "summary": "Return residual metrics by an explicit validation block.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Compare a direct translation with a multi-edge translation path.\n\nParameters\n----------\ndirect_prediction : np.ndarray\n    Matched target-sensor predictions from direct and multi-edge translation paths, in common units and row order.\nindirect_prediction : np.ndarray\n    Matched target-sensor predictions from direct and multi-edge translation paths, in common units and row order.\nobserved_target : np.ndarray | None, default=None\n    Optional independently observed target values for residual summaries of each translation path.\n\nReturns\n-------\ndict[str, Any]\n    Direct-versus-indirect residual summary and optional each-path residuals against observed_target.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.path_consistency_metrics",
            "spectralbridge.qa.network.path_consistency_metrics"
          ],
          "kind": "function",
          "line": 101,
          "methods": [],
          "name": "path_consistency_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "direct_prediction"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "indirect_prediction"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "observed_target"
            }
          ],
          "path": "spectralbridge.qa.network.path_consistency_metrics",
          "signature": "path_consistency_metrics(direct_prediction: np.ndarray, indirect_prediction: np.ndarray, *, observed_target: np.ndarray | None=None) -> dict[str, Any]",
          "summary": "Compare a direct translation with a multi-edge translation path.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Measure drift after translating around a sensor cycle back to its start.\n\nParameters\n----------\nstarting_values : np.ndarray\n    Matched values before and after a translation cycle, expressed on the starting sensor support and scale.\ncycled_values : np.ndarray\n    Matched values before and after a translation cycle, expressed on the starting sensor support and scale.\n\nReturns\n-------\ndict[str, float | int | None]\n    Residual drift metrics comparing returned-cycle values with starting values in their common units.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.cycle_consistency_metrics",
            "spectralbridge.qa.network.cycle_consistency_metrics"
          ],
          "kind": "function",
          "line": 143,
          "methods": [],
          "name": "cycle_consistency_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "starting_values"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cycled_values"
            }
          ],
          "path": "spectralbridge.qa.network.cycle_consistency_metrics",
          "signature": "cycle_consistency_metrics(starting_values: np.ndarray, cycled_values: np.ndarray) -> dict[str, float | int | None]",
          "summary": "Measure drift after translating around a sensor cycle back to its start.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/network.py",
      "sha256": "13d265ac969b9559c67442defad9eeff5e8d22c2b7e3443604e2fb7d8c24e5fd"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "CombinedQAPaths",
        "StageQAPaths",
        "normalize_stage_id"
      ],
      "docstring": "Authoritative deterministic paths for stage QA artifacts.",
      "export_expressions": [
        "__all__ = ['CombinedQAPaths', 'StageQAPaths', 'normalize_stage_id']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass"
      },
      "module": "spectralbridge.qa.paths",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Normalize a stage label to a nonempty lowercase underscore identifier for deterministic QA paths.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.paths.normalize_stage_id"
          ],
          "kind": "function",
          "line": 20,
          "methods": [],
          "name": "normalize_stage_id",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage_id"
            }
          ],
          "path": "spectralbridge.qa.paths.normalize_stage_id",
          "signature": "normalize_stage_id(stage_id: str) -> str",
          "summary": "Normalize a stage label to a nonempty lowercase underscore identifier for deterministic QA paths.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "stage_id"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Canonical paths for one stage report.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.paths.StageQAPaths"
          ],
          "kind": "class",
          "line": 30,
          "methods": [
            {
              "docstring": "",
              "line": 36,
              "name": "__post_init__",
              "parameters": [],
              "private": true,
              "signature": "__post_init__(self) -> None"
            },
            {
              "docstring": "",
              "line": 41,
              "name": "stage_order",
              "parameters": [],
              "private": false,
              "signature": "stage_order(self) -> int"
            },
            {
              "docstring": "",
              "line": 45,
              "name": "directory",
              "parameters": [],
              "private": false,
              "signature": "directory(self) -> Path"
            },
            {
              "docstring": "",
              "line": 54,
              "name": "json",
              "parameters": [],
              "private": false,
              "signature": "json(self) -> Path"
            },
            {
              "docstring": "",
              "line": 58,
              "name": "html",
              "parameters": [],
              "private": false,
              "signature": "html(self) -> Path"
            },
            {
              "docstring": "",
              "line": 62,
              "name": "overview_png",
              "parameters": [],
              "private": false,
              "signature": "overview_png(self) -> Path"
            },
            {
              "docstring": "Additional before/after diagnostic for brightness-adjusted products.",
              "line": 66,
              "name": "brightness_png",
              "parameters": [],
              "private": false,
              "signature": "brightness_png(self) -> Path"
            }
          ],
          "name": "StageQAPaths",
          "parameters": [],
          "path": "spectralbridge.qa.paths.StageQAPaths",
          "signature": null,
          "summary": "Canonical paths for one stage report.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Path",
              "default": null,
              "name": "flightline_dir"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Canonical paths for the cross-stage report.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.paths.CombinedQAPaths"
          ],
          "kind": "class",
          "line": 73,
          "methods": [
            {
              "docstring": "",
              "line": 79,
              "name": "directory",
              "parameters": [],
              "private": false,
              "signature": "directory(self) -> Path"
            },
            {
              "docstring": "",
              "line": 83,
              "name": "json",
              "parameters": [],
              "private": false,
              "signature": "json(self) -> Path"
            },
            {
              "docstring": "",
              "line": 87,
              "name": "html",
              "parameters": [],
              "private": false,
              "signature": "html(self) -> Path"
            },
            {
              "docstring": "",
              "line": 91,
              "name": "pdf",
              "parameters": [],
              "private": false,
              "signature": "pdf(self) -> Path"
            },
            {
              "docstring": "",
              "line": 95,
              "name": "evolution_png",
              "parameters": [],
              "private": false,
              "signature": "evolution_png(self) -> Path"
            }
          ],
          "name": "CombinedQAPaths",
          "parameters": [],
          "path": "spectralbridge.qa.paths.CombinedQAPaths",
          "signature": null,
          "summary": "Canonical paths for the cross-stage report.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/paths.py",
      "sha256": "3ddf9112b5334b60e18f413ab2d6040100f2824ce9af6e035a7b8d9eb7eb5426"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "format_location_label",
        "qa_plot_contract",
        "render_artifact_inventory",
        "render_brightness_diagnostics",
        "render_correction_overview",
        "render_correction_parameters",
        "render_envi_overview",
        "render_parquet_overview",
        "spatial_plot_context"
      ],
      "docstring": "Deterministic, legible plots used by stage QA reports.",
      "export_expressions": [
        "__all__ = ['format_location_label', 'qa_plot_contract', 'render_artifact_inventory', 'render_brightness_diagnostics', 'render_correction_parameters', 'render_correction_overview', 'render_envi_overview', 'render_parquet_overview', 'spatial_plot_context']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Path": "pathlib.Path",
        "SymLogNorm": "matplotlib.colors.SymLogNorm",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.qa.plots",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return the machine-readable fixed display contract for QA figures.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.qa_plot_contract"
          ],
          "kind": "function",
          "line": 34,
          "methods": [],
          "name": "qa_plot_contract",
          "parameters": [],
          "path": "spectralbridge.qa.plots.qa_plot_contract",
          "signature": "qa_plot_contract() -> dict[str, Any]",
          "summary": "Return the machine-readable fixed display contract for QA figures.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return a compact location/date label while preserving fallback identity.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.format_location_label"
          ],
          "kind": "function",
          "line": 59,
          "methods": [],
          "name": "format_location_label",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_id"
            }
          ],
          "path": "spectralbridge.qa.plots.format_location_label",
          "signature": "format_location_label(flightline_id: str) -> str",
          "summary": "Return a compact location/date label while preserving fallback identity.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Derive a projected plotting extent from standard ENVI map metadata.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.spatial_plot_context"
          ],
          "kind": "function",
          "line": 77,
          "methods": [],
          "name": "spatial_plot_context",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            },
            {
              "annotation": "tuple[int, int, int]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_shape"
            }
          ],
          "path": "spectralbridge.qa.plots.spatial_plot_context",
          "signature": "spatial_plot_context(header: dict[str, Any], source_shape: tuple[int, int, int]) -> dict[str, Any]",
          "summary": "Derive a projected plotting extent from standard ENVI map metadata.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 129,
          "methods": [],
          "name": "_apply_spatial_axes",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "axis"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spatial_context"
            }
          ],
          "path": "spectralbridge.qa.plots._apply_spatial_axes",
          "signature": "_apply_spatial_axes(axis: Any, spatial_context: dict[str, Any]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 137,
          "methods": [],
          "name": "_clipping_note",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "axis"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": "tuple[float, float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "limits"
            }
          ],
          "path": "spectralbridge.qa.plots._clipping_note",
          "signature": "_clipping_note(axis: Any, values: np.ndarray, limits: tuple[float, float]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 164,
          "methods": [],
          "name": "_rgb",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            }
          ],
          "path": "spectralbridge.qa.plots._rgb",
          "signature": "_rgb(cube: np.ndarray, wavelengths: np.ndarray) -> tuple[np.ndarray, str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render spatial support and spectral distribution from an actual ENVI cube.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.render_envi_overview"
          ],
          "kind": "function",
          "line": 187,
          "methods": [],
          "name": "render_envi_overview",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "title"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "location_label"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "spatial_context"
            }
          ],
          "path": "spectralbridge.qa.plots.render_envi_overview",
          "signature": "render_envi_overview(cube: np.ndarray, wavelengths: np.ndarray, output_path: Path, *, title: str, location_label: str, spatial_context: dict[str, Any]) -> Path",
          "summary": "Render spatial support and spectral distribution from an actual ENVI cube.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render before/after/difference maps with matched and zero-centered scales.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.render_correction_overview"
          ],
          "kind": "function",
          "line": 251,
          "methods": [],
          "name": "render_correction_overview",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corrected_cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "seam_before"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "seam_after"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "location_label"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "spatial_context"
            }
          ],
          "path": "spectralbridge.qa.plots.render_correction_overview",
          "signature": "render_correction_overview(raw_cube: np.ndarray, corrected_cube: np.ndarray, wavelengths: np.ndarray, seam_before: dict[str, Any] | None, seam_after: dict[str, Any] | None, output_path: Path, *, location_label: str, spatial_context: dict[str, Any]) -> Path",
          "summary": "Render before/after/difference maps with matched and zero-centered scales.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render a compact inventory of the files produced by a stage.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.render_artifact_inventory"
          ],
          "kind": "function",
          "line": 386,
          "methods": [],
          "name": "render_artifact_inventory",
          "parameters": [
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "artifacts"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "title"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "location_label"
            }
          ],
          "path": "spectralbridge.qa.plots.render_artifact_inventory",
          "signature": "render_artifact_inventory(artifacts: list[dict[str, Any]], output_path: Path, *, title: str, location_label: str) -> Path",
          "summary": "Render a compact inventory of the files produced by a stage.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Plot persisted BRDF coefficients and geometry without changing them.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.render_correction_parameters"
          ],
          "kind": "function",
          "line": 429,
          "methods": [],
          "name": "render_correction_parameters",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "model"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "geometry"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "location_label"
            }
          ],
          "path": "spectralbridge.qa.plots.render_correction_parameters",
          "signature": "render_correction_parameters(model: dict[str, Any], geometry: dict[str, Any], wavelengths: np.ndarray, output_path: Path, *, location_label: str) -> Path",
          "summary": "Plot persisted BRDF coefficients and geometry without changing them.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/pipeline/stage-qa.md"
          ],
          "docstring": "Render the Python equivalent of the historical coefficient QMD plots.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.render_brightness_diagnostics"
          ],
          "kind": "function",
          "line": 523,
          "methods": [],
          "name": "render_brightness_diagnostics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "before"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "after"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metrics"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "product_label"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "location_label"
            }
          ],
          "path": "spectralbridge.qa.plots.render_brightness_diagnostics",
          "signature": "render_brightness_diagnostics(before: np.ndarray, after: np.ndarray, metrics: dict[str, Any], output_path: Path, *, product_label: str, location_label: str) -> Path",
          "summary": "Render the Python equivalent of the historical coefficient QMD plots.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render extraction and merge structure from Parquet metadata.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.plots.render_parquet_overview"
          ],
          "kind": "function",
          "line": 629,
          "methods": [],
          "name": "render_parquet_overview",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_metrics"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "location_label"
            }
          ],
          "path": "spectralbridge.qa.plots.render_parquet_overview",
          "signature": "render_parquet_overview(parquet_metrics: dict[str, Any], output_path: Path, *, location_label: str) -> Path",
          "summary": "Render extraction and merge structure from Parquet metadata.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/plots.py",
      "sha256": "b56a5030f0ea154fe4bb75f15dcb97b0f8b7b646fdbab10c9b8c6091223bc586"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "assemble_combined_report",
        "render_stage_html"
      ],
      "docstring": "Human-readable stage reports and cross-stage synthesis.",
      "export_expressions": [
        "__all__ = ['assemble_combined_report', 'render_stage_html']"
      ],
      "imports": {
        "Any": "typing.Any",
        "CombinedQAPaths": "spectralbridge.qa.paths.CombinedQAPaths",
        "Path": "pathlib.Path",
        "PdfPages": "matplotlib.backends.backend_pdf.PdfPages",
        "QAStatus": "spectralbridge.qa.schema.QAStatus",
        "SCHEMA_VERSION": "spectralbridge.qa.schema.SCHEMA_VERSION",
        "STANDARD_NEGATIVE_FRACTION_RANGE": "spectralbridge.qa.plots.STANDARD_NEGATIVE_FRACTION_RANGE",
        "STANDARD_REFLECTANCE_RANGE": "spectralbridge.qa.plots.STANDARD_REFLECTANCE_RANGE",
        "STANDARD_VALID_FRACTION_RANGE": "spectralbridge.qa.plots.STANDARD_VALID_FRACTION_RANGE",
        "StageQAReport": "spectralbridge.qa.schema.StageQAReport",
        "annotations": "__future__.annotations",
        "format_location_label": "spectralbridge.qa.plots.format_location_label",
        "qa_plot_contract": "spectralbridge.qa.plots.qa_plot_contract"
      },
      "module": "spectralbridge.qa.reporting",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 38,
          "methods": [],
          "name": "_wrap_text",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "int",
              "default": "96",
              "kind": "keyword-only",
              "name": "width"
            }
          ],
          "path": "spectralbridge.qa.reporting._wrap_text",
          "signature": "_wrap_text(value: Any, *, width: int=96) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/publication_figures/figure_data.py",
            "examples/scientific_workflows_offline.py",
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 52,
          "methods": [],
          "name": "_value",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.qa.reporting._value",
          "signature": "_value(value: Any) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 60,
          "methods": [],
          "name": "_pdf_value",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.qa.reporting._pdf_value",
          "signature": "_pdf_value(value: Any) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 68,
          "methods": [],
          "name": "_pdf_footer",
          "parameters": [
            {
              "annotation": "plt.Figure",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fig"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "footer"
            }
          ],
          "path": "spectralbridge.qa.reporting._pdf_footer",
          "signature": "_pdf_footer(fig: plt.Figure, footer: str) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the best flightline ID and label available from stage evidence.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 72,
          "methods": [],
          "name": "_combined_report_identity",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage_payloads"
            }
          ],
          "path": "spectralbridge.qa.reporting._combined_report_identity",
          "signature": "_combined_report_identity(flightline_dir: Path, stage_payloads: list[dict[str, Any]]) -> tuple[str, str]",
          "summary": "Return the best flightline ID and label available from stage evidence.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Write a standalone deterministic HTML report for one stage.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.reporting.render_stage_html"
          ],
          "kind": "function",
          "line": 106,
          "methods": [],
          "name": "render_stage_html",
          "parameters": [
            {
              "annotation": "StageQAReport",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "report"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            }
          ],
          "path": "spectralbridge.qa.reporting.render_stage_html",
          "signature": "render_stage_html(report: StageQAReport, output_path: Path) -> Path",
          "summary": "Write a standalone deterministic HTML report for one stage.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 193,
          "methods": [],
          "name": "_cross_stage_findings",
          "parameters": [
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage_payloads"
            }
          ],
          "path": "spectralbridge.qa.reporting._cross_stage_findings",
          "signature": "_cross_stage_findings(stage_payloads: list[dict[str, Any]]) -> list[dict[str, Any]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 276,
          "methods": [],
          "name": "_render_pipeline_evolution",
          "parameters": [
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "stage_payloads"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "location_label"
            }
          ],
          "path": "spectralbridge.qa.reporting._render_pipeline_evolution",
          "signature": "_render_pipeline_evolution(stage_payloads: list[dict[str, Any]], output_path: Path, *, location_label: str) -> Path | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Render a deterministic text summary page into the combined QA PDF.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 327,
          "methods": [],
          "name": "_pdf_text_page",
          "parameters": [
            {
              "annotation": "PdfPages",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pdf"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "title"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "subtitle"
            },
            {
              "annotation": "list[tuple[str, list[str]]]",
              "default": null,
              "kind": "keyword-only",
              "name": "blocks"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "footer"
            }
          ],
          "path": "spectralbridge.qa.reporting._pdf_text_page",
          "signature": "_pdf_text_page(pdf: PdfPages, *, title: str, subtitle: str | None=None, blocks: list[tuple[str, list[str]]], footer: str) -> None",
          "summary": "Render a deterministic text summary page into the combined QA PDF.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Render one diagnostic image page, tolerating missing or unreadable plots.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 382,
          "methods": [],
          "name": "_pdf_image_page",
          "parameters": [
            {
              "annotation": "PdfPages",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pdf"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "title"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "image_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "caption"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "footer"
            }
          ],
          "path": "spectralbridge.qa.reporting._pdf_image_page",
          "signature": "_pdf_image_page(pdf: PdfPages, *, title: str, image_path: Path, caption: str, footer: str) -> None",
          "summary": "Render one diagnostic image page, tolerating missing or unreadable plots.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Write one printable PDF containing the combined and stage QA summaries.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 434,
          "methods": [],
          "name": "_render_combined_pdf",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "flightline_dir"
            },
            {
              "annotation": "CombinedQAPaths",
              "default": null,
              "kind": "keyword-only",
              "name": "paths"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "keyword-only",
              "name": "payload"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "stage_payloads"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "kind": "keyword-only",
              "name": "findings"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "location_label"
            }
          ],
          "path": "spectralbridge.qa.reporting._render_combined_pdf",
          "signature": "_render_combined_pdf(*, flightline_dir: Path, paths: CombinedQAPaths, payload: dict[str, Any], stage_payloads: list[dict[str, Any]], findings: list[dict[str, Any]], location_label: str) -> Path",
          "summary": "Write one printable PDF containing the combined and stage QA summaries.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Assemble stage reports and derive cross-stage findings.\n\nParameters\n----------\nflightline_dir : Path\n    Existing canonical completed flightline directory containing stage artifacts and QA sidecars.\n\nReturns\n-------\ntuple[Path, dict[str, Any]]\n    Combined HTML path and report payload; stage findings and unavailable diagnostics remain explicit.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.assemble_combined_report",
            "spectralbridge.qa.reporting.assemble_combined_report"
          ],
          "kind": "function",
          "line": 575,
          "methods": [],
          "name": "assemble_combined_report",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            }
          ],
          "path": "spectralbridge.qa.reporting.assemble_combined_report",
          "signature": "assemble_combined_report(flightline_dir: Path) -> tuple[Path, dict[str, Any]]",
          "summary": "Assemble stage reports and derive cross-stage findings.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/reporting.py",
      "sha256": "7c22faf664ab165e975b4aae16f2d394b1a9d2deb9862f37195f3473144e39a4"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "run_completed_flightline_qa"
      ],
      "docstring": "Rebuild stage QA from an already completed canonical flightline directory.",
      "export_expressions": [
        "__all__ = ['run_completed_flightline_qa']"
      ],
      "imports": {
        "Any": "typing.Any",
        "FlightlinePaths": "spectralbridge.paths.FlightlinePaths",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "assemble_combined_report": "spectralbridge.qa.reporting.assemble_combined_report",
        "emit_stage_qa": "spectralbridge.qa.stages.emit_stage_qa"
      },
      "module": "spectralbridge.qa.runner",
      "objects": [
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Generate every applicable stage report from existing real artifacts.\n\nParameters\n----------\nflightline_dir : Path\n    Existing canonical completed flightline directory containing stage artifacts and QA sidecars.\nmode : str, default='standard'\n    Diagnostic coverage level, normally 'standard' or 'deep'; existing artifacts are inspected without rerunning correction.\nforce : bool, default=False\n    Regenerate the requested outputs instead of reusing an otherwise valid checkpoint or report.\ntopo_fit_mode : str, default='scene'\n    Topographic fit mode passed to correction/QA; the default 'scene' retains the existing scene-wide fit.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of applicable stage IDs to their QA report results, generated only from existing artifacts.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.run_completed_flightline_qa",
            "spectralbridge.qa.runner.run_completed_flightline_qa"
          ],
          "kind": "function",
          "line": 14,
          "methods": [],
          "name": "run_completed_flightline_qa",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": "'standard'",
              "kind": "keyword-only",
              "name": "mode"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "force"
            },
            {
              "annotation": "str",
              "default": "'scene'",
              "kind": "keyword-only",
              "name": "topo_fit_mode"
            }
          ],
          "path": "spectralbridge.qa.runner.run_completed_flightline_qa",
          "signature": "run_completed_flightline_qa(flightline_dir: Path, *, mode: str='standard', force: bool=False, topo_fit_mode: str='scene') -> dict[str, Any]",
          "summary": "Generate every applicable stage report from existing real artifacts.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/runner.py",
      "sha256": "93354d8dc2ad44e144c8402e219c472947025754fa75d154ae58e40e799f5d4f"
    },
    {
      "area": "qa",
      "constants": [
        {
          "annotation": null,
          "name": "SCHEMA_VERSION",
          "value": "'1.3'"
        }
      ],
      "declared_exports": [
        "QACheck",
        "QAStatus",
        "SCHEMA_VERSION",
        "StageQAReport",
        "overall_status"
      ],
      "docstring": "Versioned schemas for stage and combined QA artifacts.",
      "export_expressions": [
        "__all__ = ['QACheck', 'QAStatus', 'SCHEMA_VERSION', 'StageQAReport', 'overall_status']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Enum": "enum.Enum",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "field": "dataclasses.field"
      },
      "module": "spectralbridge.qa.schema",
      "objects": [
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Four-state QA classification used throughout SpectralBridge.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.QAStatus",
            "spectralbridge.qa.schema.QAStatus"
          ],
          "kind": "class",
          "line": 15,
          "methods": [],
          "name": "QAStatus",
          "parameters": [],
          "path": "spectralbridge.qa.schema.QAStatus",
          "signature": null,
          "summary": "Four-state QA classification used throughout SpectralBridge.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "check_id"
            },
            {
              "annotation": "QAStatus",
              "default": null,
              "name": "status"
            },
            {
              "annotation": "Any",
              "default": "None",
              "name": "value"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "units"
            },
            {
              "annotation": "Any",
              "default": "None",
              "name": "warn_threshold"
            },
            {
              "annotation": "Any",
              "default": "None",
              "name": "fail_threshold"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "provisional"
            },
            {
              "annotation": "str",
              "default": "''",
              "name": "interpretation"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "reason"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "One explicit check, including thresholds and interpretation.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.schema.QACheck"
          ],
          "kind": "class",
          "line": 25,
          "methods": [],
          "name": "QACheck",
          "parameters": [],
          "path": "spectralbridge.qa.schema.QACheck",
          "signature": null,
          "summary": "One explicit check, including thresholds and interpretation.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "stage_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "stage_name"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "mode"
            },
            {
              "annotation": "QAStatus",
              "default": null,
              "name": "status"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "name": "inputs"
            },
            {
              "annotation": "list[dict[str, Any]]",
              "default": null,
              "name": "outputs"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "name": "parameters"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "name": "sample"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "name": "metrics"
            },
            {
              "annotation": "list[QACheck]",
              "default": null,
              "name": "checks"
            },
            {
              "annotation": "list[str]",
              "default": null,
              "name": "warnings"
            },
            {
              "annotation": "list[str]",
              "default": null,
              "name": "plots"
            },
            {
              "annotation": "list[str]",
              "default": null,
              "name": "interpretation"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "name": "provenance"
            },
            {
              "annotation": "str",
              "default": "SCHEMA_VERSION",
              "name": "schema_version"
            },
            {
              "annotation": "list[dict[str, str]]",
              "default": "field(default_factory=list)",
              "name": "unavailable_diagnostics"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Machine-readable report emitted for one canonical pipeline stage.\n\nAttributes\n----------\nstage_id : str\n    Canonical processing-stage identifier used for deterministic QA paths and stage-specific diagnostics.\nstage_name : str\n    Human-readable canonical processing-stage label.\nmode : str\n    Diagnostic coverage level, normally 'standard' or 'deep'; existing artifacts are inspected without rerunning correction.\nstatus : QAStatus\n    Recorded stage-specific outcome or eligibility state; inspect reason/detail and the relevant workflow before interpreting it scientifically.\ninputs : list[dict[str, Any]]\n    Paths to the stage input/output artifacts; their availability and provenance are recorded in the QA payload.\noutputs : list[dict[str, Any]]\n    Paths to the stage input/output artifacts; their availability and provenance are recorded in the QA payload.\nparameters : dict[str, Any]\n    Optional serializable stage configuration recorded for reproducibility; does not modify the stage products.\nsample : dict[str, Any]\n    Sampling metadata describing the bounded diagnostic support; not the entire raster population.\nmetrics : dict[str, Any]\n    Numerical diagnostic results with explicit missing/unavailable values.\nchecks : list[QACheck]\n    Structured QA checks and statuses evaluated against the configured review thresholds.\nwarnings : list[str]\n    Human-readable diagnostic warnings requiring interpretation.\nplots : list[str]\n    Recorded rendered QA artifact paths/metadata.\ninterpretation : list[str]\n    Human-readable explanation of the stage diagnostics and their limitations.\nprovenance : dict[str, Any]\n    Source/configuration/version evidence accompanying this diagnostic report.\nschema_version : str, default=SCHEMA_VERSION\n    Serialized payload schema version; preserve it when storing or exchanging this record.\nunavailable_diagnostics : list[dict[str, str]], default=field(default_factory=list)\n    Explicit list of checks that could not be evaluated; these must not be treated as passing.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.StageQAReport",
            "spectralbridge.qa.schema.StageQAReport"
          ],
          "kind": "class",
          "line": 40,
          "methods": [
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, Any]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 96,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            },
            {
              "docstring": "Serialize the stage report to JSON.\n\nReturns\n-------\nstr\n    JSON representation of the stage report.",
              "line": 113,
              "name": "to_json",
              "parameters": [],
              "private": false,
              "signature": "to_json(self) -> str"
            },
            {
              "docstring": "Write the stage report JSON to the requested path.\n\nParameters\n----------\npath : Path\n    Destination JSON file path.\n\nReturns\n-------\nPath\n    Destination path after writing this report as JSON.",
              "line": 124,
              "name": "write_json",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "path"
                }
              ],
              "private": false,
              "signature": "write_json(self, path: Path) -> Path"
            }
          ],
          "name": "StageQAReport",
          "parameters": [],
          "path": "spectralbridge.qa.schema.StageQAReport",
          "signature": null,
          "summary": "Machine-readable report emitted for one canonical pipeline stage.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return the most severe evaluated status, or ``NOT EVALUATED``.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.schema.overall_status"
          ],
          "kind": "function",
          "line": 143,
          "methods": [],
          "name": "overall_status",
          "parameters": [
            {
              "annotation": "list[QACheck]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "checks"
            }
          ],
          "path": "spectralbridge.qa.schema.overall_status",
          "signature": "overall_status(checks: list[QACheck]) -> QAStatus",
          "summary": "Return the most severe evaluated status, or ``NOT EVALUATED``.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/schema.py",
      "sha256": "d49f477bb13fa16bd354e7f0e55c907c3570298a125c91efd3698244720981cc"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "emit_stage_qa"
      ],
      "docstring": "Stage QA emission from canonical on-disk pipeline artifacts.",
      "export_expressions": [
        "__all__ = ['emit_stage_qa']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Iterable": "typing.Iterable",
        "KNOWN_BAD_WAVELENGTH_RANGES_NM": "spectralbridge.qa.thresholds.KNOWN_BAD_WAVELENGTH_RANGES_NM",
        "PackageNotFoundError": "importlib.metadata.PackageNotFoundError",
        "Path": "pathlib.Path",
        "QACheck": "spectralbridge.qa.schema.QACheck",
        "QAStatus": "spectralbridge.qa.schema.QAStatus",
        "QAThresholds": "spectralbridge.qa.thresholds.QAThresholds",
        "SCHEMA_VERSION": "spectralbridge.qa.schema.SCHEMA_VERSION",
        "StageQAPaths": "spectralbridge.qa.paths.StageQAPaths",
        "StageQAReport": "spectralbridge.qa.schema.StageQAReport",
        "annotations": "__future__.annotations",
        "brightness_correction_metrics": "spectralbridge.qa.brightness.brightness_correction_metrics",
        "classify_high_bad": "spectralbridge.qa.thresholds.classify_high_bad",
        "classify_low_bad": "spectralbridge.qa.thresholds.classify_low_bad",
        "format_location_label": "spectralbridge.qa.plots.format_location_label",
        "hdr_to_dict": "spectralbridge.envi.hdr_to_dict",
        "load_brightness_coefficients": "spectralbridge.brightness_config.load_brightness_coefficients",
        "memmap_bsq": "spectralbridge.envi.memmap_bsq",
        "normalize_stage_id": "spectralbridge.qa.paths.normalize_stage_id",
        "overall_status": "spectralbridge.qa.schema.overall_status",
        "qa_plot_contract": "spectralbridge.qa.plots.qa_plot_contract",
        "reflectance_summary": "spectralbridge.qa.metrics.reflectance_summary",
        "render_artifact_inventory": "spectralbridge.qa.plots.render_artifact_inventory",
        "render_brightness_diagnostics": "spectralbridge.qa.plots.render_brightness_diagnostics",
        "render_correction_overview": "spectralbridge.qa.plots.render_correction_overview",
        "render_correction_parameters": "spectralbridge.qa.plots.render_correction_parameters",
        "render_envi_overview": "spectralbridge.qa.plots.render_envi_overview",
        "render_parquet_overview": "spectralbridge.qa.plots.render_parquet_overview",
        "render_stage_html": "spectralbridge.qa.reporting.render_stage_html",
        "residual_metrics": "spectralbridge.qa.metrics.residual_metrics",
        "seam_score": "spectralbridge.qa.metrics.seam_score",
        "spatial_plot_context": "spectralbridge.qa.plots.spatial_plot_context",
        "version": "importlib.metadata.version"
      },
      "module": "spectralbridge.qa.stages",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the installed distribution version used in report provenance.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 55,
          "methods": [],
          "name": "_package_version",
          "parameters": [],
          "path": "spectralbridge.qa.stages._package_version",
          "signature": "_package_version() -> str",
          "summary": "Return the installed distribution version used in report provenance.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the repository revision without making Git a runtime dependency.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 64,
          "methods": [],
          "name": "_git_sha",
          "parameters": [],
          "path": "spectralbridge.qa.stages._git_sha",
          "signature": "_git_sha() -> str",
          "summary": "Return the repository revision without making Git a runtime dependency.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a bounded deterministic artifact fingerprint and method label.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 77,
          "methods": [],
          "name": "_fingerprint",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.qa.stages._fingerprint",
          "signature": "_fingerprint(path: Path) -> tuple[str | None, str]",
          "summary": "Return a bounded deterministic artifact fingerprint and method label.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Describe one declared input or output using JSON-safe values.",
          "examples": [
            "examples/researcher_evidence_validation.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 99,
          "methods": [],
          "name": "_artifact",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.qa.stages._artifact",
          "signature": "_artifact(path: Path) -> dict[str, Any]",
          "summary": "Describe one declared input or output using JSON-safe values.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read a scalar ENVI NoData value when one is available.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 117,
          "methods": [],
          "name": "_nodata",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            }
          ],
          "path": "spectralbridge.qa.stages._nodata",
          "signature": "_nodata(header: dict[str, Any]) -> float | None",
          "summary": "Read a scalar ENVI NoData value when one is available.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read a positive ENVI reflectance divisor when one is available.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 129,
          "methods": [],
          "name": "_scale_factor",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            }
          ],
          "path": "spectralbridge.qa.stages._scale_factor",
          "signature": "_scale_factor(header: dict[str, Any]) -> float | None",
          "summary": "Read a positive ENVI reflectance divisor when one is available.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read scale/no-data attributes without loading the source reflectance cube.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 142,
          "methods": [],
          "name": "_h5_reflectance_metadata",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.qa.stages._h5_reflectance_metadata",
          "signature": "_h5_reflectance_metadata(path: Path) -> tuple[float | None, float | None]",
          "summary": "Read scale/no-data attributes without loading the source reflectance cube.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 191,
          "methods": [],
          "name": "_input_reflectance_metadata",
          "parameters": [
            {
              "annotation": "list[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "input_paths"
            }
          ],
          "path": "spectralbridge.qa.stages._input_reflectance_metadata",
          "signature": "_input_reflectance_metadata(input_paths: list[Path]) -> tuple[float | None, float | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a diagnostic copy in unit reflectance with NoData represented by NaN.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 207,
          "methods": [],
          "name": "_unit_reflectance",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "scale_factor"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "keyword-only",
              "name": "nodata"
            }
          ],
          "path": "spectralbridge.qa.stages._unit_reflectance",
          "signature": "_unit_reflectance(values: np.ndarray, *, scale_factor: float, nodata: float | None) -> np.ndarray",
          "summary": "Return a diagnostic copy in unit reflectance with NoData represented by NaN.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a complete numeric wavelength vector or an explicit empty array.",
          "examples": [
            "examples/run_drone_pipeline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 224,
          "methods": [],
          "name": "_wavelengths",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bands"
            }
          ],
          "path": "spectralbridge.qa.stages._wavelengths",
          "signature": "_wavelengths(header: dict[str, Any], bands: int) -> np.ndarray",
          "summary": "Return a complete numeric wavelength vector or an explicit empty array.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return ``(bands, lines, samples)`` from an ENVI header.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 234,
          "methods": [],
          "name": "_header_shape",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            }
          ],
          "path": "spectralbridge.qa.stages._header_shape",
          "signature": "_header_shape(header: dict[str, Any]) -> tuple[int, int, int]",
          "summary": "Return ``(bands, lines, samples)`` from an ENVI header.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Sample a band-first cube on a deterministic regular spatial grid.\n\nCopies one band at a time so a memmap source is never materialized as a\nfull ``float32`` cube.",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 240,
          "methods": [],
          "name": "_preview",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "max_pixels"
            }
          ],
          "path": "spectralbridge.qa.stages._preview",
          "signature": "_preview(cube: np.ndarray, max_pixels: int) -> np.ndarray",
          "summary": "Sample a band-first cube on a deterministic regular spatial grid.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read a bounded spatial preview from an on-disk BSQ ENVI file.\n\nThe source is memmapped and sampled band-by-band; the memmap is released\nbefore the preview is returned.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 258,
          "methods": [],
          "name": "_load_spatial_preview",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "max_pixels"
            }
          ],
          "path": "spectralbridge.qa.stages._load_spatial_preview",
          "signature": "_load_spatial_preview(img_path: Path, header: dict[str, Any], max_pixels: int) -> tuple[np.ndarray, tuple[int, int, int]]",
          "summary": "Read a bounded spatial preview from an on-disk BSQ ENVI file.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Compute seam scores from selected bands without loading the full cube.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 279,
          "methods": [],
          "name": "_representative_seams_from_path",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            },
            {
              "annotation": "tuple[int, int] | None",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_shape"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "mode"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "keyword-only",
              "name": "nodata"
            }
          ],
          "path": "spectralbridge.qa.stages._representative_seams_from_path",
          "signature": "_representative_seams_from_path(img_path: Path, header: dict[str, Any], *, chunk_shape: tuple[int, int] | None, mode: str, nodata: float | None) -> dict[str, Any] | None",
          "summary": "Compute seam scores from selected bands without loading the full cube.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Classify established poor-quality wavelengths without changing data.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 305,
          "methods": [],
          "name": "_known_bad_band_mask",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bands"
            }
          ],
          "path": "spectralbridge.qa.stages._known_bad_band_mask",
          "signature": "_known_bad_band_mask(wavelengths: np.ndarray, bands: int) -> np.ndarray",
          "summary": "Classify established poor-quality wavelengths without changing data.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 318,
          "methods": [],
          "name": "_known_bad_band_reason",
          "parameters": [
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelength_nm"
            }
          ],
          "path": "spectralbridge.qa.stages._known_bad_band_reason",
          "signature": "_known_bad_band_reason(wavelength_nm: float) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Separate structural bounding-box background from observed support.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 329,
          "methods": [],
          "name": "_footprint_summary",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "preview"
            }
          ],
          "path": "spectralbridge.qa.stages._footprint_summary",
          "signature": "_footprint_summary(preview: np.ndarray) -> dict[str, Any]",
          "summary": "Separate structural bounding-box background from observed support.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Report retained bad-band and usable-band distributions separately.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 358,
          "methods": [],
          "name": "_spectral_quality_summary",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "preview"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "known_bad"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "all_band_overbright_fraction"
            }
          ],
          "path": "spectralbridge.qa.stages._spectral_quality_summary",
          "signature": "_spectral_quality_summary(preview: np.ndarray, wavelengths: np.ndarray, known_bad: np.ndarray, all_band_overbright_fraction: float | None) -> dict[str, Any]",
          "summary": "Report retained bad-band and usable-band distributions separately.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return report-only summaries for every retained source band.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 397,
          "methods": [],
          "name": "_bandwise",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "preview"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "known_bad"
            }
          ],
          "path": "spectralbridge.qa.stages._bandwise",
          "signature": "_bandwise(preview: np.ndarray, wavelengths: np.ndarray, known_bad: np.ndarray) -> list[dict[str, Any]]",
          "summary": "Return report-only summaries for every retained source band.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 437,
          "methods": [],
          "name": "_representative_seams",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "tuple[int, int] | None",
              "default": null,
              "kind": "keyword-only",
              "name": "chunk_shape"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "mode"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "keyword-only",
              "name": "nodata"
            }
          ],
          "path": "spectralbridge.qa.stages._representative_seams",
          "signature": "_representative_seams(cube: np.ndarray, *, chunk_shape: tuple[int, int] | None, mode: str, nodata: float | None) -> dict[str, Any] | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read Parquet counts and schemas through DuckDB without materializing tables.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 468,
          "methods": [],
          "name": "_parquet_metrics",
          "parameters": [
            {
              "annotation": "Iterable[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "paths"
            }
          ],
          "path": "spectralbridge.qa.stages._parquet_metrics",
          "signature": "_parquet_metrics(paths: Iterable[Path]) -> dict[str, Any]",
          "summary": "Read Parquet counts and schemas through DuckDB without materializing tables.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 513,
          "methods": [],
          "name": "_array_summary",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.qa.stages._array_summary",
          "signature": "_array_summary(value: Any) -> dict[str, Any] | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Flag physically implausible persisted summaries without altering them.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 530,
          "methods": [],
          "name": "_geometry_range_review",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "geometry"
            }
          ],
          "path": "spectralbridge.qa.stages._geometry_range_review",
          "signature": "_geometry_range_review(geometry: dict[str, Any]) -> dict[str, Any]",
          "summary": "Flag physically implausible persisted summaries without altering them.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Find persisted undarkened/final Landsat image pairs by naming contract.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 576,
          "methods": [],
          "name": "_brightness_pairs",
          "parameters": [
            {
              "annotation": "list[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_paths"
            }
          ],
          "path": "spectralbridge.qa.stages._brightness_pairs",
          "signature": "_brightness_pairs(output_paths: list[Path]) -> list[tuple[Path, Path]]",
          "summary": "Find persisted undarkened/final Landsat image pairs by naming contract.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Derive a concise sensor label for report text and figures.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 597,
          "methods": [],
          "name": "_brightness_product_label",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.qa.stages._brightness_product_label",
          "signature": "_brightness_product_label(path: Path) -> str",
          "summary": "Derive a concise sensor label for report text and figures.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Audit every discoverable Landsat brightness pair on bounded previews.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 607,
          "methods": [],
          "name": "_brightness_diagnostics",
          "parameters": [
            {
              "annotation": "list[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_paths"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "keyword-only",
              "name": "max_pixels"
            }
          ],
          "path": "spectralbridge.qa.stages._brightness_diagnostics",
          "signature": "_brightness_diagnostics(output_paths: list[Path], *, max_pixels: int) -> list[dict[str, Any]]",
          "summary": "Audit every discoverable Landsat brightness pair on bounded previews.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 666,
          "methods": [],
          "name": "_context_fingerprint",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "payload"
            }
          ],
          "path": "spectralbridge.qa.stages._context_fingerprint",
          "signature": "_context_fingerprint(payload: dict[str, Any]) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Emit or reuse one deterministic stage QA JSON/HTML report from on-disk artifacts.\n\nParameters\n----------\nflightline_dir : Path\n    Existing canonical completed flightline directory containing stage artifacts and QA sidecars.\nstage_id : str\n    Canonical processing-stage identifier used for deterministic QA paths and stage-specific diagnostics.\ninputs : Iterable[Path], default=()\n    Paths to the stage input/output artifacts; their availability and provenance are recorded in the QA payload.\noutputs : Iterable[Path], default=()\n    Paths to the stage input/output artifacts; their availability and provenance are recorded in the QA payload.\nparameters : dict[str, Any] | None, default=None\n    Optional serializable stage configuration recorded for reproducibility; does not modify the stage products.\nmode : str, default='standard'\n    Diagnostic coverage level, normally 'standard' or 'deep'; existing artifacts are inspected without rerunning correction.\nprimary_img : Path | None, default=None\n    Optional primary ENVI image to inspect for this stage.\nreference_img : Path | None, default=None\n    Optional aligned ENVI reference image for paired diagnostics.\nchunk_shape : tuple[int, int] | None, default=None\n    Optional (rows, columns) block shape in pixels for seam/chunk diagnostics.\nthresholds : QAThresholds | None, default=None\n    QAThresholds instance providing provisional review bounds; None uses the configured defaults, not universal scientific acceptance criteria.\nforce : bool, default=False\n    Regenerate the requested outputs instead of reusing an otherwise valid checkpoint or report.\n\nReturns\n-------\ntuple[Path, dict[str, Any]]\n    Stage HTML path and JSON-serializable QA payload, written or reused with deterministic stage paths.\n\nRaises\n------\nValueError\n    If the supplied options, dimensions, support or provenance violate the input contract.\n\nNotes\n-----\nMissing scientific inputs are recorded as ``NOT EVALUATED`` rather than\nbeing silently omitted.  ``mode='deep'`` increases sampling and seam-band\ncoverage but does not rerun the scientific correction itself.  Callers\nshould invoke this after the stage product exists on disk, not while the\ncorrection working set is still resident.\n\nSee Also\n--------\nspectralbridge.qa.metrics.reflectance_summary : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.emit_stage_qa",
            "spectralbridge.qa.stages.emit_stage_qa"
          ],
          "kind": "function",
          "line": 671,
          "methods": [],
          "name": "emit_stage_qa",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "stage_id"
            },
            {
              "annotation": "Iterable[Path]",
              "default": "()",
              "kind": "keyword-only",
              "name": "inputs"
            },
            {
              "annotation": "Iterable[Path]",
              "default": "()",
              "kind": "keyword-only",
              "name": "outputs"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "parameters"
            },
            {
              "annotation": "str",
              "default": "'standard'",
              "kind": "keyword-only",
              "name": "mode"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "primary_img"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "reference_img"
            },
            {
              "annotation": "tuple[int, int] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "chunk_shape"
            },
            {
              "annotation": "QAThresholds | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "thresholds"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "force"
            }
          ],
          "path": "spectralbridge.qa.stages.emit_stage_qa",
          "signature": "emit_stage_qa(*, flightline_dir: Path, stage_id: str, inputs: Iterable[Path]=(), outputs: Iterable[Path]=(), parameters: dict[str, Any] | None=None, mode: str='standard', primary_img: Path | None=None, reference_img: Path | None=None, chunk_shape: tuple[int, int] | None=None, thresholds: QAThresholds | None=None, force: bool=False) -> tuple[Path, dict[str, Any]]",
          "summary": "Emit or reuse one deterministic stage QA JSON/HTML report from on-disk artifacts.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/stages.py",
      "sha256": "2723d97f1cd442fc56fc42ec6c0f8e3d19194aefb578f8341ae3a919363ede71"
    },
    {
      "area": "qa",
      "constants": [
        {
          "annotation": "tuple[dict[str, float | str], ...]",
          "name": "KNOWN_BAD_WAVELENGTH_RANGES_NM",
          "value": "({'minimum_nm': 300.0, 'maximum_nm': 400.0, 'reason': 'spectral edge / low-signal region'}, {'minimum_nm': 1337.0, 'maximum_nm': 1430.0, 'reason': 'strong atmospheric water-absorption region'}, {'minimum_nm': 1800.0, 'maximum_nm': 1960.0, 'reason': 'strong atmospheric water-absorption region'}, {'minimum_nm': 2450.0, 'maximum_nm': 2600.0, 'reason': 'spectral edge / low-signal region'})"
        }
      ],
      "declared_exports": [
        "KNOWN_BAD_WAVELENGTH_RANGES_NM",
        "QAThresholds",
        "classify_high_bad",
        "classify_low_bad"
      ],
      "docstring": "Configurable QA thresholds.\n\nDefaults are intentionally conservative and provisional until they are tuned\nagainst a pinned set of real NEON, MicaSense, and Landsat comparison data.",
      "export_expressions": [
        "__all__ = ['KNOWN_BAD_WAVELENGTH_RANGES_NM', 'QAThresholds', 'classify_high_bad', 'classify_low_bad']"
      ],
      "imports": {
        "QACheck": "spectralbridge.qa.schema.QACheck",
        "QAStatus": "spectralbridge.qa.schema.QAStatus",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass"
      },
      "module": "spectralbridge.qa.thresholds",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "float",
              "default": "0.9",
              "name": "valid_fraction_warn"
            },
            {
              "annotation": "float",
              "default": "0.7",
              "name": "valid_fraction_fail"
            },
            {
              "annotation": "float",
              "default": "0.01",
              "name": "negative_fraction_warn"
            },
            {
              "annotation": "float",
              "default": "0.05",
              "name": "negative_fraction_fail"
            },
            {
              "annotation": "float",
              "default": "0.01",
              "name": "overbright_fraction_warn"
            },
            {
              "annotation": "float",
              "default": "0.05",
              "name": "overbright_fraction_fail"
            },
            {
              "annotation": "float",
              "default": "0.2",
              "name": "correction_abs_q99_warn"
            },
            {
              "annotation": "float",
              "default": "0.5",
              "name": "correction_abs_q99_fail"
            },
            {
              "annotation": "float",
              "default": "1.5",
              "name": "seam_score_warn"
            },
            {
              "annotation": "float",
              "default": "2.5",
              "name": "seam_score_fail"
            },
            {
              "annotation": "float",
              "default": "1e-06",
              "name": "chunk_difference_tolerance"
            },
            {
              "annotation": "float",
              "default": "0.98",
              "name": "srf_coverage_warn"
            },
            {
              "annotation": "float",
              "default": "0.9",
              "name": "srf_coverage_fail"
            },
            {
              "annotation": "bool",
              "default": "True",
              "name": "provisional"
            }
          ],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Provisional standard-mode thresholds expressed as fractions.\n\nAttributes\n----------\nvalid_fraction_warn : float, default=0.9\n    Fractional support/range review threshold in [0, 1]; warn/fail interpretation follows the corresponding metric, not a universal scientific validity rule.\nvalid_fraction_fail : float, default=0.7\n    Fractional support/range review threshold in [0, 1]; warn/fail interpretation follows the corresponding metric, not a universal scientific validity rule.\nnegative_fraction_warn : float, default=0.01\n    Fractional support/range review threshold in [0, 1]; warn/fail interpretation follows the corresponding metric, not a universal scientific validity rule.\nnegative_fraction_fail : float, default=0.05\n    Fractional support/range review threshold in [0, 1]; warn/fail interpretation follows the corresponding metric, not a universal scientific validity rule.\noverbright_fraction_warn : float, default=0.01\n    Fractional support/range review threshold in [0, 1]; warn/fail interpretation follows the corresponding metric, not a universal scientific validity rule.\noverbright_fraction_fail : float, default=0.05\n    Fractional support/range review threshold in [0, 1]; warn/fail interpretation follows the corresponding metric, not a universal scientific validity rule.\ncorrection_abs_q99_warn : float, default=0.2\n    Review threshold for the 99th percentile of absolute reflectance correction, in the diagnostic reflectance units.\ncorrection_abs_q99_fail : float, default=0.5\n    Review threshold for the 99th percentile of absolute reflectance correction, in the diagnostic reflectance units.\nseam_score_warn : float, default=1.5\n    Dimensionless seam/interior gradient-ratio review threshold; landscape structure can also exceed it.\nseam_score_fail : float, default=2.5\n    Dimensionless seam/interior gradient-ratio review threshold; landscape structure can also exceed it.\nchunk_difference_tolerance : float, default=1e-06\n    Absolute same-unit tolerance for chunk-invariance comparisons.\nsrf_coverage_warn : float, default=0.98\n    Fractional support/range review threshold in [0, 1]; warn/fail interpretation follows the corresponding metric, not a universal scientific validity rule.\nsrf_coverage_fail : float, default=0.9\n    Fractional support/range review threshold in [0, 1]; warn/fail interpretation follows the corresponding metric, not a universal scientific validity rule.\nprovisional : bool, default=True\n    Whether these configured review bounds are explicitly provisional rather than empirically calibrated acceptance criteria.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.QAThresholds",
            "spectralbridge.qa.thresholds.QAThresholds"
          ],
          "kind": "class",
          "line": 42,
          "methods": [
            {
              "docstring": "Serialize this record to its established machine-readable mapping.\n\nReturns\n-------\ndict[str, float | bool]\n    Mapping of record fields and workflow-derived summary entries in the established serialization schema.",
              "line": 92,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, float | bool]"
            }
          ],
          "name": "QAThresholds",
          "parameters": [],
          "path": "spectralbridge.qa.thresholds.QAThresholds",
          "signature": null,
          "summary": "Provisional standard-mode thresholds expressed as fractions.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Classify a metric against inclusive upper warn/fail bounds; None yields NOT EVALUATED.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.thresholds.classify_high_bad"
          ],
          "kind": "function",
          "line": 104,
          "methods": [],
          "name": "classify_high_bad",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "check_id"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "warn"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "fail"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "units"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "interpretation"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "provisional"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "reason"
            }
          ],
          "path": "spectralbridge.qa.thresholds.classify_high_bad",
          "signature": "classify_high_bad(check_id: str, value: float | None, *, warn: float, fail: float, units: str | None=None, interpretation: str, provisional: bool=True, reason: str | None=None) -> QACheck",
          "summary": "Classify a metric against inclusive upper warn/fail bounds; None yields NOT EVALUATED.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Classify a metric against inclusive lower warn/fail bounds; None yields NOT EVALUATED.",
          "examples": [],
          "exports": [
            "spectralbridge.qa.thresholds.classify_low_bad"
          ],
          "kind": "function",
          "line": 147,
          "methods": [],
          "name": "classify_low_bad",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "check_id"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "warn"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "fail"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "units"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "interpretation"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "provisional"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "reason"
            }
          ],
          "path": "spectralbridge.qa.thresholds.classify_low_bad",
          "signature": "classify_low_bad(check_id: str, value: float | None, *, warn: float, fail: float, units: str | None=None, interpretation: str, provisional: bool=True, reason: str | None=None) -> QACheck",
          "summary": "Classify a metric against inclusive lower warn/fail bounds; None yields NOT EVALUATED.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa/thresholds.py",
      "sha256": "802975f0777bc58b53ded425d0e031d54b1c899c837f9d9fbed90c8c1d2e3b87"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [],
      "docstring": "Aggregate QA metrics across flightlines and generate dashboards.",
      "export_expressions": [],
      "imports": {
        "Iterable": "typing.Iterable",
        "List": "typing.List",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "configure_cli_logging": "spectralbridge.logging_utils.configure_cli_logging",
        "warn_if_legacy_command": "spectralbridge._cli_compat.warn_if_legacy_command",
        "write_parquet_with_lonlat": "spectralbridge.exports.geo_utils.write_parquet_with_lonlat"
      },
      "module": "spectralbridge.qa_dashboard",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return all QA metric parquet tables within ``base_folder``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 22,
          "methods": [],
          "name": "_find_metric_tables",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            }
          ],
          "path": "spectralbridge.qa_dashboard._find_metric_tables",
          "signature": "_find_metric_tables(base_folder: Path) -> List[Path]",
          "summary": "Return all QA metric parquet tables within ``base_folder``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read a parquet file and annotate flightline metadata.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 31,
          "methods": [],
          "name": "_safe_read_parquet",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.qa_dashboard._safe_read_parquet",
          "signature": "_safe_read_parquet(path: Path) -> pd.DataFrame | None",
          "summary": "Read a parquet file and annotate flightline metadata.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Collect all ``*_qa_metrics.parquet`` files into a single dataframe.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 46,
          "methods": [],
          "name": "collect_qa_metrics",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            }
          ],
          "path": "spectralbridge.qa_dashboard.collect_qa_metrics",
          "signature": "collect_qa_metrics(base_folder: Path) -> pd.DataFrame",
          "summary": "Collect all ``*_qa_metrics.parquet`` files into a single dataframe.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 64,
          "methods": [],
          "name": "_has_flags",
          "parameters": [
            {
              "annotation": "object",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.qa_dashboard._has_flags",
          "signature": "_has_flags(value: object) -> bool",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Compute per-flightline summary statistics.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 72,
          "methods": [],
          "name": "summarize_qa",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df"
            }
          ],
          "path": "spectralbridge.qa_dashboard.summarize_qa",
          "signature": "summarize_qa(df: pd.DataFrame) -> pd.DataFrame",
          "summary": "Compute per-flightline summary statistics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Generate an overview plot showing flag fractions per flightline.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 100,
          "methods": [],
          "name": "plot_qa_dashboard",
          "parameters": [
            {
              "annotation": "pd.DataFrame",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "df_summary"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_png"
            }
          ],
          "path": "spectralbridge.qa_dashboard.plot_qa_dashboard",
          "signature": "plot_qa_dashboard(df_summary: pd.DataFrame, out_png: Path) -> None",
          "summary": "Generate an overview plot showing flag fractions per flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 127,
          "methods": [],
          "name": "_default_outputs",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            }
          ],
          "path": "spectralbridge.qa_dashboard._default_outputs",
          "signature": "_default_outputs(base_folder: Path) -> tuple[Path, Path]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Entry-point for the ``spectralbridge-qa-dashboard`` CLI.",
          "examples": [
            "examples/evaluate_quantile_matches.py",
            "examples/first_example.py",
            "examples/manuscript_synthesis/build_figure.py",
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/palette.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/manuscript_synthesis/validate_export.py",
            "examples/manuscript_synthesis/validate_rebuild.py",
            "examples/manuscript_synthesis/write_caption.py",
            "examples/mesma_readiness.py",
            "examples/pft_method_audit.py",
            "examples/plant_pft_statistics.py",
            "examples/plant_quantile_overlays.py",
            "examples/plant_spectral_atlas.py",
            "examples/plant_spectral_comparison.py",
            "examples/plant_spectral_pfts.py",
            "examples/plant_spectral_quantiles.py",
            "examples/plant_spectral_regions.py",
            "examples/plant_spectral_years.py",
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/validate_figures.py",
            "examples/real_landsat_validation.py",
            "examples/release_candidate_smoke.py",
            "examples/researcher_evidence_validation.py",
            "examples/researcher_pft_information.py",
            "examples/researcher_pft_statistics.py",
            "examples/run_drone_pipeline.py",
            "examples/run_neon_pipeline.py",
            "examples/scientific_workflows_offline.py",
            "examples/sensor_pft_transfer.py",
            "examples/spectral_library_analytics.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 134,
          "methods": [],
          "name": "main",
          "parameters": [
            {
              "annotation": "Iterable[str] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "argv"
            }
          ],
          "path": "spectralbridge.qa_dashboard.main",
          "signature": "main(argv: Iterable[str] | None=None) -> None",
          "summary": "Entry-point for the ``spectralbridge-qa-dashboard`` CLI.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa_dashboard.py",
      "sha256": "498e2a9f5110f1dbc095c8821152679fc2e96a9ef46eed7086aaec4131e97acd"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "ConvolutionReport",
        "CorrectionReport",
        "HeaderReport",
        "MaskReport",
        "Provenance",
        "QAMetrics",
        "write_json"
      ],
      "docstring": "",
      "export_expressions": [
        "__all__ = ['HeaderReport', 'MaskReport', 'CorrectionReport', 'ConvolutionReport', 'Provenance', 'QAMetrics', 'write_json']"
      ],
      "imports": {
        "Dict": "typing.Dict",
        "List": "typing.List",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "field": "dataclasses.field"
      },
      "module": "spectralbridge.qa_metrics",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "List[str]",
              "default": null,
              "name": "keys_present"
            },
            {
              "annotation": "List[str]",
              "default": null,
              "name": "keys_missing"
            },
            {
              "annotation": "Optional[str]",
              "default": null,
              "name": "wavelength_unit"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "n_bands"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "n_wavelengths_finite"
            },
            {
              "annotation": "Optional[float]",
              "default": null,
              "name": "first_nm"
            },
            {
              "annotation": "Optional[float]",
              "default": null,
              "name": "last_nm"
            },
            {
              "annotation": "Optional[bool]",
              "default": null,
              "name": "wavelengths_monotonic"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "wavelength_source"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Store legacy ENVI header QA findings and metadata.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_metrics.HeaderReport"
          ],
          "kind": "class",
          "line": 10,
          "methods": [],
          "name": "HeaderReport",
          "parameters": [],
          "path": "spectralbridge.qa_metrics.HeaderReport",
          "signature": null,
          "summary": "Store legacy ENVI header QA findings and metadata.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "int",
              "default": null,
              "name": "n_total"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "n_valid"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "valid_pct"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Store legacy validity-mask QA findings.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_metrics.MaskReport"
          ],
          "kind": "class",
          "line": 25,
          "methods": [],
          "name": "MaskReport",
          "parameters": [],
          "path": "spectralbridge.qa_metrics.MaskReport",
          "signature": null,
          "summary": "Store legacy validity-mask QA findings.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "List[float]",
              "default": null,
              "name": "delta_median"
            },
            {
              "annotation": "List[float]",
              "default": null,
              "name": "delta_iqr"
            },
            {
              "annotation": "List[float]",
              "default": null,
              "name": "delta_q10"
            },
            {
              "annotation": "List[float]",
              "default": null,
              "name": "delta_q25"
            },
            {
              "annotation": "List[float]",
              "default": null,
              "name": "delta_q75"
            },
            {
              "annotation": "List[float]",
              "default": null,
              "name": "delta_q90"
            },
            {
              "annotation": "List[float]",
              "default": null,
              "name": "delta_abs_median"
            },
            {
              "annotation": "List[int]",
              "default": null,
              "name": "largest_delta_indices"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Store legacy correction QA diagnostics.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_metrics.CorrectionReport"
          ],
          "kind": "class",
          "line": 34,
          "methods": [],
          "name": "CorrectionReport",
          "parameters": [],
          "path": "spectralbridge.qa_metrics.CorrectionReport",
          "signature": null,
          "summary": "Store legacy correction QA diagnostics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "sensor"
            },
            {
              "annotation": "List[float]",
              "default": null,
              "name": "rmse"
            },
            {
              "annotation": "Optional[float]",
              "default": null,
              "name": "sam"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Store legacy target-sensor convolution QA diagnostics.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_metrics.ConvolutionReport"
          ],
          "kind": "class",
          "line": 48,
          "methods": [],
          "name": "ConvolutionReport",
          "parameters": [],
          "path": "spectralbridge.qa_metrics.ConvolutionReport",
          "signature": null,
          "summary": "Store legacy target-sensor convolution QA diagnostics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "flightline_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "created_utc"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "package_version"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "git_sha"
            },
            {
              "annotation": "Dict[str, str]",
              "default": null,
              "name": "input_hashes"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Store source and execution metadata accompanying a legacy QA report.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_metrics.Provenance"
          ],
          "kind": "class",
          "line": 57,
          "methods": [],
          "name": "Provenance",
          "parameters": [],
          "path": "spectralbridge.qa_metrics.Provenance",
          "signature": null,
          "summary": "Store source and execution metadata accompanying a legacy QA report.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Provenance",
              "default": null,
              "name": "provenance"
            },
            {
              "annotation": "HeaderReport",
              "default": null,
              "name": "header"
            },
            {
              "annotation": "MaskReport",
              "default": null,
              "name": "mask"
            },
            {
              "annotation": "Optional[CorrectionReport]",
              "default": null,
              "name": "correction"
            },
            {
              "annotation": "List[ConvolutionReport]",
              "default": null,
              "name": "convolution"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "negatives_pct"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "overbright_pct"
            },
            {
              "annotation": "List[str]",
              "default": null,
              "name": "issues"
            },
            {
              "annotation": "Dict[str, Dict[int, float]]",
              "default": "field(default_factory=dict)",
              "name": "brightness_coefficients"
            },
            {
              "annotation": "Dict[str, List[Dict[str, float]]]",
              "default": "field(default_factory=dict)",
              "name": "brightness_summary"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Group legacy header, mask, correction, convolution and provenance QA records.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_metrics.QAMetrics"
          ],
          "kind": "class",
          "line": 68,
          "methods": [
            {
              "docstring": "",
              "line": 82,
              "name": "to_json",
              "parameters": [],
              "private": false,
              "signature": "to_json(self) -> str"
            }
          ],
          "name": "QAMetrics",
          "parameters": [],
          "path": "spectralbridge.qa_metrics.QAMetrics",
          "signature": null,
          "summary": "Group legacy header, mask, correction, convolution and provenance QA records.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Serialize legacy QAMetrics to JSON, creating the destination parent directory.",
          "examples": [
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [
            "spectralbridge.qa_metrics.write_json"
          ],
          "kind": "function",
          "line": 86,
          "methods": [],
          "name": "write_json",
          "parameters": [
            {
              "annotation": "QAMetrics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metrics"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "out_path"
            }
          ],
          "path": "spectralbridge.qa_metrics.write_json",
          "signature": "write_json(metrics: QAMetrics, out_path: Path) -> Path",
          "summary": "Serialize legacy QAMetrics to JSON, creating the destination parent directory.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa_metrics.py",
      "sha256": "f097e404ca86514ddeb8f590efc4adb38fd0c5754e1212e99d3a139384eaba43"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "render_drone_panel",
        "render_flightline_panel"
      ],
      "docstring": "Utilities for rendering QA panels with paired metrics JSON.",
      "export_expressions": [
        "__all__ = ['render_flightline_panel', 'render_drone_panel']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Axes": "matplotlib.axes.Axes",
        "ConvolutionReport": "spectralbridge.qa_metrics.ConvolutionReport",
        "CorrectionReport": "spectralbridge.qa_metrics.CorrectionReport",
        "Figure": "matplotlib.figure.Figure",
        "HeaderReport": "spectralbridge.qa_metrics.HeaderReport",
        "Iterable": "typing.Iterable",
        "MaskReport": "spectralbridge.qa_metrics.MaskReport",
        "NEONReflectanceENVIFile": "spectralbridge.file_types.NEONReflectanceENVIFile",
        "PackageNotFoundError": "importlib.metadata.PackageNotFoundError",
        "Path": "pathlib.Path",
        "PdfPages": "matplotlib.backends.backend_pdf.PdfPages",
        "PdfReader": "PyPDF2.PdfReader",
        "Provenance": "spectralbridge.qa_metrics.Provenance",
        "QAMetrics": "spectralbridge.qa_metrics.QAMetrics",
        "Rectangle": "matplotlib.patches.Rectangle",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "hdr_to_dict": "spectralbridge.envi.hdr_to_dict",
        "load_brightness_coefficients": "spectralbridge.brightness_config.load_brightness_coefficients",
        "ndimage": "scipy.ndimage",
        "read_envi_cube": "spectralbridge.envi.read_envi_cube",
        "version": "importlib.metadata.version",
        "wavelengths_from_hdr": "spectralbridge.header_utils.wavelengths_from_hdr",
        "write_json": "spectralbridge.qa_metrics.write_json"
      },
      "module": "spectralbridge.qa_plots",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 52,
          "methods": [],
          "name": "_quote_sql_path",
          "parameters": [
            {
              "annotation": "Path | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.qa_plots._quote_sql_path",
          "signature": "_quote_sql_path(path: Path | str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Read a parquet file without tripping pandas/pyarrow extension clashes.\n\nPrefer DuckDB (does not use ``pandas.read_parquet``'s pyarrow engine, which\ncan raise ``ArrowKeyError: pandas.period already defined`` when extension\ntypes were already registered). Fall back to pyarrow then pandas.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 56,
          "methods": [],
          "name": "_safe_read_parquet",
          "parameters": [
            {
              "annotation": "Path | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "columns"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_rows"
            }
          ],
          "path": "spectralbridge.qa_plots._safe_read_parquet",
          "signature": "_safe_read_parquet(path: Path | str, *, columns: Sequence[str] | None=None, sample_rows: int | None=None)",
          "summary": "Read a parquet file without tripping pandas/pyarrow extension clashes.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return (n_rows, n_cols) via DuckDB metadata when possible.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 131,
          "methods": [],
          "name": "_parquet_shape",
          "parameters": [
            {
              "annotation": "Path | str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.qa_plots._parquet_shape",
          "signature": "_parquet_shape(path: Path | str) -> tuple[int, int] | None",
          "summary": "Return (n_rows, n_cols) via DuckDB metadata when possible.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 182,
          "methods": [],
          "name": "_hash_file",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.qa_plots._hash_file",
          "signature": "_hash_file(path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Discover the raw and corrected ENVI cubes for a flightline.\n\nHandles naming mismatches between raw files (which may use legacy T-separator format)\nand corrected files (which use canonical flight_id format).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 190,
          "methods": [],
          "name": "_discover_primary_cube",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            }
          ],
          "path": "spectralbridge.qa_plots._discover_primary_cube",
          "signature": "_discover_primary_cube(flightline_dir: Path) -> tuple[Path, Path]",
          "summary": "Discover the raw and corrected ENVI cubes for a flightline.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return all ENVI .img products for this flightline (for page 1 overview).\n\nIncludes the raw ENVI, corrected ENVI, and any convolved ENVI products,\nbut excludes QA images and non-ENVI artifacts.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 262,
          "methods": [],
          "name": "_list_envi_products",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            }
          ],
          "path": "spectralbridge.qa_plots._list_envi_products",
          "signature": "_list_envi_products(flightline_dir: Path, prefix: str) -> list[Path]",
          "summary": "Return all ENVI .img products for this flightline (for page 1 overview).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 282,
          "methods": [],
          "name": "_flightline_prefix",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_path"
            }
          ],
          "path": "spectralbridge.qa_plots._flightline_prefix",
          "signature": "_flightline_prefix(raw_path: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 287,
          "methods": [],
          "name": "_rgb_targets_from_arg",
          "parameters": [
            {
              "annotation": "str | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rgb_bands"
            }
          ],
          "path": "spectralbridge.qa_plots._rgb_targets_from_arg",
          "signature": "_rgb_targets_from_arg(rgb_bands: str | None) -> tuple[float, float, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 307,
          "methods": [],
          "name": "_deterministic_sample",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "mask"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "n_sample"
            }
          ],
          "path": "spectralbridge.qa_plots._deterministic_sample",
          "signature": "_deterministic_sample(cube: np.ndarray, mask: np.ndarray, n_sample: int) -> tuple[np.ndarray, np.ndarray]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Sample drone QA spectra from eligible valid pixels rather than the full grid.\n\nDrone orthomosaics can contain large nodata skirts. Filtering to pixels with\nat least a modest fraction of valid bands preserves the same downstream\nsampled-spectrum shape while preventing nodata-heavy edges from consuming\nmost of the sampling budget.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 330,
          "methods": [],
          "name": "_deterministic_drone_valid_sample",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "mask"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "n_sample"
            },
            {
              "annotation": "float",
              "default": "_DRONE_QA_MIN_VALID_BAND_FRACTION",
              "kind": "keyword-only",
              "name": "min_valid_band_fraction"
            },
            {
              "annotation": "int",
              "default": "_DRONE_QA_TRACE_RNG_SEED",
              "kind": "keyword-only",
              "name": "rng_seed"
            }
          ],
          "path": "spectralbridge.qa_plots._deterministic_drone_valid_sample",
          "signature": "_deterministic_drone_valid_sample(cube: np.ndarray, mask: np.ndarray, n_sample: int, *, min_valid_band_fraction: float=_DRONE_QA_MIN_VALID_BAND_FRACTION, rng_seed: int=_DRONE_QA_TRACE_RNG_SEED) -> tuple[np.ndarray, np.ndarray, dict[str, float | int]]",
          "summary": "Sample drone QA spectra from eligible valid pixels rather than the full grid.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 400,
          "methods": [],
          "name": "_percentile_stretch",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "arr"
            },
            {
              "annotation": "float",
              "default": "2.0",
              "kind": "positional-or-keyword",
              "name": "lo"
            },
            {
              "annotation": "float",
              "default": "98.0",
              "kind": "positional-or-keyword",
              "name": "hi"
            }
          ],
          "path": "spectralbridge.qa_plots._percentile_stretch",
          "signature": "_percentile_stretch(arr: np.ndarray, lo: float=2.0, hi: float=98.0) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 409,
          "methods": [],
          "name": "_rgb_preview",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "Sequence[float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rgb_targets"
            }
          ],
          "path": "spectralbridge.qa_plots._rgb_preview",
          "signature": "_rgb_preview(cube: np.ndarray, wavelengths: np.ndarray, rgb_targets: Sequence[float]) -> tuple[np.ndarray, tuple[int, int, int]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 439,
          "methods": [],
          "name": "_header_report",
          "parameters": [
            {
              "annotation": "dict",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            }
          ],
          "path": "spectralbridge.qa_plots._header_report",
          "signature": "_header_report(header: dict, wavelengths: np.ndarray, source: str) -> HeaderReport",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 462,
          "methods": [],
          "name": "_correction_report",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_sample"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corr_sample"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sample_mask"
            }
          ],
          "path": "spectralbridge.qa_plots._correction_report",
          "signature": "_correction_report(raw_sample: np.ndarray, corr_sample: np.ndarray, sample_mask: np.ndarray) -> CorrectionReport",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_data.py",
            "examples/publication_figures/figure_panels.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 521,
          "methods": [],
          "name": "_spectral_angle",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "a"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "b"
            }
          ],
          "path": "spectralbridge.qa_plots._spectral_angle",
          "signature": "_spectral_angle(a: np.ndarray, b: np.ndarray) -> float",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Load statistics from filtered merged parquet file if available.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 531,
          "methods": [],
          "name": "_load_filtered_parquet_stats",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            }
          ],
          "path": "spectralbridge.qa_plots._load_filtered_parquet_stats",
          "signature": "_load_filtered_parquet_stats(flightline_dir: Path, prefix: str) -> dict | None",
          "summary": "Load statistics from filtered merged parquet file if available.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Safely extract geometry value, handling dict, tuple, or float.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 590,
          "methods": [],
          "name": "_safe_extract_geometry_value",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.qa_plots._safe_extract_geometry_value",
          "signature": "_safe_extract_geometry_value(value) -> float | None",
          "summary": "Safely extract geometry value, handling dict, tuple, or float.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 606,
          "methods": [],
          "name": "_build_brightness_summary_table",
          "parameters": [
            {
              "annotation": "dict[str, dict[int, float]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "brightness_map"
            }
          ],
          "path": "spectralbridge.qa_plots._build_brightness_summary_table",
          "signature": "_build_brightness_summary_table(brightness_map: dict[str, dict[int, float]]) -> dict[str, list[dict[str, float | str]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 644,
          "methods": [],
          "name": "_convolution_reports",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corr_cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sample_mask"
            }
          ],
          "path": "spectralbridge.qa_plots._convolution_reports",
          "signature": "_convolution_reports(base_dir: Path, prefix: str, corr_cube: np.ndarray, sample_mask: np.ndarray) -> tuple[list[ConvolutionReport], dict[str, tuple[np.ndarray, np.ndarray]], dict[str, dict[int, float]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Fallback for the \"Convolved vs corrected\" scatter plot when no convolved ENVI cubes\nare found on disk.\n\nWe build scatter pairs from the merged parquet by matching sensor band columns\n(e.g., olioli_*_wl####nm, tmtm_*_wl####nm, micasense_*_wl####nm) to the nearest\ncorrected hyperspectral column (corr_*_wl####nm).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 719,
          "methods": [],
          "name": "_scatter_from_merged_parquet",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "max_points"
            },
            {
              "annotation": "float",
              "default": "1.0",
              "kind": "keyword-only",
              "name": "reflectance_scale_factor"
            }
          ],
          "path": "spectralbridge.qa_plots._scatter_from_merged_parquet",
          "signature": "_scatter_from_merged_parquet(flightline_dir: Path, prefix: str, *, max_points: int=50000, reflectance_scale_factor: float=1.0) -> dict[str, tuple[np.ndarray, np.ndarray]]",
          "summary": "Fallback for the \"Convolved vs corrected\" scatter plot when no convolved ENVI cubes",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Page 1: one row with one panel per ENVI product, to show they exist & render.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 847,
          "methods": [],
          "name": "_render_page1_envi_overview",
          "parameters": [
            {
              "annotation": "PdfPages",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pdf"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            },
            {
              "annotation": "Sequence[float]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "rgb_targets"
            }
          ],
          "path": "spectralbridge.qa_plots._render_page1_envi_overview",
          "signature": "_render_page1_envi_overview(pdf: PdfPages, flightline_dir: Path, prefix: str, rgb_targets: Sequence[float]) -> None",
          "summary": "Page 1: one row with one panel per ENVI product, to show they exist & render.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Try to load the BRDF/topo correction JSON for extra diagnostics (optional).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 912,
          "methods": [],
          "name": "_load_correction_geometry_json",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corr_path"
            }
          ],
          "path": "spectralbridge.qa_plots._load_correction_geometry_json",
          "signature": "_load_correction_geometry_json(flightline_dir: Path, corr_path: Path) -> dict | None",
          "summary": "Try to load the BRDF/topo correction JSON for extra diagnostics (optional).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Page 2: diagnostics specific to topo (row 1) and BRDF (row 2) corrections.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 931,
          "methods": [],
          "name": "_render_page2_topo_brdf",
          "parameters": [
            {
              "annotation": "PdfPages",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pdf"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "CorrectionReport",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "correction_report"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_sample"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corr_sample"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sample_mask"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corr_path"
            },
            {
              "annotation": "dict | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "filtered_stats"
            }
          ],
          "path": "spectralbridge.qa_plots._render_page2_topo_brdf",
          "signature": "_render_page2_topo_brdf(pdf: PdfPages, prefix: str, wavelengths: np.ndarray, correction_report: CorrectionReport, raw_sample: np.ndarray, corr_sample: np.ndarray, sample_mask: np.ndarray, corr_path: Path, filtered_stats: dict | None=None) -> None",
          "summary": "Page 2: diagnostics specific to topo (row 1) and BRDF (row 2) corrections.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Page 3: remaining QA diagnostics (convolution + header/mask/issue summary).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1034,
          "methods": [],
          "name": "_render_page3_remaining",
          "parameters": [
            {
              "annotation": "PdfPages",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pdf"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            },
            {
              "annotation": "QAMetrics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metrics"
            },
            {
              "annotation": "dict[str, tuple[np.ndarray, np.ndarray]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scatter_data"
            },
            {
              "annotation": "dict | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "filtered_stats"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "float",
              "default": "1.0",
              "kind": "positional-or-keyword",
              "name": "reflectance_scale_factor"
            }
          ],
          "path": "spectralbridge.qa_plots._render_page3_remaining",
          "signature": "_render_page3_remaining(pdf: PdfPages, prefix: str, metrics: QAMetrics, scatter_data: dict[str, tuple[np.ndarray, np.ndarray]], filtered_stats: dict | None=None, flightline_dir: Path | None=None, wavelengths: np.ndarray | None=None, reflectance_scale_factor: float=1.0) -> None",
          "summary": "Page 3: remaining QA diagnostics (convolution + header/mask/issue summary).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Page 4: Parquet and merge quality analysis.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1142,
          "methods": [],
          "name": "_render_page4_parquet_merge_quality",
          "parameters": [
            {
              "annotation": "PdfPages",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pdf"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            }
          ],
          "path": "spectralbridge.qa_plots._render_page4_parquet_merge_quality",
          "signature": "_render_page4_parquet_merge_quality(pdf: PdfPages, flightline_dir: Path, prefix: str) -> None",
          "summary": "Page 4: Parquet and merge quality analysis.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1356,
          "methods": [],
          "name": "_package_version",
          "parameters": [],
          "path": "spectralbridge.qa_plots._package_version",
          "signature": "_package_version() -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1365,
          "methods": [],
          "name": "_git_sha",
          "parameters": [],
          "path": "spectralbridge.qa_plots._git_sha",
          "signature": "_git_sha() -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1373,
          "methods": [],
          "name": "_provenance",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            },
            {
              "annotation": "Iterable[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "inputs"
            }
          ],
          "path": "spectralbridge.qa_plots._provenance",
          "signature": "_provenance(prefix: str, inputs: Iterable[Path]) -> Provenance",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1384,
          "methods": [],
          "name": "_render_hist",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corr"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "mask"
            }
          ],
          "path": "spectralbridge.qa_plots._render_hist",
          "signature": "_render_hist(ax: Axes, raw: np.ndarray, corr: np.ndarray, mask: np.ndarray) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1395,
          "methods": [],
          "name": "_deterministic_trace_indices",
          "parameters": [
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "count"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "max_traces"
            }
          ],
          "path": "spectralbridge.qa_plots._deterministic_trace_indices",
          "signature": "_deterministic_trace_indices(count: int, max_traces: int) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1404,
          "methods": [],
          "name": "_clean_plot_values",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.qa_plots._clean_plot_values",
          "signature": "_clean_plot_values(values: np.ndarray) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1412,
          "methods": [],
          "name": "_set_percentile_ylim",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": "float",
              "default": "2.0",
              "kind": "keyword-only",
              "name": "lower_pct"
            },
            {
              "annotation": "float",
              "default": "98.0",
              "kind": "keyword-only",
              "name": "upper_pct"
            }
          ],
          "path": "spectralbridge.qa_plots._set_percentile_ylim",
          "signature": "_set_percentile_ylim(ax: Axes, values: np.ndarray, *, lower_pct: float=2.0, upper_pct: float=98.0) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1438,
          "methods": [],
          "name": "_preview_counts",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.qa_plots._preview_counts",
          "signature": "_preview_counts(values: np.ndarray) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1443,
          "methods": [],
          "name": "_support_range_label",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "support_mask"
            }
          ],
          "path": "spectralbridge.qa_plots._support_range_label",
          "signature": "_support_range_label(wavelengths: np.ndarray, support_mask: np.ndarray) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1458,
          "methods": [],
          "name": "_support_wavelength_preview",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "support_mask"
            },
            {
              "annotation": "int",
              "default": "8",
              "kind": "keyword-only",
              "name": "limit"
            }
          ],
          "path": "spectralbridge.qa_plots._support_wavelength_preview",
          "signature": "_support_wavelength_preview(wavelengths: np.ndarray, support_mask: np.ndarray, *, limit: int=8) -> list[float | int]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1474,
          "methods": [],
          "name": "_top_outlier_band_labels",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "abs_diff"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "int",
              "default": "3",
              "kind": "keyword-only",
              "name": "top_n"
            }
          ],
          "path": "spectralbridge.qa_plots._top_outlier_band_labels",
          "signature": "_top_outlier_band_labels(abs_diff: np.ndarray, wavelengths: np.ndarray, *, top_n: int=3) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1498,
          "methods": [],
          "name": "_summarize_sample_support",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sample_mask"
            }
          ],
          "path": "spectralbridge.qa_plots._summarize_sample_support",
          "signature": "_summarize_sample_support(wavelengths: np.ndarray, sample_mask: np.ndarray) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1535,
          "methods": [],
          "name": "_summarize_full_diff",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "full_diff"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            }
          ],
          "path": "spectralbridge.qa_plots._summarize_full_diff",
          "signature": "_summarize_full_diff(full_diff: np.ndarray, wavelengths: np.ndarray) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1577,
          "methods": [],
          "name": "_classify_drone_scene",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "diff_summary"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "support_summary"
            }
          ],
          "path": "spectralbridge.qa_plots._classify_drone_scene",
          "signature": "_classify_drone_scene(diff_summary: dict[str, Any], support_summary: dict[str, Any]) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1621,
          "methods": [],
          "name": "_scene_classification_messages",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scene_classification"
            }
          ],
          "path": "spectralbridge.qa_plots._scene_classification_messages",
          "signature": "_scene_classification_messages(scene_classification: Sequence[str]) -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Summarize the full-raster QA sampling path for debugging polygon-mode drift.\n\nThe spectral and wavelength-wise correction panels intentionally use sampled\nraster cubes (`raw_cube`, `corr_cube`, `raw_sample`, `corr_sample`) rather\nthan polygon parquet rows. This helper makes that provenance explicit and\ncaptures whether valid support collapses upstream.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1631,
          "methods": [],
          "name": "_drone_sampling_debug",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "scene_id"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "wavelengths"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "corr_cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_valid"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "corr_valid"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "both_valid"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_sample"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "corr_sample"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "keyword-only",
              "name": "sample_mask"
            },
            {
              "annotation": "dict[str, float | int] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sampling_diagnostics"
            }
          ],
          "path": "spectralbridge.qa_plots._drone_sampling_debug",
          "signature": "_drone_sampling_debug(*, scene_id: str, wavelengths: np.ndarray, raw_cube: np.ndarray, corr_cube: np.ndarray, raw_valid: np.ndarray, corr_valid: np.ndarray, both_valid: np.ndarray, raw_sample: np.ndarray, corr_sample: np.ndarray, sample_mask: np.ndarray, sampling_diagnostics: dict[str, float | int] | None=None) -> dict[str, Any]",
          "summary": "Summarize the full-raster QA sampling path for debugging polygon-mode drift.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1679,
          "methods": [],
          "name": "_log_drone_sampling_debug",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "debug"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sample_valid_counts"
            }
          ],
          "path": "spectralbridge.qa_plots._log_drone_sampling_debug",
          "signature": "_log_drone_sampling_debug(debug: dict[str, Any], sample_valid_counts: np.ndarray) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1747,
          "methods": [],
          "name": "_render_delta",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "CorrectionReport",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "report"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "sample_valid_counts"
            },
            {
              "annotation": "Sequence[str] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "scene_classification"
            }
          ],
          "path": "spectralbridge.qa_plots._render_delta",
          "signature": "_render_delta(ax: Axes, wavelengths: np.ndarray, report: CorrectionReport, *, sample_valid_counts: np.ndarray | None=None, scene_classification: Sequence[str] | None=None) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1824,
          "methods": [],
          "name": "_render_scatter",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "dict[str, tuple[np.ndarray, np.ndarray]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            }
          ],
          "path": "spectralbridge.qa_plots._render_scatter",
          "signature": "_render_scatter(ax: Axes, data: dict[str, tuple[np.ndarray, np.ndarray]]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Render a wavelength-based reflectance plot showing:\n- Corrected hyperspectral reflectance vs wavelength\n- Convolved sensor bands overlaid\n- Highlighted regions showing where convolutions occur",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 1844,
          "methods": [],
          "name": "_render_wavelength_reflectance_plot",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prefix"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "float",
              "default": "1.0",
              "kind": "keyword-only",
              "name": "reflectance_scale_factor"
            }
          ],
          "path": "spectralbridge.qa_plots._render_wavelength_reflectance_plot",
          "signature": "_render_wavelength_reflectance_plot(ax: Axes, flightline_dir: Path, prefix: str, wavelengths: np.ndarray | None=None, *, reflectance_scale_factor: float=1.0) -> None",
          "summary": "Render a wavelength-based reflectance plot showing:",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2254,
          "methods": [],
          "name": "_render_footer",
          "parameters": [
            {
              "annotation": "Figure",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fig"
            },
            {
              "annotation": "QAMetrics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metrics"
            }
          ],
          "path": "spectralbridge.qa_plots._render_footer",
          "signature": "_render_footer(fig: Figure, metrics: QAMetrics) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2264,
          "methods": [],
          "name": "_render_issues",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "list[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "issues"
            }
          ],
          "path": "spectralbridge.qa_plots._render_issues",
          "signature": "_render_issues(ax: Axes, issues: list[str]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Render a compact text summary for the normal AOP QA PNG.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2281,
          "methods": [],
          "name": "_render_aop_qa_summary",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "QAMetrics",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metrics"
            }
          ],
          "path": "spectralbridge.qa_plots._render_aop_qa_summary",
          "signature": "_render_aop_qa_summary(ax: Axes, metrics: QAMetrics) -> None",
          "summary": "Render a compact text summary for the normal AOP QA PNG.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2316,
          "methods": [],
          "name": "_nodata_mask",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "nodata_value"
            }
          ],
          "path": "spectralbridge.qa_plots._nodata_mask",
          "signature": "_nodata_mask(cube: np.ndarray, nodata_value: float | None) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2323,
          "methods": [],
          "name": "_cube_valid_mask",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "nodata_value"
            }
          ],
          "path": "spectralbridge.qa_plots._cube_valid_mask",
          "signature": "_cube_valid_mask(cube: np.ndarray, nodata_value: float | None) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2327,
          "methods": [],
          "name": "_header_number",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "key"
            },
            {
              "annotation": "float | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "default"
            }
          ],
          "path": "spectralbridge.qa_plots._header_number",
          "signature": "_header_number(header: dict[str, Any], key: str, default: float | None) -> float | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return physical reflectance plus the pre-scaling valid-data mask.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2339,
          "methods": [],
          "name": "_unit_reflectance_cube",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "header"
            }
          ],
          "path": "spectralbridge.qa_plots._unit_reflectance_cube",
          "signature": "_unit_reflectance_cube(cube: np.ndarray, header: dict[str, Any]) -> tuple[np.ndarray, np.ndarray]",
          "summary": "Return physical reflectance plus the pre-scaling valid-data mask.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2354,
          "methods": [],
          "name": "_drone_correction_status",
          "parameters": [
            {
              "annotation": "dict[str, Any] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qa_summary"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "correction_median"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "keyword-only",
              "name": "correction_max"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "scene_debug"
            }
          ],
          "path": "spectralbridge.qa_plots._drone_correction_status",
          "signature": "_drone_correction_status(qa_summary: dict[str, Any] | None, *, correction_median: float, correction_max: float, scene_debug: dict[str, Any] | None=None) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2398,
          "methods": [],
          "name": "_render_drone_correction_status_box",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "status"
            }
          ],
          "path": "spectralbridge.qa_plots._render_drone_correction_status_box",
          "signature": "_render_drone_correction_status_box(ax: Axes, status: dict[str, Any]) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2435,
          "methods": [],
          "name": "_median_spectrum",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cube"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "valid_mask"
            }
          ],
          "path": "spectralbridge.qa_plots._median_spectrum",
          "signature": "_median_spectrum(cube: np.ndarray, valid_mask: np.ndarray) -> np.ndarray",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Suppress isolated spectral spikes for display without changing source data.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2440,
          "methods": [],
          "name": "_despike_spectrum_for_display",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "xs"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectrum"
            }
          ],
          "path": "spectralbridge.qa_plots._despike_spectrum_for_display",
          "signature": "_despike_spectrum_for_display(xs: np.ndarray, spectrum: np.ndarray) -> tuple[np.ndarray, list[int]]",
          "summary": "Suppress isolated spectral spikes for display without changing source data.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2483,
          "methods": [],
          "name": "_render_drone_band_fidelity",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_spectrum"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corr_spectrum"
            },
            {
              "annotation": "dict[str, dict[str, float | int]] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band_map"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "raw_sample"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "corr_sample"
            },
            {
              "annotation": "np.ndarray | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "sample_mask"
            },
            {
              "annotation": "int",
              "default": "150",
              "kind": "keyword-only",
              "name": "max_traces"
            }
          ],
          "path": "spectralbridge.qa_plots._render_drone_band_fidelity",
          "signature": "_render_drone_band_fidelity(ax: Axes, wavelengths: np.ndarray, raw_spectrum: np.ndarray, corr_spectrum: np.ndarray, band_map: dict[str, dict[str, float | int]] | None, raw_sample: np.ndarray | None=None, corr_sample: np.ndarray | None=None, sample_mask: np.ndarray | None=None, *, max_traces: int=150) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2570,
          "methods": [],
          "name": "_render_drone_nodata_map",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "nodata_fraction"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "title"
            }
          ],
          "path": "spectralbridge.qa_plots._render_drone_nodata_map",
          "signature": "_render_drone_nodata_map(ax: Axes, nodata_fraction: np.ndarray, title: str) -> None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2582,
          "methods": [],
          "name": "_render_drone_correction_magnitude",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "full_diff"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "scene_debug"
            }
          ],
          "path": "spectralbridge.qa_plots._render_drone_correction_magnitude",
          "signature": "_render_drone_correction_magnitude(ax: Axes, full_diff: np.ndarray, scene_debug: dict[str, Any] | None=None) -> dict[str, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2654,
          "methods": [],
          "name": "_render_drone_polygon_overlay",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raster_img"
            },
            {
              "annotation": "Path | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "polygon_path"
            }
          ],
          "path": "spectralbridge.qa_plots._render_drone_polygon_overlay",
          "signature": "_render_drone_polygon_overlay(ax: Axes, raster_img: Path, polygon_path: Path | None) -> str | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 2728,
          "methods": [],
          "name": "_render_drone_merged_preview",
          "parameters": [
            {
              "annotation": "Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "Path | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "merged_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_name"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "qa_summary"
            }
          ],
          "path": "spectralbridge.qa_plots._render_drone_merged_preview",
          "signature": "_render_drone_merged_preview(ax: Axes, merged_path: Path | None, base_name: str, qa_summary: dict[str, Any] | None=None) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render paired raw/corrected drone QA, respecting nodata and wavelength metadata, with optional JSON diagnostics.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_plots.render_drone_panel"
          ],
          "kind": "function",
          "line": 2862,
          "methods": [],
          "name": "render_drone_panel",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "raw_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "corrected_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "output_png"
            },
            {
              "annotation": "dict[str, dict[str, float | int]] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "band_map"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "polygon_path"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "merged_path"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "qa_summary"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "keyword-only",
              "name": "save_json"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "rgb_bands"
            },
            {
              "annotation": "int",
              "default": "_DRONE_QA_MAX_SAMPLES",
              "kind": "keyword-only",
              "name": "qa_max_samples"
            }
          ],
          "path": "spectralbridge.qa_plots.render_drone_panel",
          "signature": "render_drone_panel(*, raw_path: Path, corrected_path: Path, output_png: Path, band_map: dict[str, dict[str, float | int]] | None=None, polygon_path: Path | None=None, merged_path: Path | None=None, qa_summary: dict[str, Any] | None=None, save_json: bool=True, rgb_bands: str | None=None, qa_max_samples: int=_DRONE_QA_MAX_SAMPLES) -> tuple[Path, dict[str, Any]]",
          "summary": "Render paired raw/corrected drone QA, respecting nodata and wavelength metadata, with optional JSON diagnostics.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/qa_plots.md"
          ],
          "docstring": "Return (png_path, metrics_dict); also writes _qa.json/_qa.pdf when requested.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_plots.render_flightline_panel"
          ],
          "kind": "function",
          "line": 3098,
          "methods": [],
          "name": "render_flightline_panel",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flightline_dir"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "positional-or-keyword",
              "name": "quick"
            },
            {
              "annotation": "bool",
              "default": "True",
              "kind": "positional-or-keyword",
              "name": "save_json"
            },
            {
              "annotation": "int",
              "default": "100000",
              "kind": "positional-or-keyword",
              "name": "n_sample"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "rgb_bands"
            }
          ],
          "path": "spectralbridge.qa_plots.render_flightline_panel",
          "signature": "render_flightline_panel(flightline_dir: Path, quick: bool=False, save_json: bool=True, n_sample: int=100000, rgb_bands: str | None=None) -> tuple[Path, dict]",
          "summary": "Return (png_path, metrics_dict); also writes _qa.json/_qa.pdf when requested.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa_plots.py",
      "sha256": "6d78b87140a0c77421d2f631b47a5dc005f6e0c72e7a94105d4078e1237a29f8"
    },
    {
      "area": "qa",
      "constants": [
        {
          "annotation": null,
          "name": "SENSOR_COLORS",
          "value": "{'micasense': '#0072B2', 'tm_etm': '#E69F00', 'oli_oli2': '#009E73', 'actual_landsat': '#222222', 'neon_landsat_like': '#CC79A7', 'drone_landsat_like': '#56B4E9'}"
        },
        {
          "annotation": null,
          "name": "WEIGHTING_COLORS",
          "value": "{'pixel_pooled': '#0072B2', 'flightline_balanced': '#E69F00', 'site_balanced': '#009E73'}"
        },
        {
          "annotation": null,
          "name": "WEIGHTING_MARKERS",
          "value": "{'pixel_pooled': 'o', 'flightline_balanced': 's', 'site_balanced': '^'}"
        },
        {
          "annotation": null,
          "name": "STATUS_COLORS",
          "value": "{'normal': '#009E73', 'attention': '#E69F00', 'failure': '#D55E00', 'unavailable': '#7A7A7A'}"
        },
        {
          "annotation": null,
          "name": "DEFAULT_QA_STYLE",
          "value": "QAPlotStyle()"
        }
      ],
      "declared_exports": [
        "DEFAULT_QA_STYLE",
        "QAPlotStyle",
        "SENSOR_COLORS",
        "STATUS_COLORS",
        "WEIGHTING_COLORS",
        "WEIGHTING_MARKERS",
        "apply_qa_axis_style",
        "sensor_display_label",
        "wavelength_pair_label"
      ],
      "docstring": "Shared presentation conventions for drone and bulk QA.\n\nMachine-readable sensor identifiers remain unchanged.  These helpers are only\nfor human-facing labels and the drone/bulk plotting palette; the normal NEON\nplotting stack intentionally does not import this module.",
      "export_expressions": [
        "__all__ = ['DEFAULT_QA_STYLE', 'QAPlotStyle', 'SENSOR_COLORS', 'STATUS_COLORS', 'WEIGHTING_COLORS', 'WEIGHTING_MARKERS', 'apply_qa_axis_style', 'sensor_display_label', 'wavelength_pair_label']"
      ],
      "imports": {
        "Any": "typing.Any",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass"
      },
      "module": "spectralbridge.qa_style",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "float",
              "default": "9.0",
              "name": "minimum_font_size"
            },
            {
              "annotation": "float",
              "default": "13.0",
              "name": "title_font_size"
            },
            {
              "annotation": "float",
              "default": "12.0",
              "name": "panel_label_font_size"
            },
            {
              "annotation": "int",
              "default": "300",
              "name": "figure_dpi"
            },
            {
              "annotation": "float",
              "default": "7.2",
              "name": "manuscript_width_inches"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Typography and export defaults for drone/bulk QA figures.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_style.QAPlotStyle"
          ],
          "kind": "class",
          "line": 45,
          "methods": [],
          "name": "QAPlotStyle",
          "parameters": [],
          "path": "spectralbridge.qa_style.QAPlotStyle",
          "signature": null,
          "summary": "Typography and export defaults for drone/bulk QA figures.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return a stable human label without changing the underlying sensor ID.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_style.sensor_display_label"
          ],
          "kind": "function",
          "line": 77,
          "methods": [],
          "name": "sensor_display_label",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "short"
            }
          ],
          "path": "spectralbridge.qa_style.sensor_display_label",
          "signature": "sensor_display_label(sensor: str, *, short: bool=False) -> str",
          "summary": "Return a stable human label without changing the underlying sensor ID.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return a compact physical source-to-target band label.\n\nThe separate source and target indices remain visible when requested, and\nwavelength\u2014not equality of sensor-local band numbers\u2014provides the compact\nvisual identity.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_style.wavelength_pair_label"
          ],
          "kind": "function",
          "line": 86,
          "methods": [],
          "name": "wavelength_pair_label",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "row"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "include_source_band"
            }
          ],
          "path": "spectralbridge.qa_style.wavelength_pair_label",
          "signature": "wavelength_pair_label(row: dict[str, Any], *, include_source_band: bool=False) -> str",
          "summary": "Return a compact physical source-to-target band label.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Apply the restrained drone/bulk axis treatment.",
          "examples": [],
          "exports": [
            "spectralbridge.qa_style.apply_qa_axis_style"
          ],
          "kind": "function",
          "line": 109,
          "methods": [],
          "name": "apply_qa_axis_style",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "axis"
            }
          ],
          "path": "spectralbridge.qa_style.apply_qa_axis_style",
          "signature": "apply_qa_axis_style(axis: Any) -> None",
          "summary": "Apply the restrained drone/bulk axis treatment.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/qa_style.py",
      "sha256": "f4b3cfd4c31c2ff3fad6a799872c3fc27838509be89a987ee4c657351789ae88"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "init_ray",
        "ray_map"
      ],
      "docstring": "Compatibility layer that re-exports Ray helpers.",
      "export_expressions": [
        "__all__ = ['init_ray', 'ray_map']"
      ],
      "imports": {
        "annotations": "__future__.annotations",
        "init_ray": "spectralbridge._ray_utils.init_ray",
        "ray_map": "spectralbridge._ray_utils.ray_map"
      },
      "module": "spectralbridge.ray_utils",
      "objects": [],
      "path": "src/spectralbridge/ray_utils.py",
      "sha256": "e4b573e96898632eb5b12053f790385262a23685cff49d5856299fd407acab9e"
    },
    {
      "area": "drone",
      "constants": [],
      "declared_exports": [
        "GocmdRemoteBackend",
        "RemoteAuthenticationError",
        "RemoteCollectionBackend",
        "RemoteCommandError",
        "RemoteEntry",
        "RemoteError",
        "normalize_remote_path",
        "parse_gocmd_listing",
        "remote_join",
        "remote_parent",
        "remote_relative_path"
      ],
      "docstring": "Backend-neutral remote collection access for production workflows.",
      "export_expressions": [
        "__all__ = ['GocmdRemoteBackend', 'RemoteAuthenticationError', 'RemoteCollectionBackend', 'RemoteCommandError', 'RemoteEntry', 'RemoteError', 'normalize_remote_path', 'parse_gocmd_listing', 'remote_join', 'remote_parent', 'remote_relative_path']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "Protocol": "typing.Protocol",
        "Sequence": "typing.Sequence",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "basename": "posixpath.basename",
        "dataclass": "dataclasses.dataclass",
        "dirname": "posixpath.dirname"
      },
      "module": "spectralbridge.remote",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Base class for remote collection failures.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.RemoteError"
          ],
          "kind": "class",
          "line": 14,
          "methods": [],
          "name": "RemoteError",
          "parameters": [],
          "path": "spectralbridge.remote.RemoteError",
          "signature": null,
          "summary": "Base class for remote collection failures.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "The remote client is installed but not configured for access.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.RemoteAuthenticationError"
          ],
          "kind": "class",
          "line": 18,
          "methods": [],
          "name": "RemoteAuthenticationError",
          "parameters": [],
          "path": "spectralbridge.remote.RemoteAuthenticationError",
          "signature": null,
          "summary": "The remote client is installed but not configured for access.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "A remote client command returned a non-zero status.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.RemoteCommandError"
          ],
          "kind": "class",
          "line": 22,
          "methods": [
            {
              "docstring": "",
              "line": 25,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "message"
                },
                {
                  "annotation": "Sequence[str]",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "command"
                },
                {
                  "annotation": "int",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "returncode"
                },
                {
                  "annotation": "str",
                  "default": "''",
                  "kind": "keyword-only",
                  "name": "stdout"
                },
                {
                  "annotation": "str",
                  "default": "''",
                  "kind": "keyword-only",
                  "name": "stderr"
                }
              ],
              "private": true,
              "signature": "__init__(self, message: str, *, command: Sequence[str], returncode: int, stdout: str='', stderr: str='') -> None"
            }
          ],
          "name": "RemoteCommandError",
          "parameters": [],
          "path": "spectralbridge.remote.RemoteCommandError",
          "signature": null,
          "summary": "A remote client command returned a non-zero status.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "name"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "is_collection"
            },
            {
              "annotation": "int | None",
              "default": "None",
              "name": "size_bytes"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "checksum"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "modified"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "One collection or data object returned by a remote backend.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.RemoteEntry"
          ],
          "kind": "class",
          "line": 42,
          "methods": [
            {
              "docstring": "",
              "line": 52,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, object]"
            }
          ],
          "name": "RemoteEntry",
          "parameters": [],
          "path": "spectralbridge.remote.RemoteEntry",
          "signature": null,
          "summary": "One collection or data object returned by a remote backend.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "name"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Storage operations required by the drone production orchestrator.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.RemoteCollectionBackend"
          ],
          "kind": "class",
          "line": 56,
          "methods": [
            {
              "docstring": "Raise a useful error when the backend client is unavailable.",
              "line": 61,
              "name": "ensure_available",
              "parameters": [],
              "private": false,
              "signature": "ensure_available(self) -> None"
            },
            {
              "docstring": "Verify configured authentication and access to ``remote_path``.",
              "line": 64,
              "name": "verify_access",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_path"
                }
              ],
              "private": false,
              "signature": "verify_access(self, remote_path: str) -> None"
            },
            {
              "docstring": "List direct children of one remote collection.",
              "line": 67,
              "name": "list_directory",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_path"
                }
              ],
              "private": false,
              "signature": "list_directory(self, remote_path: str) -> list[RemoteEntry]"
            },
            {
              "docstring": "Download one data object to an exact local path.",
              "line": 70,
              "name": "download_file",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_path"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "local_path"
                }
              ],
              "private": false,
              "signature": "download_file(self, remote_path: str, local_path: Path) -> None"
            },
            {
              "docstring": "Return whether a remote object or collection is accessible.",
              "line": 73,
              "name": "path_exists",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_path"
                }
              ],
              "private": false,
              "signature": "path_exists(self, remote_path: str) -> bool"
            },
            {
              "docstring": "Upload a directory beneath a remote parent and return its path.",
              "line": 76,
              "name": "upload_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "local_path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_parent"
                }
              ],
              "private": false,
              "signature": "upload_directory(self, local_path: Path, remote_parent: str) -> str"
            }
          ],
          "name": "RemoteCollectionBackend",
          "parameters": [],
          "path": "spectralbridge.remote.RemoteCollectionBackend",
          "signature": null,
          "summary": "Storage operations required by the drone production orchestrator.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Normalize separators while preserving the ``i:`` CyVerse prefix.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.normalize_remote_path"
          ],
          "kind": "function",
          "line": 80,
          "methods": [],
          "name": "normalize_remote_path",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.remote.normalize_remote_path",
          "signature": "normalize_remote_path(path: str) -> str",
          "summary": "Normalize separators while preserving the ``i:`` CyVerse prefix.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Join one child name to a normalized remote path.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.remote_join"
          ],
          "kind": "function",
          "line": 95,
          "methods": [],
          "name": "remote_join",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parent"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "child"
            }
          ],
          "path": "spectralbridge.remote.remote_join",
          "signature": "remote_join(parent: str, child: str) -> str",
          "summary": "Join one child name to a normalized remote path.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return a safe POSIX relative path beneath ``root``.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.remote_relative_path"
          ],
          "kind": "function",
          "line": 108,
          "methods": [],
          "name": "remote_relative_path",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.remote.remote_relative_path",
          "signature": "remote_relative_path(path: str, root: str) -> str",
          "summary": "Return a safe POSIX relative path beneath ``root``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Parse the stable collection/data-object lines emitted by ``gocmd ls``.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.parse_gocmd_listing"
          ],
          "kind": "function",
          "line": 126,
          "methods": [],
          "name": "parse_gocmd_listing",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "text"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "parent"
            }
          ],
          "path": "spectralbridge.remote.parse_gocmd_listing",
          "signature": "parse_gocmd_listing(text: str, *, parent: str) -> list[RemoteEntry]",
          "summary": "Parse the stable collection/data-object lines emitted by ``gocmd ls``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "CyVerse backend using an existing non-interactive ``gocmd`` configuration.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.GocmdRemoteBackend"
          ],
          "kind": "class",
          "line": 163,
          "methods": [
            {
              "docstring": "",
              "line": 168,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": "str",
                  "default": "'gocmd'",
                  "kind": "positional-or-keyword",
                  "name": "executable"
                }
              ],
              "private": true,
              "signature": "__init__(self, executable: str='gocmd') -> None"
            },
            {
              "docstring": "",
              "line": 171,
              "name": "_command",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "variadic-positional",
                  "name": "arguments"
                }
              ],
              "private": true,
              "signature": "_command(self, *arguments: str) -> list[str]"
            },
            {
              "docstring": "",
              "line": 174,
              "name": "_run",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "keyword-only",
                  "name": "operation"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "variadic-positional",
                  "name": "arguments"
                }
              ],
              "private": true,
              "signature": "_run(self, *arguments: str, operation: str) -> subprocess.CompletedProcess[str]"
            },
            {
              "docstring": "",
              "line": 210,
              "name": "ensure_available",
              "parameters": [],
              "private": false,
              "signature": "ensure_available(self) -> None"
            },
            {
              "docstring": "",
              "line": 216,
              "name": "verify_access",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_path"
                }
              ],
              "private": false,
              "signature": "verify_access(self, remote_path: str) -> None"
            },
            {
              "docstring": "",
              "line": 220,
              "name": "list_directory",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_path"
                }
              ],
              "private": false,
              "signature": "list_directory(self, remote_path: str) -> list[RemoteEntry]"
            },
            {
              "docstring": "",
              "line": 226,
              "name": "download_file",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_path"
                },
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "local_path"
                }
              ],
              "private": false,
              "signature": "download_file(self, remote_path: str, local_path: Path) -> None"
            },
            {
              "docstring": "",
              "line": 238,
              "name": "path_exists",
              "parameters": [
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_path"
                }
              ],
              "private": false,
              "signature": "path_exists(self, remote_path: str) -> bool"
            },
            {
              "docstring": "",
              "line": 248,
              "name": "upload_directory",
              "parameters": [
                {
                  "annotation": "Path",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "local_path"
                },
                {
                  "annotation": "str",
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "remote_parent"
                }
              ],
              "private": false,
              "signature": "upload_directory(self, local_path: Path, remote_parent: str) -> str"
            }
          ],
          "name": "GocmdRemoteBackend",
          "parameters": [],
          "path": "spectralbridge.remote.GocmdRemoteBackend",
          "signature": null,
          "summary": "CyVerse backend using an existing non-interactive ``gocmd`` configuration.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return the parent of a normalized remote path.",
          "examples": [],
          "exports": [
            "spectralbridge.remote.remote_parent"
          ],
          "kind": "function",
          "line": 269,
          "methods": [],
          "name": "remote_parent",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.remote.remote_parent",
          "signature": "remote_parent(path: str) -> str",
          "summary": "Return the parent of a normalized remote path.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/remote.py",
      "sha256": "1b036e99f1929ec97795ed79e11f015f54e2e78bb35255ddefc758936b1352cf"
    },
    {
      "area": "corrections",
      "constants": [],
      "declared_exports": [],
      "docstring": "Spectral resampling utilities for cross-sensor calibration workflows.",
      "export_expressions": [],
      "imports": {
        "Dict": "typing.Dict",
        "List": "typing.List"
      },
      "module": "spectralbridge.resample",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Resample a hyperspectral chunk to target sensor bands using SRFs.\n\nParameters\n----------\nchunk\n    Hyperspectral reflectance cube with shape ``(y, x, bands)``.\nwavelengths\n    Wavelength grid aligned to the last axis of ``chunk``.\nsensor_srf\n    Mapping of sensor band name to spectral response sampled on ``wavelengths``.\n\nReturns\n-------\nnp.ndarray\n    Resampled cube with shape ``(y, x, len(sensor_srf))`` and dtype ``float32``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 8,
          "methods": [],
          "name": "resample_chunk_to_sensor",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "chunk"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": "Dict[str, np.ndarray]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_srf"
            }
          ],
          "path": "spectralbridge.resample.resample_chunk_to_sensor",
          "signature": "resample_chunk_to_sensor(chunk: np.ndarray, wavelengths: np.ndarray, sensor_srf: Dict[str, np.ndarray]) -> np.ndarray",
          "summary": "Resample a hyperspectral chunk to target sensor bands using SRFs.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/resample.py",
      "sha256": "ec1ebcd356f43fad0ca95145c4f8a8a16310f297583354f00eae6404d64719c9"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Experimental researcher-cover spectral information and synthetic fractions.\n\nOnly recorded cover categories define biological groups. Utilities do not infer\nphysical purity, recover missing labels or validate field abundance.",
      "export_expressions": [],
      "imports": {
        "PCA": "sklearn.decomposition.PCA",
        "StandardScaler": "sklearn.preprocessing.StandardScaler",
        "annotations": "__future__.annotations",
        "wavelength_weights": "spectralbridge.pft_method_audit.wavelength_weights"
      },
      "module": "spectralbridge.researcher_information",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 22,
          "methods": [],
          "name": "validate_researcher_labels",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.researcher_information.validate_researcher_labels",
          "signature": "validate_researcher_labels(values)",
          "summary": "Validate labels against the five recorded researcher cover categories.",
          "summary_basis": "reference annotation; source hash-pinned in historical evidence"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Each identity has total weight one; optionally balance class totals.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 31,
          "methods": [],
          "name": "identity_weights",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "labels"
            }
          ],
          "path": "spectralbridge.researcher_information.identity_weights",
          "signature": "identity_weights(identities, labels=None)",
          "summary": "Each identity has total weight one; optionally balance class totals.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Euclidean projection onto nonnegative sum-one fractions (sorting rule).",
          "examples": [],
          "exports": [
            "spectralbridge.library_analysis.project_simplex"
          ],
          "kind": "function",
          "line": 55,
          "methods": [],
          "name": "project_simplex",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            }
          ],
          "path": "spectralbridge.researcher_information.project_simplex",
          "signature": "project_simplex(values)",
          "summary": "Euclidean projection onto nonnegative sum-one fractions (sorting rule).",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Weighted binary ROC AUC per column, with half credit for tied values.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 68,
          "methods": [],
          "name": "weighted_auc",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scores"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "weights"
            }
          ],
          "path": "spectralbridge.researcher_information.weighted_auc",
          "signature": "weighted_auc(truth, scores, weights=None)",
          "summary": "Weighted binary ROC AUC per column, with half credit for tied values.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Balanced-prior single-coordinate LDA; threshold learned on training only.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 90,
          "methods": [],
          "name": "univariate_discrimination",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "train"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "train_labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "train_ids"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "test"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "test_labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "test_ids"
            }
          ],
          "path": "spectralbridge.researcher_information.univariate_discrimination",
          "signature": "univariate_discrimination(train, train_labels, train_ids, test, test_labels, test_ids)",
          "summary": "Balanced-prior single-coordinate LDA; threshold learned on training only.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Greedy complementary coordinates via balanced one-hot residual gains.\n\nEvery input must belong to caller's training fold. Does not examine targets\nor claim globally optimal sensor design. Orthogonalizes duplicate channels.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 161,
          "methods": [],
          "name": "orthogonal_feature_path",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "X"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": "100",
              "kind": "positional-or-keyword",
              "name": "count"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "weights"
            }
          ],
          "path": "spectralbridge.researcher_information.orthogonal_feature_path",
          "signature": "orthogonal_feature_path(X, labels, count=100, weights=None)",
          "summary": "Greedy complementary coordinates via balanced one-hot residual gains.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Derivatives within supported segments, with no atmospheric-gap bridges.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 197,
          "methods": [],
          "name": "disconnected_derivative",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "X"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": "1",
              "kind": "positional-or-keyword",
              "name": "order"
            },
            {
              "annotation": null,
              "default": "8",
              "kind": "positional-or-keyword",
              "name": "max_gap"
            }
          ],
          "path": "spectralbridge.researcher_information.disconnected_derivative",
          "signature": "disconnected_derivative(X, wavelengths, order=1, max_gap=8)",
          "summary": "Derivatives within supported segments, with no atmospheric-gap bridges.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Sample one observation per class/ID, never reuse an ID across bundles.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 216,
          "methods": [],
          "name": "disjoint_parent_bundles",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "count"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.researcher_information.disjoint_parent_bundles",
          "signature": "disjoint_parent_bundles(table, count, seed)",
          "summary": "Sample one observation per class/ID, never reuse an ID across bundles.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Per-class fraction errors and presence metrics at a fixed .10 cutoff.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 233,
          "methods": [],
          "name": "fraction_metrics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "pred"
            }
          ],
          "path": "spectralbridge.researcher_information.fraction_metrics",
          "signature": "fraction_metrics(truth, pred)",
          "summary": "Per-class fraction errors and presence metrics at a fixed .10 cutoff.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fit-only training scalers/PCA; observation-local shape and derivatives.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 267,
          "methods": [
            {
              "docstring": "",
              "line": 270,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "kind"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "waves"
                },
                {
                  "annotation": null,
                  "default": "None",
                  "kind": "positional-or-keyword",
                  "name": "positions"
                }
              ],
              "private": true,
              "signature": "__init__(self, kind, waves, positions=None)"
            },
            {
              "docstring": "",
              "line": 273,
              "name": "local",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "local(self, X)"
            },
            {
              "docstring": "",
              "line": 286,
              "name": "fit",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "fit(self, X)"
            },
            {
              "docstring": "",
              "line": 299,
              "name": "transform",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "transform(self, X)"
            }
          ],
          "name": "TrainingTransform",
          "parameters": [],
          "path": "spectralbridge.researcher_information.TrainingTransform",
          "signature": null,
          "summary": "Fit-only training scalers/PCA; observation-local shape and derivatives.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/researcher_information.py",
      "sha256": "7ef03dc3ccb98d85163bd91331549ced0cb5dd879c0ef05d75e5ebd4565747fa"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Researcher cover-category adapter for existing whole-spectrum inference.",
      "export_expressions": [],
      "imports": {
        "AuditConfig": "spectralbridge.pft_method_audit.AuditConfig",
        "METHODS": "spectralbridge.pft_method_audit.METHODS",
        "Path": "pathlib.Path",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_history_keys": "spectralbridge.plant_pft_statistics._history_keys",
        "_plot_envelopes": "spectralbridge.pft_method_audit._plot_envelopes",
        "_seed": "spectralbridge.plant_pft_statistics._seed",
        "_write_json": "spectralbridge.plant_pft_statistics._write_json",
        "_year_plant_spectra": "spectralbridge.plant_spectral_years._year_plant_spectra",
        "asdict": "dataclasses.asdict",
        "combinations": "itertools.combinations",
        "envelope_critical": "spectralbridge.pft_method_audit.envelope_critical",
        "holm": "spectralbridge.plant_pft_statistics.holm",
        "method_statistics": "spectralbridge.pft_method_audit.method_statistics",
        "run_plant_spectral_atlas": "spectralbridge.plant_spectral_atlas.run_plant_spectral_atlas"
      },
      "module": "spectralbridge.researcher_pft_statistics",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validate labels without requiring taxonomic identification.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 24,
          "methods": [],
          "name": "category_metadata",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            }
          ],
          "path": "spectralbridge.researcher_pft_statistics.category_metadata",
          "signature": "category_metadata(source)",
          "summary": "Validate labels without requiring taxonomic identification.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Corrected NEON; exact acquisition history primary, site/year sensitivity.\n\nGroups are cover_category verbatim. Repeated observations are reduced to a\npolygon/year median; years are tested separately, never pooled as replicates.",
          "examples": [
            "examples/researcher_pft_statistics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 36,
          "methods": [],
          "name": "run_researcher_statistics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "10",
              "kind": "keyword-only",
              "name": "minimum"
            }
          ],
          "path": "spectralbridge.researcher_pft_statistics.run_researcher_statistics",
          "signature": "run_researcher_statistics(source, output, *, config=None, minimum=10)",
          "summary": "Corrected NEON; exact acquisition history primary, site/year sensitivity.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/researcher_pft_statistics.py",
      "sha256": "aae1ab3b093eb3ce93208f3e1feae5091fdaf28ac18303438f4c06e52071925c"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Bounded controls for researcher-category identification, not field validation.",
      "export_expressions": [],
      "imports": {
        "annotations": "__future__.annotations",
        "identity_weights": "spectralbridge.researcher_information.identity_weights"
      },
      "module": "spectralbridge.researcher_validation",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Uniform nested subsets, independent of spectra, labels and target outcomes.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 9,
          "methods": [],
          "name": "random_feature_path",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "coordinates"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.researcher_validation.random_feature_path",
          "signature": "random_feature_path(coordinates, seed)",
          "summary": "Uniform nested subsets, independent of spectra, labels and target outcomes.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Per-ID correctness; repeated acquisitions cannot inflate biological weight.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 16,
          "methods": [],
          "name": "identity_correctness",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predicted"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            }
          ],
          "path": "spectralbridge.researcher_validation.identity_correctness",
          "signature": "identity_correctness(truth, predicted, identities)",
          "summary": "Per-ID correctness; repeated acquisitions cannot inflate biological weight.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/manuscript_synthesis/figure_data.py",
            "examples/manuscript_synthesis/validate_data.py",
            "examples/spectral_library_analytics_results.py",
            "examples/spectral_library_methods.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 32,
          "methods": [],
          "name": "balanced_accuracy",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predicted"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            }
          ],
          "path": "spectralbridge.researcher_validation.balanced_accuracy",
          "signature": "balanced_accuracy(truth, predicted, identities)",
          "summary": "Compute mean class recall with equal total weight per independent identity.",
          "summary_basis": "reference annotation; source hash-pinned in historical evidence"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Stratified whole-ID bootstrap of paired, fixed-rule balanced-accuracy gain.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 40,
          "methods": [],
          "name": "paired_identity_interval",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "frame"
            },
            {
              "annotation": null,
              "default": "'selected'",
              "kind": "positional-or-keyword",
              "name": "left"
            },
            {
              "annotation": null,
              "default": "'random'",
              "kind": "positional-or-keyword",
              "name": "right"
            },
            {
              "annotation": null,
              "default": "999",
              "kind": "positional-or-keyword",
              "name": "draws"
            },
            {
              "annotation": null,
              "default": "0",
              "kind": "positional-or-keyword",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.researcher_validation.paired_identity_interval",
          "signature": "paired_identity_interval(frame, left='selected', right='random', draws=999, seed=0)",
          "summary": "Stratified whole-ID bootstrap of paired, fixed-rule balanced-accuracy gain.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/researcher_validation.py",
      "sha256": "39178ead2057801e16900e6fbd43c4d1598eba44b29d583231e156d2c7fb0953"
    },
    {
      "area": "utilities",
      "constants": [
        {
          "annotation": "Mapping[str, tuple[str, ...]]",
          "name": "MICASENSE_LANDSAT_PAIRS",
          "value": "{'MicaSense_to-match_TM_and_ETM+': ('Landsat_5_TM', 'Landsat_7_ETM+'), 'MicaSense_to-match_OLI_and_OLI-2': ('Landsat_8_OLI', 'Landsat_9_OLI-2')}"
        },
        {
          "annotation": null,
          "name": "SPECTRAL_IDENTITY_ORDER",
          "value": "('coastal aerosol', 'blue', 'green', 'red', 'near infrared', 'shortwave infrared 1', 'shortwave infrared 2')"
        },
        {
          "annotation": null,
          "name": "SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
          "value": "'Both axes are synthetic products convolved from the same corrected NEON source. Coefficients are descriptive diagnostics, not empirical sensor calibration.'"
        }
      ],
      "declared_exports": [
        "MICASENSE_LANDSAT_PAIRS",
        "SPECTRAL_IDENTITY_ORDER",
        "SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
        "SensorBandIdentity",
        "sensor_band_identity",
        "wavelength_matched_band_pairs"
      ],
      "docstring": "Shared wavelength-matched synthetic sensor-pair definitions.",
      "export_expressions": [
        "__all__ = ['MICASENSE_LANDSAT_PAIRS', 'SPECTRAL_IDENTITY_ORDER', 'SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY', 'SensorBandIdentity', 'sensor_band_identity', 'wavelength_matched_band_pairs']"
      ],
      "imports": {
        "Mapping": "typing.Mapping",
        "annotations": "__future__.annotations",
        "dataclass": "dataclasses.dataclass",
        "lru_cache": "functools.lru_cache",
        "resources": "importlib.resources"
      },
      "module": "spectralbridge.sensor_pairs",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "sensor"
            },
            {
              "annotation": "int",
              "default": null,
              "name": "band_index"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "spectral_identity"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "wavelength_nm"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "fwhm_nm"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Physical identity for one one-based sensor band.",
          "examples": [],
          "exports": [
            "spectralbridge.sensor_pairs.SensorBandIdentity"
          ],
          "kind": "class",
          "line": 85,
          "methods": [],
          "name": "SensorBandIdentity",
          "parameters": [],
          "path": "spectralbridge.sensor_pairs.SensorBandIdentity",
          "signature": null,
          "summary": "Physical identity for one one-based sensor band.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 96,
          "methods": [],
          "name": "_sensor_parameters",
          "parameters": [],
          "path": "spectralbridge.sensor_pairs._sensor_parameters",
          "signature": "_sensor_parameters() -> dict[str, dict[str, list[float]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return packaged physical metadata, or ``None`` for a custom sensor.",
          "examples": [],
          "exports": [
            "spectralbridge.sensor_pairs.sensor_band_identity"
          ],
          "kind": "function",
          "line": 103,
          "methods": [],
          "name": "sensor_band_identity",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band_index"
            }
          ],
          "path": "spectralbridge.sensor_pairs.sensor_band_identity",
          "signature": "sensor_band_identity(sensor: str, band_index: int) -> SensorBandIdentity | None",
          "summary": "Return packaged physical metadata, or ``None`` for a custom sensor.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Pair shared spectral identities using packaged wavelength definitions.\n\nBand numbers are local to a sensor. For example, Landsat 5 TM blue band 1\ncorresponds to Landsat 8 OLI blue band 2 because OLI adds coastal aerosol\nas band 1. Matches also require the packaged source and target passbands to\noverlap, protecting the named identity table from inconsistent metadata.",
          "examples": [],
          "exports": [
            "spectralbridge.sensor_pairs.wavelength_matched_band_pairs"
          ],
          "kind": "function",
          "line": 129,
          "methods": [],
          "name": "wavelength_matched_band_pairs",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source_sensor"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "target_sensor"
            }
          ],
          "path": "spectralbridge.sensor_pairs.wavelength_matched_band_pairs",
          "signature": "wavelength_matched_band_pairs(source_sensor: str, target_sensor: str) -> tuple[tuple[int, int], ...]",
          "summary": "Pair shared spectral identities using packaged wavelength definitions.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/sensor_pairs.py",
      "sha256": "bcedd5dc0bdcac046497e0ef683e24d2ecc9eb16a42d202a1c35be25e2f9c660"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [
        "MICASENSE_LANDSAT_PAIRS",
        "SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
        "make_micasense_vs_landsat_panels",
        "make_sensor_vs_neon_panels"
      ],
      "docstring": "Generate multi-panel sensor comparison scatter plots from merged Parquet tables.\n\nThis module promotes the plotting helpers that previously lived only inside the\n``deprecated/pixel_extraction`` notebooks. The functions exposed here replicate\nthe layout and styling of the legacy figures so that the modern processing\npipeline can emit the same QA artifacts automatically.",
      "export_expressions": [
        "__all__ = ['MICASENSE_LANDSAT_PAIRS', 'SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY', 'make_sensor_vs_neon_panels', 'make_micasense_vs_landsat_panels']"
      ],
      "imports": {
        "Dict": "typing.Dict",
        "Iterable": "typing.Iterable",
        "List": "typing.List",
        "MICASENSE_LANDSAT_PAIRS": "spectralbridge.sensor_pairs.MICASENSE_LANDSAT_PAIRS",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY": "spectralbridge.sensor_pairs.SYNTHETIC_REGRESSION_EVIDENCE_BOUNDARY",
        "Sequence": "typing.Sequence",
        "Tuple": "typing.Tuple",
        "annotations": "__future__.annotations",
        "resources": "importlib.resources",
        "sensor_band_identity": "spectralbridge.sensor_pairs.sensor_band_identity",
        "wavelength_matched_band_pairs": "spectralbridge.sensor_pairs.wavelength_matched_band_pairs"
      },
      "module": "spectralbridge.sensor_panel_plots",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 54,
          "methods": [],
          "name": "_load_json_resource",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._load_json_resource",
          "signature": "_load_json_resource(name: str) -> dict",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 76,
          "methods": [],
          "name": "_sensor_band_text",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_label"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band_idx1"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._sensor_band_text",
          "signature": "_sensor_band_text(sensor_label: str, band_idx1: int) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 89,
          "methods": [],
          "name": "_corrected_band_text",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "corrected_label"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band_idx1"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._corrected_band_text",
          "signature": "_corrected_band_text(corrected_label: str, band_idx1: int) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the one-based hyperspectral band nearest a sensor center wavelength.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 95,
          "methods": [],
          "name": "_nearest_hyperspectral_band_index",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_label"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "band_idx1"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._nearest_hyperspectral_band_index",
          "signature": "_nearest_hyperspectral_band_index(sensor_label: str, band_idx1: int) -> int | None",
          "summary": "Return the one-based hyperspectral band nearest a sensor center wavelength.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 107,
          "methods": [],
          "name": "_read_schema",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._read_schema",
          "signature": "_read_schema(con: duckdb.DuckDBPyConnection, parquet_path: Path) -> List[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 153,
          "methods": [],
          "name": "_band_map",
          "parameters": [
            {
              "annotation": "Iterable[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "columns"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._band_map",
          "signature": "_band_map(columns: Iterable[str]) -> Dict[str, List[int]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 164,
          "methods": [],
          "name": "_pick_corrected_label",
          "parameters": [
            {
              "annotation": "Dict[str, List[int]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bandmap"
            },
            {
              "annotation": "int",
              "default": "426",
              "kind": "positional-or-keyword",
              "name": "need"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._pick_corrected_label",
          "signature": "_pick_corrected_label(bandmap: Dict[str, List[int]], need: int=426) -> Optional[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 171,
          "methods": [],
          "name": "_possible_error_cols",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "label"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "idx"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._possible_error_cols",
          "signature": "_possible_error_cols(label: str, idx: int) -> List[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 181,
          "methods": [],
          "name": "_present_error_cols",
          "parameters": [
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "all_cols"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "label"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "idx"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._present_error_cols",
          "signature": "_present_error_cols(all_cols: Sequence[str], label: str, idx: int) -> List[str]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 185,
          "methods": [],
          "name": "_palette_fraction_by_column",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": "Sequence[str]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "colnames"
            },
            {
              "annotation": "int",
              "default": "1",
              "kind": "positional-or-keyword",
              "name": "lo"
            },
            {
              "annotation": "int",
              "default": "255",
              "kind": "positional-or-keyword",
              "name": "hi"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._palette_fraction_by_column",
          "signature": "_palette_fraction_by_column(con: duckdb.DuckDBPyConnection, parquet_path: Path, colnames: Sequence[str], lo: int=1, hi: int=255) -> Dict[str, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 208,
          "methods": [],
          "name": "_sample_pair_df",
          "parameters": [
            {
              "annotation": "duckdb.DuckDBPyConnection",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "con"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "parquet_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "xcol"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ycol"
            },
            {
              "annotation": "int",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "max_points"
            },
            {
              "annotation": "float",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sentinel_at_or_below"
            },
            {
              "annotation": "Optional[Sequence[str]]",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "extra_zero_filters"
            },
            {
              "annotation": "int",
              "default": "_SYNTHETIC_REGRESSION_SEED",
              "kind": "positional-or-keyword",
              "name": "sample_seed"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._sample_pair_df",
          "signature": "_sample_pair_df(con: duckdb.DuckDBPyConnection, parquet_path: Path, xcol: str, ycol: str, max_points: int, sentinel_at_or_below: float, extra_zero_filters: Optional[Sequence[str]]=None, sample_seed: int=_SYNTHETIC_REGRESSION_SEED) -> pd.DataFrame",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 245,
          "methods": [],
          "name": "_linreg",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._linreg",
          "signature": "_linreg(x: np.ndarray, y: np.ndarray) -> Tuple[float, float]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return the ordinary least-squares values displayed on a scatter panel.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 252,
          "methods": [],
          "name": "_regression_metrics",
          "parameters": [
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._regression_metrics",
          "signature": "_regression_metrics(x: np.ndarray, y: np.ndarray) -> dict[str, float | int | None]",
          "summary": "Return the ordinary least-squares values displayed on a scatter panel.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 291,
          "methods": [],
          "name": "_regress_and_plot",
          "parameters": [
            {
              "annotation": "plt.Axes",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "ax"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "x"
            },
            {
              "annotation": "np.ndarray",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "y"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._regress_and_plot",
          "signature": "_regress_and_plot(ax: plt.Axes, x: np.ndarray, y: np.ndarray) -> dict[str, float | int | None]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 326,
          "methods": [],
          "name": "_iter_merged_parquets",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "merged_dir"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._iter_merged_parquets",
          "signature": "_iter_merged_parquets(merged_dir: Path) -> List[Path]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Render matched sensor products against corrected NEON bands.\n\nParameters\n----------\nmerged_dir : str | Path\n    Directory of existing merged Parquets with recognized sensor-labelled spectral columns.\nout_dir : str | Path | None, default=None\n    Directory for generated products; bulk outputs must be outside the read-only input tree.\nmax_points : int, default=50000\n    Maximum sampled points per plotted pair; controls rendering cost rather than total source-row coverage.\nsentinel_at_or_below : float, default=-9999.0\n    Exclude values at or below this numeric sentinel in stored reflectance units before paired plotting.\n\nReturns\n-------\nList[Path]\n    Paths to saved paired-scatter panel images; unsupported/missing sensor groups are skipped.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.make_sensor_vs_neon_panels",
            "spectralbridge.sensor_panel_plots.make_sensor_vs_neon_panels"
          ],
          "kind": "function",
          "line": 339,
          "methods": [],
          "name": "make_sensor_vs_neon_panels",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "merged_dir"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "out_dir"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "max_points"
            },
            {
              "annotation": "float",
              "default": "-9999.0",
              "kind": "keyword-only",
              "name": "sentinel_at_or_below"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots.make_sensor_vs_neon_panels",
          "signature": "make_sensor_vs_neon_panels(merged_dir: str | Path, out_dir: str | Path | None=None, *, max_points: int=50000, sentinel_at_or_below: float=-9999.0) -> List[Path]",
          "summary": "Render matched sensor products against corrected NEON bands.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 529,
          "methods": [],
          "name": "_collect_ms_ls_pairs",
          "parameters": [
            {
              "annotation": "Dict[str, List[int]]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "bandmap"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots._collect_ms_ls_pairs",
          "signature": "_collect_ms_ls_pairs(bandmap: Dict[str, List[int]]) -> Dict[Tuple[str, str], List[Tuple[int, int]]]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Render wavelength-matched MicaSense and Landsat diagnostic panels.\n\nParameters\n----------\nmerged_dir : str | Path\n    Directory of existing merged Parquets with recognized sensor-labelled spectral columns.\nout_dir : str | Path | None, default=None\n    Directory for generated products; bulk outputs must be outside the read-only input tree.\nmax_points : int, default=50000\n    Maximum sampled points per plotted pair; controls rendering cost rather than total source-row coverage.\nsentinel_at_or_below : float, default=-9999.0\n    Exclude values at or below this numeric sentinel in stored reflectance units before paired plotting.\n\nReturns\n-------\nList[Path]\n    Paths to saved wavelength-matched MicaSense/Landsat panel images; common-source synthetic pairs are diagnostic, not independent calibration.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.make_micasense_vs_landsat_panels",
            "spectralbridge.sensor_panel_plots.make_micasense_vs_landsat_panels"
          ],
          "kind": "function",
          "line": 553,
          "methods": [],
          "name": "make_micasense_vs_landsat_panels",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "merged_dir"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "out_dir"
            },
            {
              "annotation": "int",
              "default": "50000",
              "kind": "keyword-only",
              "name": "max_points"
            },
            {
              "annotation": "float",
              "default": "-9999.0",
              "kind": "keyword-only",
              "name": "sentinel_at_or_below"
            }
          ],
          "path": "spectralbridge.sensor_panel_plots.make_micasense_vs_landsat_panels",
          "signature": "make_micasense_vs_landsat_panels(merged_dir: str | Path, out_dir: str | Path | None=None, *, max_points: int=50000, sentinel_at_or_below: float=-9999.0) -> List[Path]",
          "summary": "Render wavelength-matched MicaSense and Landsat diagnostic panels.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/sensor_panel_plots.py",
      "sha256": "0a302adc6bfd459217bb35ec2dcdab8eb17a5d4e7c28c8de0894c425da7c396c"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Paired, conditional PFT structure under synthetic spectral reduction.\n\nMicaSense export identity remains gated. This is not independent sensor validation.",
      "export_expressions": [],
      "imports": {
        "AuditConfig": "spectralbridge.pft_method_audit.AuditConfig",
        "Path": "pathlib.Path",
        "UNASSIGNED": "spectralbridge.plant_spectral_pfts.UNASSIGNED",
        "_center": "spectralbridge.plant_pft_statistics._center",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "_history_keys": "spectralbridge.plant_pft_statistics._history_keys",
        "_seed": "spectralbridge.plant_pft_statistics._seed",
        "_write_json": "spectralbridge.plant_pft_statistics._write_json",
        "_year_plant_spectra": "spectralbridge.plant_spectral_years._year_plant_spectra",
        "asdict": "dataclasses.asdict",
        "combinations": "itertools.combinations",
        "holm": "spectralbridge.plant_pft_statistics.holm",
        "load_pft_crosswalk": "spectralbridge.plant_spectral_pfts.load_pft_crosswalk",
        "method_statistics": "spectralbridge.pft_method_audit.method_statistics",
        "npc_probability": "spectralbridge.pft_method_audit.npc_probability",
        "rankdata": "scipy.stats.rankdata",
        "run_plant_spectral_atlas": "spectralbridge.plant_spectral_atlas.run_plant_spectral_atlas",
        "tag_pfts": "spectralbridge.plant_spectral_pfts.tag_pfts",
        "upper_p": "spectralbridge.pft_method_audit.upper_p"
      },
      "module": "spectralbridge.sensor_pft_transfer",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "No guessed ten-band relabeling; the supplied MicaSense cannot pass.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 31,
          "methods": [],
          "name": "validate_sensor_coordinates",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer.validate_sensor_coordinates",
          "signature": "validate_sensor_coordinates(wavelengths, sensor)",
          "summary": "No guessed ten-band relabeling; the supplied MicaSense cannot pass.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Intersect valid observations before medians; reject identity/label drift.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 47,
          "methods": [],
          "name": "paired_observations",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "products"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer.paired_observations",
          "signature": "paired_observations(products)",
          "summary": "Intersect valid observations before medians; reject identity/label drift.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "GlobalID clusters coupled across sensors, contrasts and repeated years.\n\nStratify by label/site and complete year/history pattern to preserve cell\ncounts. Singleton strata remain fixed and are explicitly reported.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 77,
          "methods": [],
          "name": "joint_cluster_multiplicities",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "replicates"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer.joint_cluster_multiplicities",
          "signature": "joint_cluster_multiplicities(table, replicates, seed)",
          "summary": "GlobalID clusters coupled across sensors, contrasts and repeated years.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Stable centered sufficient moments for a fixed-count cluster bootstrap.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 106,
          "methods": [],
          "name": "bootstrap_contrasts",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "blocks"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "multiplicities"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "integration_weights"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer.bootstrap_contrasts",
          "signature": "bootstrap_contrasts(values, labels, blocks, multiplicities, integration_weights)",
          "summary": "Stable centered sufficient moments for a fixed-count cluster bootstrap.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Diagnostically project common-support NEON curves to seven OLI channels.\n\nArgs:\n    values (array-like): Stored reflectance, shape (N, B).\n    wavelengths (array-like): Increasing finite native coordinates (B,), nm.\n\nReturns:\n    tuple[numpy.ndarray, numpy.ndarray]: Projected values (N, 7), in input\n        units, and Gaussian response-mass fractions (7,). Order is coastal,\n        blue, green, red, NIR, SWIR1, SWIR2. Packaged centers/FWHMs define the\n        Gaussian approximation; these are not independent Landsat observations.\n\nRaises:\n    ValueError: Invalid grid/dimensions or no supported response mass.\n\nUses columns finite across all supplied observations and local quadrature\nonly across adjacent intervals <=8 nm. No interpolation across atmospheric\ngaps. Caller must omit excluded regions before this diagnostic. Applied\nafter medians, it need not equal a product convolved before medians.",
          "examples": [
            "examples/scientific_workflows_offline.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 134,
          "methods": [],
          "name": "project_neon_to_oli",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "wavelengths"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer.project_neon_to_oli",
          "signature": "project_neon_to_oli(values, wavelengths) -> tuple[np.ndarray, np.ndarray]",
          "summary": "Diagnostically project common-support NEON curves to seven OLI channels.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 177,
          "methods": [],
          "name": "_prepare",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer._prepare",
          "signature": "_prepare(source, root)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/api/scientific-analysis.md"
          ],
          "docstring": "Primary inferred-PFT and separate researcher-category paired OLI experiment.",
          "examples": [
            "examples/sensor_pft_transfer.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 247,
          "methods": [],
          "name": "run_sensor_pft_transfer",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "499",
              "kind": "keyword-only",
              "name": "bootstraps"
            },
            {
              "annotation": null,
              "default": "10",
              "kind": "keyword-only",
              "name": "minimum"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer.run_sensor_pft_transfer",
          "signature": "run_sensor_pft_transfer(source, output, *, config=None, bootstraps=499, minimum=10)",
          "summary": "Primary inferred-PFT and separate researcher-category paired OLI experiment.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [
            "examples/publication_figures/build_spectral_library_figures.py",
            "examples/publication_figures/figure_data.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 665,
          "methods": [],
          "name": "_correlations",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "retention"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer._correlations",
          "signature": "_correlations(retention, records, root)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 709,
          "methods": [],
          "name": "_cos",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "a"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "b"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer._cos",
          "signature": "_cos(a, b)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 713,
          "methods": [],
          "name": "_cross_site",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "retention"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            }
          ],
          "path": "spectralbridge.sensor_pft_transfer._cross_site",
          "signature": "_cross_site(retention, records, root)",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/sensor_pft_transfer.py",
      "sha256": "6210796fa19b01a989901d153dba0ee0e4f69c179d26f90f08c04ac0514a1424"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.sort_core",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 9,
          "methods": [],
          "name": "classify_name",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fname"
            }
          ],
          "path": "spectralbridge.sort_core.classify_name",
          "signature": "classify_name(fname: str) -> str",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/sort_core.py",
      "sha256": "ccc1da5b5a81235dd0bc70acb7cfc19d41260cbcdb46b83338cb06023141d0d3"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Training-confined prototype, domain and withheld-class diagnostics.\n\nExperimental audit outputs; no operational classification or purity guarantee.",
      "export_expressions": [],
      "imports": {
        "LearningConfig": "spectralbridge.spectral_learning.LearningConfig",
        "Path": "pathlib.Path",
        "SCHEMES": "spectralbridge.spectral_library_analytics.SCHEMES",
        "StableFSelector": "spectralbridge.spectral_learning.StableFSelector",
        "StandardScaler": "sklearn.preprocessing.StandardScaler",
        "StratifiedGroupKFold": "sklearn.model_selection.StratifiedGroupKFold",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "average_precision_score": "sklearn.metrics.average_precision_score",
        "cdist": "scipy.spatial.distance.cdist",
        "class_prototypes": "spectralbridge.spectral_learning.class_prototypes",
        "classification_metrics": "spectralbridge.spectral_learning.classification_metrics",
        "cluster_bootstrap_accuracy": "spectralbridge.spectral_learning.cluster_bootstrap_accuracy",
        "conformal_threshold": "spectralbridge.spectral_learning.conformal_threshold",
        "fit_novelty_space": "spectralbridge.spectral_learning.fit_novelty_space",
        "fit_training_model": "spectralbridge.spectral_learning.fit_training_model",
        "load_analytics_inputs": "spectralbridge.spectral_library_analytics.load_analytics_inputs",
        "novelty_scores": "spectralbridge.spectral_learning.novelty_scores",
        "outer_folds": "spectralbridge.spectral_learning.outer_folds",
        "prepare_fold": "spectralbridge.spectral_library_analytics.prepare_fold",
        "probabilities": "spectralbridge.spectral_learning.probabilities",
        "scheme_data": "spectralbridge.spectral_library_analytics.scheme_data",
        "stable_seed": "spectralbridge.spectral_library_analytics.stable_seed",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.spectral_analytics_extensions",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Publish a stage ledger last; reject altered completed outputs.",
          "examples": [
            "examples/plant_spectral_regions.py",
            "examples/spectral_library_analytics_results.py",
            "examples/validate_spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 39,
          "methods": [],
          "name": "checkpoint",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "directory"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identity"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "action"
            }
          ],
          "path": "spectralbridge.spectral_analytics_extensions.checkpoint",
          "signature": "checkpoint(directory, identity, action)",
          "summary": "Publish a stage ledger last; reject altered completed outputs.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Known-only higher empirical quantile of whole-identity maxima.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 64,
          "methods": [],
          "name": "novelty_threshold",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scores"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": "0.95",
              "kind": "positional-or-keyword",
              "name": "quantile"
            }
          ],
          "path": "spectralbridge.spectral_analytics_extensions.novelty_threshold",
          "signature": "novelty_threshold(scores, identities, quantile=0.95)",
          "summary": "Known-only higher empirical quantile of whole-identity maxima.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Unknown precision/recall and known rejection at a prechosen threshold.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 76,
          "methods": [],
          "name": "unknown_metrics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "is_unknown"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "scores"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "threshold"
            }
          ],
          "path": "spectralbridge.spectral_analytics_extensions.unknown_metrics",
          "signature": "unknown_metrics(is_unknown, scores, threshold)",
          "summary": "Unknown precision/recall and known rejection at a prechosen threshold.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Keep zero selected-band spectra for distance/PCA; angle is undefined.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 95,
          "methods": [],
          "name": "safe_novelty_scores",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "training"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "space"
            }
          ],
          "path": "spectralbridge.spectral_analytics_extensions.safe_novelty_scores",
          "signature": "safe_novelty_scores(values, training, space)",
          "summary": "Keep zero selected-band spectra for distance/PCA; angle is undefined.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run declared secondary comparisons with per-fold restart checkpoints.",
          "examples": [
            "examples/spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 116,
          "methods": [],
          "name": "run_extensions",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.spectral_analytics_extensions.run_extensions",
          "signature": "run_extensions(source, compact, root, *, config=None)",
          "summary": "Run declared secondary comparisons with per-fold restart checkpoints.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Predict observational domains on held-out identities, not instrument causes.",
          "examples": [
            "examples/spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 394,
          "methods": [],
          "name": "run_domains",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            }
          ],
          "path": "spectralbridge.spectral_analytics_extensions.run_domains",
          "signature": "run_domains(source, compact, root, *, config=None)",
          "summary": "Predict observational domains on held-out identities, not instrument causes.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/spectral_analytics_extensions.py",
      "sha256": "68a20f149344d8c54c8e33294766229f3e9fc1675d36ffbbd73d71834c0dc979"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Paired selected-coordinate counterparts of the saved synthetic mixture audit.\n\nExact saved parents, fractions, folds and EAR candidates are reused. No new\nindependent abundance truth is introduced. Coordinates use equal-channel RMSE;\nlegacy full NEON retains its disconnected-grid quadrature metric.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "StableFSelector": "spectralbridge.spectral_learning.StableFSelector",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "checkpoint": "spectralbridge.spectral_analytics_extensions.checkpoint",
        "detection_metrics": "spectralbridge.mixtures.detection_metrics",
        "fit_models": "spectralbridge.mixtures.fit_models",
        "load_analytics_inputs": "spectralbridge.spectral_library_analytics.load_analytics_inputs",
        "wavelength_weights": "spectralbridge.pft_method_audit.wavelength_weights"
      },
      "module": "spectralbridge.spectral_analytics_mixtures",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Reconstruct saved linear targets from explicit identity/year parents.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 23,
          "methods": [],
          "name": "reconstruct_saved_mixtures",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "records"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "index"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "spectra"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            }
          ],
          "path": "spectralbridge.spectral_analytics_mixtures.reconstruct_saved_mixtures",
          "signature": "reconstruct_saved_mixtures(records, index, spectra, labels)",
          "summary": "Reconstruct saved linear targets from explicit identity/year parents.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run the retained selected-endmember mixture sensitivity study using verified prior truth and fold membership.",
          "examples": [
            "examples/spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 40,
          "methods": [],
          "name": "run_selected_mixtures",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "previous"
            }
          ],
          "path": "spectralbridge.spectral_analytics_mixtures.run_selected_mixtures",
          "signature": "run_selected_mixtures(source, compact, root, previous)",
          "summary": "Run the retained selected-endmember mixture sensitivity study using verified prior truth and fold membership.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/spectral_analytics_mixtures.py",
      "sha256": "539f1bca6775241f374a986fbdb2b543ba39095ecbdc72648d6f5a1d15c0d537"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Independent numerical/lineage checks for completed experimental learning runs.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "balanced_accuracy_score": "sklearn.metrics.balanced_accuracy_score",
        "confusion_matrix": "sklearn.metrics.confusion_matrix",
        "f1_score": "sklearn.metrics.f1_score",
        "f_classif": "sklearn.feature_selection.f_classif",
        "flight_target_tables": "spectralbridge.mesma_readiness.flight_target_tables",
        "load_compact_inputs": "spectralbridge.mesma_readiness.load_compact_inputs",
        "probabilities": "spectralbridge.spectral_learning.probabilities",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.spectral_analytics_validation",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Verify owned bytes before trusted model loading; compare math and support.\n\nRequires the original library and verified compact products, read in place.\nNo new fit or selection is performed. This does not test external validity.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 14,
          "methods": [],
          "name": "validate_learning_run",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "destination"
            }
          ],
          "path": "spectralbridge.spectral_analytics_validation.validate_learning_run",
          "signature": "validate_learning_run(root, destination=None)",
          "summary": "Verify owned bytes before trusted model loading; compare math and support.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/spectral_analytics_validation.py",
      "sha256": "f255d4e060809b910cbba3fea7f255813befbba76958b2801a4a8b7b0c6ea659"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Focused scientific closure diagnostics; experimental, no production changes.\n\nPaired partitions are descriptive balanced-panel sums of squares, not causal\nvariance components or random regional effects. GlobalID is a polygon identity.",
      "export_expressions": [],
      "imports": {},
      "module": "spectralbridge.spectral_closure",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Per-observation weighted unit norm and amplitude; never fit on test rows.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 12,
          "methods": [],
          "name": "spectral_shape",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "weights"
            }
          ],
          "path": "spectralbridge.spectral_closure.spectral_shape",
          "signature": "spectral_shape(values, weights)",
          "summary": "Per-observation weighted unit norm and amplitude; never fit on test rows.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Explicit partial biological hierarchy; mixed cover is a proxy, not purity.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 30,
          "methods": [],
          "name": "closure_labels",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            }
          ],
          "path": "spectralbridge.spectral_closure.closure_labels",
          "signature": "closure_labels(table)",
          "summary": "Explicit partial biological hierarchy; mixed cover is a proxy, not purity.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Exact class/polygon/year/interaction/residual SS on a complete two-year panel.\n\nLabels must be stable per identity. Columns are spectral coordinates with\nexplicit positive quadrature weights. Class and polygon are nested; the\nbalanced time structure makes this decomposition orthogonal even with\nunequal class sizes. Components describe this panel, not a causal population.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 58,
          "methods": [],
          "name": "paired_partition",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "first"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "second"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "weights"
            }
          ],
          "path": "spectralbridge.spectral_closure.paired_partition",
          "signature": "paired_partition(first, second, labels, weights)",
          "summary": "Exact class/polygon/year/interaction/residual SS on a complete two-year panel.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Class-stratified identity resampling preserves both years of each pair.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 150,
          "methods": [],
          "name": "paired_partition_bootstrap",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "first"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "second"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "weights"
            },
            {
              "annotation": null,
              "default": "499",
              "kind": "keyword-only",
              "name": "replicates"
            },
            {
              "annotation": null,
              "default": "20261015",
              "kind": "keyword-only",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.spectral_closure.paired_partition_bootstrap",
          "signature": "paired_partition_bootstrap(first, second, labels, weights, *, replicates=499, seed=20261015)",
          "summary": "Class-stratified identity resampling preserves both years of each pair.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Multiclass one-versus-rest rates; undefined denominators stay NaN.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 180,
          "methods": [],
          "name": "one_vs_rest_metrics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predicted"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "classes"
            }
          ],
          "path": "spectralbridge.spectral_closure.one_vs_rest_metrics",
          "signature": "one_vs_rest_metrics(truth, predicted, classes)",
          "summary": "Multiclass one-versus-rest rates; undefined denominators stay NaN.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Conditional class-stratified whole-identity intervals for detection rates.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 218,
          "methods": [],
          "name": "cluster_rate_intervals",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predicted"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "classes"
            },
            {
              "annotation": null,
              "default": "499",
              "kind": "keyword-only",
              "name": "replicates"
            },
            {
              "annotation": null,
              "default": "20261015",
              "kind": "keyword-only",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.spectral_closure.cluster_rate_intervals",
          "signature": "cluster_rate_intervals(truth, predicted, identities, classes, *, replicates=499, seed=20261015)",
          "summary": "Conditional class-stratified whole-identity intervals for detection rates.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/spectral_closure.py",
      "sha256": "74cf936f11421aa709faec29e47daf22b92794e57be6b2c0b182ca40536c4863"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Experimental leakage-safe learning primitives for the library analytics audit.\n\nRequires the optional analytics extra. Nothing here is a stable top-level API or\nproof of ecological transfer. All model selection is confined to supplied proper\ntraining rows; outer/calibration memberships are explicit and testable.",
      "export_expressions": [],
      "imports": {
        "BaseEstimator": "sklearn.base.BaseEstimator",
        "ClassifierMixin": "sklearn.base.ClassifierMixin",
        "DummyClassifier": "sklearn.dummy.DummyClassifier",
        "GridSearchCV": "sklearn.model_selection.GridSearchCV",
        "KMeans": "sklearn.cluster.KMeans",
        "LogisticRegression": "sklearn.linear_model.LogisticRegression",
        "PCA": "sklearn.decomposition.PCA",
        "PLSRegression": "sklearn.cross_decomposition.PLSRegression",
        "Pipeline": "sklearn.pipeline.Pipeline",
        "RandomForestClassifier": "sklearn.ensemble.RandomForestClassifier",
        "ReadinessConfig": "spectralbridge.mesma_readiness.ReadinessConfig",
        "SVC": "sklearn.svm.SVC",
        "StandardScaler": "sklearn.preprocessing.StandardScaler",
        "StratifiedGroupKFold": "sklearn.model_selection.StratifiedGroupKFold",
        "TransformerMixin": "sklearn.base.TransformerMixin",
        "_folds": "spectralbridge.mesma_readiness._folds",
        "annotations": "__future__.annotations",
        "cdist": "scipy.spatial.distance.cdist",
        "dataclass": "dataclasses.dataclass",
        "f_classif": "sklearn.feature_selection.f_classif",
        "grouped_identity_split": "spectralbridge.mixtures.grouped_identity_split",
        "minimize_scalar": "scipy.optimize.minimize_scalar",
        "softmax": "scipy.special.softmax",
        "validate_holdout": "spectralbridge.mixtures.validate_holdout"
      },
      "module": "spectralbridge.spectral_learning",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "int",
              "default": "20261014",
              "name": "seed"
            },
            {
              "annotation": "int",
              "default": "3",
              "name": "plant_folds"
            },
            {
              "annotation": "int",
              "default": "10",
              "name": "minimum_train"
            },
            {
              "annotation": "int",
              "default": "3",
              "name": "minimum_test"
            },
            {
              "annotation": "float",
              "default": "0.2",
              "name": "calibration_fraction"
            },
            {
              "annotation": "int",
              "default": "25",
              "name": "minimum_calibration"
            },
            {
              "annotation": "int",
              "default": "499",
              "name": "bootstraps"
            },
            {
              "annotation": "float",
              "default": "0.1",
              "name": "conformal_alpha"
            },
            {
              "annotation": "int",
              "default": "3",
              "name": "inner_folds"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fixed experimental budgets; counts are identities, never source pixels.",
          "examples": [
            "examples/spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "class",
          "line": 31,
          "methods": [],
          "name": "LearningConfig",
          "parameters": [],
          "path": "spectralbridge.spectral_learning.LearningConfig",
          "signature": null,
          "summary": "Fixed experimental budgets; counts are identities, never source pixels.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Yield actual plant/site/year/flight masks with entire identities purged.\n\ntable requires label/site/year/GlobalID/flights. The existing readiness fold\ngenerator defines the seed/stratification. Unsupported folds are not omitted.",
          "examples": [
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 45,
          "methods": [],
          "name": "outer_folds",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.spectral_learning.outer_folds",
          "signature": "outer_folds(table, config=None)",
          "summary": "Yield actual plant/site/year/flight masks with entire identities purged.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Uniformly reserve whole training identities, not stratified pixel rows.\n\nReturns proper/calibration boolean masks. Caller checks class support before\nfitting. Labels never determine this split, and no outer-test data enter it.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 61,
          "methods": [],
          "name": "calibration_split",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": "0.2",
              "kind": "positional-or-keyword",
              "name": "fraction"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "positional-or-keyword",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.spectral_learning.calibration_split",
          "signature": "calibration_split(identities, fraction=0.2, seed=20261014)",
          "summary": "Uniformly reserve whole training identities, not stratified pixel rows.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Training-only F-rank coordinate selection with deterministic tie handling.\n\nF is an exploratory ranking, not confirmatory wavelength significance.\nSelected coordinates retain their input spectral order. k='all' keeps all.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 79,
          "methods": [
            {
              "docstring": "",
              "line": 86,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": null,
                  "default": "'all'",
                  "kind": "positional-or-keyword",
                  "name": "k"
                }
              ],
              "private": true,
              "signature": "__init__(self, k='all')"
            },
            {
              "docstring": "",
              "line": 89,
              "name": "fit",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "y"
                }
              ],
              "private": false,
              "signature": "fit(self, X, y)"
            },
            {
              "docstring": "",
              "line": 105,
              "name": "transform",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "transform(self, X)"
            }
          ],
          "name": "StableFSelector",
          "parameters": [],
          "path": "spectralbridge.spectral_learning.StableFSelector",
          "signature": null,
          "summary": "Training-only F-rank coordinate selection with deterministic tie handling.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "PLS regression on one-hot labels; argmax classification, raw softmax scores.\n\nRaw score normalization is not assumed calibrated. No class reweighting is\nimplicit in PLS. All preprocessing precedes this estimator in a fitted pipeline.",
          "examples": [
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "class",
          "line": 112,
          "methods": [
            {
              "docstring": "",
              "line": 119,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": null,
                  "default": "4",
                  "kind": "positional-or-keyword",
                  "name": "n_components"
                }
              ],
              "private": true,
              "signature": "__init__(self, n_components=4)"
            },
            {
              "docstring": "",
              "line": 122,
              "name": "fit",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "y"
                }
              ],
              "private": false,
              "signature": "fit(self, X, y)"
            },
            {
              "docstring": "",
              "line": 130,
              "name": "predict_proba",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "predict_proba(self, X)"
            },
            {
              "docstring": "",
              "line": 133,
              "name": "predict",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "predict(self, X)"
            }
          ],
          "name": "PLSDA",
          "parameters": [],
          "path": "spectralbridge.spectral_learning.PLSDA",
          "signature": null,
          "summary": "PLS regression on one-hot labels; argmax classification, raw softmax scores.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Equal-class nearest mean baseline in its training-scaled input space.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 137,
          "methods": [
            {
              "docstring": "",
              "line": 140,
              "name": "fit",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "y"
                }
              ],
              "private": false,
              "signature": "fit(self, X, y)"
            },
            {
              "docstring": "",
              "line": 148,
              "name": "predict_proba",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "predict_proba(self, X)"
            },
            {
              "docstring": "",
              "line": 151,
              "name": "predict",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "X"
                }
              ],
              "private": false,
              "signature": "predict(self, X)"
            }
          ],
          "name": "CentroidClassifier",
          "parameters": [],
          "path": "spectralbridge.spectral_learning.CentroidClassifier",
          "signature": null,
          "summary": "Equal-class nearest mean baseline in its training-scaled input space.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return an unfitted training-only pipeline and predeclared small inner grid.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 155,
          "methods": [],
          "name": "model_pipeline",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            },
            {
              "annotation": null,
              "default": "'all'",
              "kind": "keyword-only",
              "name": "k"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "keyword-only",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.spectral_learning.model_pipeline",
          "signature": "model_pipeline(name, *, k='all', seed=20261014)",
          "summary": "Return an unfitted training-only pipeline and predeclared small inner grid.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fit only supplied proper-training data; inner splits use GlobalID groups.\n\nReturns estimator plus choices/support/warnings. Caller separately validates\nthat these rows exclude outer-test and calibration identities.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 191,
          "methods": [],
          "name": "fit_training_model",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            },
            {
              "annotation": null,
              "default": "'all'",
              "kind": "keyword-only",
              "name": "k"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "3",
              "kind": "keyword-only",
              "name": "inner_folds"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "tune"
            },
            {
              "annotation": null,
              "default": "False",
              "kind": "keyword-only",
              "name": "allow_repeated_identity_labels"
            }
          ],
          "path": "spectralbridge.spectral_learning.fit_training_model",
          "signature": "fit_training_model(values, labels, identities, name, *, k='all', seed=20261014, inner_folds=3, tune=True, allow_repeated_identity_labels=False)",
          "summary": "Fit only supplied proper-training data; inner splits use GlobalID groups.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Model-order probabilities or explicitly uncalibrated normalized decisions.\n\nSVM avoids its row-splitting internal probability calibration entirely.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 282,
          "methods": [],
          "name": "probabilities",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "model"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "X"
            }
          ],
          "path": "spectralbridge.spectral_learning.probabilities",
          "signature": "probabilities(model, X)",
          "summary": "Model-order probabilities or explicitly uncalibrated normalized decisions.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Validate finite nonnegative (observations, classes) scores whose rows sum to one.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 297,
          "methods": [],
          "name": "check_probabilities",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "p"
            }
          ],
          "path": "spectralbridge.spectral_learning.check_probabilities",
          "signature": "check_probabilities(p)",
          "summary": "Validate finite nonnegative (observations, classes) scores whose rows sum to one.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Apply a positive temperature to clipped log probabilities and renormalize with softmax.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 312,
          "methods": [],
          "name": "temperature_probabilities",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "p"
            },
            {
              "annotation": null,
              "default": "1.0",
              "kind": "positional-or-keyword",
              "name": "temperature"
            }
          ],
          "path": "spectralbridge.spectral_learning.temperature_probabilities",
          "signature": "temperature_probabilities(p, temperature=1.0)",
          "summary": "Apply a positive temperature to clipped log probabilities and renormalize with softmax.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Fit one temperature using ONLY a separately reserved calibration sample.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 322,
          "methods": [],
          "name": "fit_temperature",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "p"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "encoded_truth"
            }
          ],
          "path": "spectralbridge.spectral_learning.fit_temperature",
          "signature": "fit_temperature(p, encoded_truth)",
          "summary": "Fit one temperature using ONLY a separately reserved calibration sample.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Finite-sample quantile of maximum RAW nonconformity per identity.\n\nScores must come from a predictor fitted independently of these labels.\nDo NOT pass temperature scores fitted on the same calibration labels.\nGeographic shift and nonexchangeable sampling do not gain a guarantee.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 339,
          "methods": [],
          "name": "conformal_threshold",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_calibration_p"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "encoded_truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": "0.1",
              "kind": "positional-or-keyword",
              "name": "alpha"
            }
          ],
          "path": "spectralbridge.spectral_learning.conformal_threshold",
          "signature": "conformal_threshold(raw_calibration_p, encoded_truth, identities, alpha=0.1)",
          "summary": "Finite-sample quantile of maximum RAW nonconformity per identity.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Empirical row/whole-identity prediction-set coverage, not a shift guarantee.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 363,
          "methods": [],
          "name": "conformal_metrics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "raw_test_p"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "encoded_truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "threshold"
            }
          ],
          "path": "spectralbridge.spectral_learning.conformal_metrics",
          "signature": "conformal_metrics(raw_test_p, encoded_truth, identities, threshold)",
          "summary": "Empirical row/whole-identity prediction-set coverage, not a shift guarantee.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Balanced accuracy/macro F1 and calibration with explicit class order.\n\nBrier = mean sum-class squared error (range 0\u20132). ECE is top-label,\nequal-width-bin absolute calibration error. No pixel independence assumed.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 385,
          "methods": [],
          "name": "classification_metrics",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "p"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "classes"
            },
            {
              "annotation": null,
              "default": "10",
              "kind": "keyword-only",
              "name": "bins"
            }
          ],
          "path": "spectralbridge.spectral_learning.classification_metrics",
          "signature": "classification_metrics(truth, p, classes, *, bins=10)",
          "summary": "Balanced accuracy/macro F1 and calibration with explicit class order.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Stratified whole-identity balanced-accuracy draws for paired comparisons.\n\nIdentical ordered inputs/classes/seed give identical draws across sensors.\nIntervals condition on observed sites/classes, not a site superpopulation.",
          "examples": [
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 464,
          "methods": [],
          "name": "cluster_bootstrap_accuracy",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "truth"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "predicted"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "classes"
            },
            {
              "annotation": null,
              "default": "499",
              "kind": "keyword-only",
              "name": "replicates"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "keyword-only",
              "name": "seed"
            },
            {
              "annotation": null,
              "default": "True",
              "kind": "keyword-only",
              "name": "stratify"
            }
          ],
          "path": "spectralbridge.spectral_learning.cluster_bootstrap_accuracy",
          "signature": "cluster_bootstrap_accuracy(truth, predicted, identities, classes, *, replicates=499, seed=20261014, stratify=True)",
          "summary": "Stratified whole-identity balanced-accuracy draws for paired comparisons.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Training-only empirical class representatives; never a purity certificate.\n\nSupply one row per training identity in the chosen spectral metric. Mean and\nmedian are synthetic prototypes; medoid/diversity/cluster_medoid are observed\nrows. cluster_medoid is a KMeans-nearest-observation adaptation, not global PAM.\nReturns spectra, labels and source row positions (-1 for synthetic centers).",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 522,
          "methods": [],
          "name": "class_prototypes",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "labels"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identities"
            },
            {
              "annotation": null,
              "default": "'medoid'",
              "kind": "keyword-only",
              "name": "method"
            },
            {
              "annotation": null,
              "default": "1",
              "kind": "keyword-only",
              "name": "count"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "keyword-only",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.spectral_learning.class_prototypes",
          "signature": "class_prototypes(values, labels, identities, *, method='medoid', count=1, seed=20261014)",
          "summary": "Training-only empirical class representatives; never a purity certificate.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Training-only scaled PCA novelty scores; no Gaussian/outlier guarantee.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 583,
          "methods": [],
          "name": "fit_novelty_space",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "training"
            }
          ],
          "path": "spectralbridge.spectral_learning.fit_novelty_space",
          "signature": "fit_novelty_space(training)",
          "summary": "Training-only scaled PCA novelty scores; no Gaussian/outlier guarantee.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Nearest angle/distance and PCA radius/reconstruction residual.\n\nAll geometry comes from supplied proper training, not final/unknown targets.\nDistances are exploratory diagnostics calibrated on separate known identities.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 597,
          "methods": [],
          "name": "novelty_scores",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "training"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "space"
            }
          ],
          "path": "spectralbridge.spectral_learning.novelty_scores",
          "signature": "novelty_scores(values, training, space)",
          "summary": "Nearest angle/distance and PCA radius/reconstruction residual.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/spectral_learning.py",
      "sha256": "c19b335d8c27701f254d7b9ac518a27c9f6003b91a2cecb104a939b0051e845a"
    },
    {
      "area": "analysis",
      "constants": [],
      "declared_exports": [],
      "docstring": "Experimental integrated spectral-library analytics, with immutable inputs.\n\nA source-specific scientific experiment, not a stable top-level package API.\nRead the predeclared design before interpreting predictive or mixture outputs.",
      "export_expressions": [],
      "imports": {
        "LearningConfig": "spectralbridge.spectral_learning.LearningConfig",
        "Path": "pathlib.Path",
        "ThreadPoolExecutor": "concurrent.futures.ThreadPoolExecutor",
        "_file_hash": "spectralbridge.plant_spectral_atlas._file_hash",
        "annotations": "__future__.annotations",
        "as_completed": "concurrent.futures.as_completed",
        "asdict": "dataclasses.asdict",
        "calibration_split": "spectralbridge.spectral_learning.calibration_split",
        "classification_metrics": "spectralbridge.spectral_learning.classification_metrics",
        "cluster_bootstrap_accuracy": "spectralbridge.spectral_learning.cluster_bootstrap_accuracy",
        "conformal_metrics": "spectralbridge.spectral_learning.conformal_metrics",
        "conformal_threshold": "spectralbridge.spectral_learning.conformal_threshold",
        "fit_temperature": "spectralbridge.spectral_learning.fit_temperature",
        "fit_training_model": "spectralbridge.spectral_learning.fit_training_model",
        "flight_target_tables": "spectralbridge.mesma_readiness.flight_target_tables",
        "load_compact_inputs": "spectralbridge.mesma_readiness.load_compact_inputs",
        "outer_folds": "spectralbridge.spectral_learning.outer_folds",
        "probabilities": "spectralbridge.spectral_learning.probabilities",
        "signature_sha256": "spectralbridge.bulk.provenance.signature_sha256",
        "temperature_probabilities": "spectralbridge.spectral_learning.temperature_probabilities",
        "validate_holdout": "spectralbridge.mixtures.validate_holdout",
        "write_json_atomic": "spectralbridge.bulk.provenance.write_json_atomic"
      },
      "module": "spectralbridge.spectral_library_analytics",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Derive a deterministic 32-bit-compatible random seed from a name and base seed.",
          "examples": [
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 49,
          "methods": [],
          "name": "stable_seed",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            },
            {
              "annotation": null,
              "default": "20261014",
              "kind": "positional-or-keyword",
              "name": "seed"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.stable_seed",
          "signature": "stable_seed(name, seed=20261014)",
          "summary": "Derive a deterministic 32-bit-compatible random seed from a name and base seed.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Verify upstream compact ownership, write only metadata/reference index.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 55,
          "methods": [],
          "name": "load_analytics_inputs",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.load_analytics_inputs",
          "signature": "load_analytics_inputs(source, compact, output)",
          "summary": "Verify upstream compact ownership, write only metadata/reference index.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Subset paired arrays to assigned, nonmissing labels with nonzero spectral support.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 139,
          "methods": [],
          "name": "scheme_data",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "values"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "field"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.scheme_data",
          "signature": "scheme_data(table, values, field)",
          "summary": "Subset paired arrays to assigned, nonmissing labels with nonzero spectral support.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Report per-label training/test identity counts and explicit closed/open/insufficient-support statuses.",
          "examples": [
            "examples/spectral_library_analytics_results.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 151,
          "methods": [],
          "name": "fold_support",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "train"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "test"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.fold_support",
          "signature": "fold_support(table, train, test, config)",
          "summary": "Report per-label training/test identity counts and explicit closed/open/insufficient-support statuses.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Class support/calibration gates, using actual flight targets when required.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 174,
          "methods": [],
          "name": "prepare_fold",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "arrays"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "actual"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "fold"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "kind"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "train"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "test"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.prepare_fold",
          "signature": "prepare_fold(table, arrays, actual, fold, kind, train, test, config)",
          "summary": "Class support/calibration gates, using actual flight targets when required.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Decode a representation name into its NEON/OLI sensor and feature budget; the arrays argument is retained but unused.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 232,
          "methods": [],
          "name": "representation_values",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "arrays"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "representation"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.representation_values",
          "signature": "representation_values(arrays, representation)",
          "summary": "Decode a representation name into its NEON/OLI sensor and feature budget; the arrays argument is retained but unused.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "One owned restartable fit; no final-test labels influence fitting choices.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 244,
          "methods": [],
          "name": "fit_predict_case",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "table"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "arrays"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "waves"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "prepared"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "context"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "representation"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "model_name"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "root"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "identity"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.fit_predict_case",
          "signature": "fit_predict_case(table, arrays, waves, prepared, context, representation, model_name, root, identity, config)",
          "summary": "One owned restartable fit; no final-test labels influence fitting choices.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Profile declared models without computing or inspecting outer-test scores.",
          "examples": [
            "examples/spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 483,
          "methods": [],
          "name": "profile_learning",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "config"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.profile_learning",
          "signature": "profile_learning(source, compact, output, config=None)",
          "summary": "Profile declared models without computing or inspecting outer-test scores.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run declared classical models/representations with per-fit restart checks.\n\nAll-flight diagnostics use logistic/full/OLI. Plant/site/year comparisons use\nall model baselines at full/OLI plus logistic selected-coordinate curves.\nNo ordinary pixel-level observations are materialized.",
          "examples": [
            "examples/spectral_library_analytics.py"
          ],
          "exports": [],
          "kind": "function",
          "line": 532,
          "methods": [],
          "name": "run_learning",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "source"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "compact"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output"
            },
            {
              "annotation": null,
              "default": "None",
              "kind": "keyword-only",
              "name": "config"
            },
            {
              "annotation": null,
              "default": "False",
              "kind": "keyword-only",
              "name": "first_pass"
            },
            {
              "annotation": null,
              "default": "2",
              "kind": "keyword-only",
              "name": "workers"
            }
          ],
          "path": "spectralbridge.spectral_library_analytics.run_learning",
          "signature": "run_learning(source, compact, output, *, config=None, first_pass=False, workers=2)",
          "summary": "Run declared classical models/representations with per-fit restart checks.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/spectral_library_analytics.py",
      "sha256": "9ceffde617aae99bb53afdb3964fe7eaad1ba2f80dc67e5e84700a9776a91683"
    },
    {
      "area": "corrections",
      "constants": [],
      "declared_exports": [],
      "docstring": "Legacy spectral resampling helpers with HyTools-derived code.\n\n``apply_resampler`` is substantially identical to the HyTools implementation in\n``src/hytools/transform/resampling.py``. Other parts of this module have distinct\nor uncertain lineage; see ``HYTOOLS_PROVENANCE.md``.\n\nHyTools: Hyperspectral image processing library\nCopyright (C) 2021 University of Wisconsin\nAuthors named in the relevant source notice: Adam Chlus, Zhiwei Ye, Philip Townsend.\nLicense: GNU General Public License, version 3\nUpstream: https://github.com/EnSpec/hytools\nAudited revision: 31286d64541791a9815d29443a33726fa4d54031\n\nModified for SpectralBridge. SpectralBridge's project license and the upstream\nnotice are recorded in ``LICENSE``, ``NOTICE``, and ``HYTOOLS_PROVENANCE.md``.",
      "export_expressions": [],
      "imports": {
        "NEONReflectanceBRDFCorrectedENVIFile": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIFile",
        "NEONReflectanceBRDFCorrectedENVIHDRFile": "spectralbridge.file_types.NEONReflectanceBRDFCorrectedENVIHDRFile",
        "NEONReflectanceResampledHDRFile": "spectralbridge.file_types.NEONReflectanceResampledHDRFile",
        "Path": "pathlib.Path",
        "calc_resample_coeffs": "hytools.transform.resampling.calc_resample_coeffs",
        "get_package_data_path": "spectralbridge.utils.get_package_data_path",
        "interp1d": "scipy.interpolate.interp1d",
        "require_spectral": "spectralbridge._optional.require_spectral"
      },
      "module": "spectralbridge.standard_resample",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Apply a HyTools resampler configuration to a data slice.\n\nThis function is substantially identical to HyTools\n``transform.resampling.apply_resampler`` at the audited revision recorded in\nthe module notice. SpectralBridge retains it for the legacy resampling path.\n\nArgs:\n    hy_obj (TYPE): DESCRIPTION.\n\nReturns:\n    band (TYPE): DESCRIPTION.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 116,
          "methods": [],
          "name": "apply_resampler",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hy_obj"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "data"
            }
          ],
          "path": "spectralbridge.standard_resample.apply_resampler",
          "signature": "apply_resampler(hy_obj, data)",
          "summary": "Apply a HyTools resampler configuration to a data slice.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Configure the retained legacy sensor-response resampler and ENVI writer.",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 158,
          "methods": [
            {
              "docstring": "Initializes the resampler object with the specified sensor type, JSON file, and HDR file path.\n- sensor_type: The type of the sensor (e.g., 'Landsat 8 OLI') for which resampling is to be performed.\n- json_file: Path to the JSON file containing Landsat band parameters (wavelengths and FWHMs).\n- hdr_path: Path to the HDR file which contains wavelength information for the sensor data.\n\nThe method performs several key steps:\n1. Reads and converts wavelengths from the HDR file into a NumPy array.\n2. Sets up a fixed number of bands and a default FWHM value, creating an array for these FWHMs.\n3. Initializes a dictionary to store ancillary data and an array to flag bad bands.\n4. Reads the JSON file to get the band parameters for the given sensor type.\n5. Checks if the sensor type is valid and present in the JSON data.\n6. Extracts output wavelengths and FWHM values for the specified sensor type and stores them.\n7. Configures the resampler settings (type, output wavelengths, and FWHMs).\n\nThe configuration for resampling is set up based on the Landsat sensor \ntype specified. This includes defining the output wavelengths and FWHMs which are crucial\nfor the resampling process.",
              "line": 162,
              "name": "__init__",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "sensor_type"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "json_file"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "hdr_path"
                }
              ],
              "private": true,
              "signature": "__init__(self, sensor_type, json_file, hdr_path)"
            },
            {
              "docstring": "Reads and extracts wavelength information from an ENVI header file.\n\n- hdr_path: The file path to the ENVI header (.hdr) file.\n\nThe method performs the following steps:\n1. Reads the header file using the Spectral Python (SPy) library's `read_envi_header` function.\n2. Extracts the wavelength information, which is typically a list of strings representing wavelength values.\n3. Converts these string values to floats, making them usable for numerical operations.\n\nReturns:\n- A list of wavelength values as floats if successfully extracted.\n\nIf the wavelength information is not found in the header file, the method raises a ValueError, indicating the absence of this crucial data. This method is essential for processing spectral data as it provides the fundamental wavelength values needed for various analytical processes, such as resampling.",
              "line": 206,
              "name": "get_in_wavelength",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "hdr_path"
                }
              ],
              "private": false,
              "signature": "get_in_wavelength(hdr_path)"
            },
            {
              "docstring": "Generate a list of FWHM values for each band in hyperspectral data.\n\n:param number_of_bands: int\n    The total number of bands in the hyperspectral data.\n:param fwhm_value: float, optional (default is 5)\n    The FWHM value for each band (in nm).\n\n:return: list\n    A list of FWHM values for each band.",
              "line": 237,
              "name": "get_in_fwhm",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "number_of_bands"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "fwhm_value"
                }
              ],
              "private": false,
              "signature": "get_in_fwhm(number_of_bands, fwhm_value)"
            },
            {
              "docstring": "Create header information for the resampled data.\n:param hdr_path: string\n    Path and file name of the hdr file\n:return: dict\n    Dictionary containing header information for the ENVI file, including CRS.",
              "line": 252,
              "name": "create_header_info",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "hdr_path"
                }
              ],
              "private": false,
              "signature": "create_header_info(self, hdr_path)"
            },
            {
              "docstring": "Save data in ENVI format.\n\n:param data: The hyperspectral data to save.\n:param header_info: Header information for the data.\n:param output_filename: The filename for the saved data.",
              "line": 296,
              "name": "save_envi_data",
              "parameters": [
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "data"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "header_info"
                },
                {
                  "annotation": null,
                  "default": null,
                  "kind": "positional-or-keyword",
                  "name": "output_filename"
                }
              ],
              "private": false,
              "signature": "save_envi_data(data, header_info, output_filename)"
            }
          ],
          "name": "resampler_hy_obj",
          "parameters": [],
          "path": "spectralbridge.standard_resample.resampler_hy_obj",
          "signature": null,
          "summary": "Configure the retained legacy sensor-response resampler and ENVI writer.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Load hyperspectral data from an ENVI binary file.\n\n:param filename: The filename of the ENVI binary file (without the .hdr extension).\n:return: The loaded hyperspectral data as a spectral image object.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 307,
          "methods": [],
          "name": "load_envi_data",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "filename"
            }
          ],
          "path": "spectralbridge.standard_resample.load_envi_data",
          "signature": "load_envi_data(filename)",
          "summary": "Load hyperspectral data from an ENVI binary file.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Read an existing ENVI product and write one target-sensor product through the retained legacy resampler.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 324,
          "methods": [],
          "name": "translate_to_sensor",
          "parameters": [
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "sensor_type"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "json_file"
            },
            {
              "annotation": null,
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "resampling_file_path"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_file_path"
            }
          ],
          "path": "spectralbridge.standard_resample.translate_to_sensor",
          "signature": "translate_to_sensor(sensor_type, json_file, hdr_path, resampling_file_path: str, output_file_path: str)",
          "summary": "Read an existing ENVI product and write one target-sensor product through the retained legacy resampler.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run the retained legacy resampler for its configured Landsat and MicaSense targets.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 343,
          "methods": [],
          "name": "translate_to_other_sensors",
          "parameters": [
            {
              "annotation": "NEONReflectanceBRDFCorrectedENVIFile",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "brdf_corrected_img_file"
            }
          ],
          "path": "spectralbridge.standard_resample.translate_to_other_sensors",
          "signature": "translate_to_other_sensors(brdf_corrected_img_file: NEONReflectanceBRDFCorrectedENVIFile)",
          "summary": "Run the retained legacy resampler for its configured Landsat and MicaSense targets.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/standard_resample.py",
      "sha256": "c0d77f4c1fee78afe8639446b70f024aea8f90216020ece0c6959f7a71052fc9"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "__all__"
      ],
      "docstring": "Backward-compatible shim for the legacy HyTools correction helpers.",
      "export_expressions": [
        "__all__ = list(getattr(_LEGACY_MODULE, '__all__', ()))"
      ],
      "imports": {
        "annotations": "__future__.annotations",
        "import_module": "importlib.import_module"
      },
      "module": "spectralbridge.topo_and_brdf_correction",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 24,
          "methods": [],
          "name": "__getattr__",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "name"
            }
          ],
          "path": "spectralbridge.topo_and_brdf_correction.__getattr__",
          "signature": "__getattr__(name: str)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 28,
          "methods": [],
          "name": "__dir__",
          "parameters": [],
          "path": "spectralbridge.topo_and_brdf_correction.__dir__",
          "signature": "__dir__() -> list[str]",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/topo_and_brdf_correction.py",
      "sha256": "77f27476750040703f1d426ae72ee2839a027ddc8c3b145c833f4a6cd51094f8"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "",
      "export_expressions": [],
      "imports": {
        "Protocol": "typing.Protocol",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.types_protocol",
      "objects": [
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "kind"
            },
            {
              "annotation": "bool",
              "default": null,
              "name": "is_masked"
            }
          ],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "class",
          "line": 4,
          "methods": [],
          "name": "HasKind",
          "parameters": [],
          "path": "spectralbridge.types_protocol.HasKind",
          "signature": null,
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 8,
          "methods": [],
          "name": "categorize_file",
          "parameters": [
            {
              "annotation": "HasKind",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "obj"
            }
          ],
          "path": "spectralbridge.types_protocol.categorize_file",
          "signature": "categorize_file(obj: HasKind) -> str",
          "summary": "",
          "summary_basis": "not documented"
        }
      ],
      "path": "src/spectralbridge/types_protocol.py",
      "sha256": "bde578b0b7cf8b476159e18c24ddf4471ea9e0b293f079a91a0a69c564214384"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "build_drone_qa_summary",
        "get_package_data_path"
      ],
      "docstring": "Utility helpers for :mod:`spectralbridge`.",
      "export_expressions": [
        "__all__ = ['build_drone_qa_summary', 'get_package_data_path']"
      ],
      "imports": {
        "build_drone_qa_summary": "spectralbridge.utils.qa_summary.build_drone_qa_summary",
        "get_package_data_path": "spectralbridge.utils.paths.get_package_data_path"
      },
      "module": "spectralbridge.utils",
      "objects": [],
      "path": "src/spectralbridge/utils/__init__.py",
      "sha256": "29dcae7fce67a087b9cc00eb97ff668a911046b48e8d3b8035f5a1c76b5289e9"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "Memory management helpers for pipeline stages.",
      "export_expressions": [],
      "imports": {},
      "module": "spectralbridge.utils.memory",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Force garbage collection and log memory usage.\nCalled between major pipeline stages to keep RAM low.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 14,
          "methods": [],
          "name": "clean_memory",
          "parameters": [
            {
              "annotation": "str",
              "default": "''",
              "kind": "positional-or-keyword",
              "name": "label"
            }
          ],
          "path": "spectralbridge.utils.memory.clean_memory",
          "signature": "clean_memory(label: str='') -> None",
          "summary": "Force garbage collection and log memory usage.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/utils/memory.py",
      "sha256": "89a7f94bc65a8e4464c4c4924359b602d060005851e1e1a34b33c2119f847ebf"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "get_flight_paths",
        "get_flightline_products"
      ],
      "docstring": "Canonical path helpers for pipeline outputs.",
      "export_expressions": [
        "__all__ = ['get_flight_paths', 'get_flightline_products']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Dict": "typing.Dict",
        "FlightlinePaths": "spectralbridge.paths.FlightlinePaths",
        "Optional": "typing.Optional",
        "Path": "pathlib.Path",
        "Tuple": "typing.Tuple",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.utils.naming",
      "objects": [
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/naming-conventions.md",
            "docs/reference/extending.md"
          ],
          "docstring": "Return canonical high-level paths for a flight line.",
          "examples": [],
          "exports": [
            "spectralbridge.utils.naming.get_flight_paths"
          ],
          "kind": "function",
          "line": 12,
          "methods": [],
          "name": "get_flight_paths",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            }
          ],
          "path": "spectralbridge.utils.naming.get_flight_paths",
          "signature": "get_flight_paths(base_folder: Path, flight_stem: str) -> Dict[str, Path]",
          "summary": "Return canonical high-level paths for a flight line.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Try to identify the *uncorrected* ENVI pair for ``flight_stem``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 24,
          "methods": [],
          "name": "_pick_uncorrected_envi_pair",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "primary_dir"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            },
            {
              "annotation": "Optional[Path]",
              "default": "None",
              "kind": "keyword-only",
              "name": "legacy_dir"
            }
          ],
          "path": "spectralbridge.utils.naming._pick_uncorrected_envi_pair",
          "signature": "_pick_uncorrected_envi_pair(primary_dir: Path, flight_stem: str, *, legacy_dir: Optional[Path]=None) -> Tuple[Optional[Path], Optional[Path]]",
          "summary": "Try to identify the *uncorrected* ENVI pair for ``flight_stem``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Documented direct-module API; advanced or experimental, not promoted by this reference",
          "docs_references": [
            "docs/dev/architecture-audit.md",
            "docs/naming-conventions.md",
            "docs/pipeline/outputs.md"
          ],
          "docstring": "Return canonical paths for artefacts tied to ``flight_stem``.",
          "examples": [],
          "exports": [
            "spectralbridge.utils.naming.get_flightline_products"
          ],
          "kind": "function",
          "line": 113,
          "methods": [],
          "name": "get_flightline_products",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_folder"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "product_code"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "flight_stem"
            }
          ],
          "path": "spectralbridge.utils.naming.get_flightline_products",
          "signature": "get_flightline_products(base_folder: Path, product_code: str, flight_stem: str) -> Dict[str, Any]",
          "summary": "Return canonical paths for artefacts tied to ``flight_stem``.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/utils/naming.py",
      "sha256": "4afe93f821c37e63b35998ad123236f3eb41e417a38bdeeeab58a720a14c0d8a"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [],
      "docstring": "Path utilities for locating package data files.",
      "export_expressions": [],
      "imports": {
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.utils.paths",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 7,
          "methods": [],
          "name": "_package_root",
          "parameters": [],
          "path": "spectralbridge.utils.paths._package_root",
          "signature": "_package_root() -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Return the absolute path to a bundled data file.\n\nParameters\n----------\nfilename : str\n    Package-relative resource name beneath spectralbridge/data; missing resources raise FileNotFoundError.\n\nReturns\n-------\nPath\n    Absolute existing bundled resource path.\n\nRaises\n------\nFileNotFoundError\n    If a required source or completed artifact is absent.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.\n\nExamples\n--------\n>>> from spectralbridge.utils import get_package_data_path\n>>> assert get_package_data_path(\"landsat_band_parameters.json\").is_file()",
          "examples": [],
          "exports": [
            "spectralbridge.utils.get_package_data_path"
          ],
          "kind": "function",
          "line": 11,
          "methods": [],
          "name": "get_package_data_path",
          "parameters": [
            {
              "annotation": "str",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "filename"
            }
          ],
          "path": "spectralbridge.utils.paths.get_package_data_path",
          "signature": "get_package_data_path(filename: str) -> Path",
          "summary": "Return the absolute path to a bundled data file.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/utils/paths.py",
      "sha256": "a5c90d2e4a54119cf2d72463969fcaf820758306301a29174bf15d8c5d90fb26"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "build_drone_qa_summary",
        "render_drone_qa_report"
      ],
      "docstring": "Compact, restart-safe drone QA dashboard and report assembly.",
      "export_expressions": [
        "__all__ = ['build_drone_qa_summary', 'render_drone_qa_report']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Path": "pathlib.Path",
        "PdfPages": "matplotlib.backends.backend_pdf.PdfPages",
        "STATUS_COLORS": "spectralbridge.qa_style.STATUS_COLORS",
        "__version__": "spectralbridge.__version__",
        "annotations": "__future__.annotations",
        "datetime": "datetime.datetime",
        "timezone": "datetime.timezone"
      },
      "module": "spectralbridge.utils.qa_summary",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 23,
          "methods": [],
          "name": "_safe_read_qa_png",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qa_png"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._safe_read_qa_png",
          "signature": "_safe_read_qa_png(qa_png: Path)",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 30,
          "methods": [],
          "name": "_read_payload",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_dir"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qa_summary"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._read_payload",
          "signature": "_read_payload(base_dir: Path, qa_summary: dict[str, Any] | None) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 39,
          "methods": [],
          "name": "_finite",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._finite",
          "signature": "_finite(value: Any) -> float | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 47,
          "methods": [],
          "name": "_metric_from_translation_qa",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "file_audit"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._metric_from_translation_qa",
          "signature": "_metric_from_translation_qa(file_audit: dict[str, Any]) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 74,
          "methods": [],
          "name": "_landsat_metrics",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "file_audit"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._landsat_metrics",
          "signature": "_landsat_metrics(file_audit: dict[str, Any]) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 103,
          "methods": [],
          "name": "_dashboard_metrics",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "payload"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._dashboard_metrics",
          "signature": "_dashboard_metrics(payload: dict[str, Any]) -> dict[str, Any]",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 206,
          "methods": [],
          "name": "_fmt",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            },
            {
              "annotation": "int",
              "default": "3",
              "kind": "keyword-only",
              "name": "digits"
            },
            {
              "annotation": "str",
              "default": "''",
              "kind": "keyword-only",
              "name": "suffix"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._fmt",
          "signature": "_fmt(value: Any, *, digits: int=3, suffix: str='') -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 211,
          "methods": [],
          "name": "_render_dashboard",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "metrics"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "output_png"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._render_dashboard",
          "signature": "_render_dashboard(metrics: dict[str, Any], output_png: Path) -> Path",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 331,
          "methods": [],
          "name": "_signature",
          "parameters": [
            {
              "annotation": "dict[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "payload"
            },
            {
              "annotation": "list[Path]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "qa_pngs"
            }
          ],
          "path": "spectralbridge.utils.qa_summary._signature",
          "signature": "_signature(payload: dict[str, Any], qa_pngs: list[Path]) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Render/reuse the final dashboard and PDF using compact QA products only.",
          "examples": [],
          "exports": [
            "spectralbridge.utils.qa_summary.render_drone_qa_report"
          ],
          "kind": "function",
          "line": 360,
          "methods": [],
          "name": "render_drone_qa_report",
          "parameters": [
            {
              "annotation": "str | Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_dir"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "qa_summary"
            },
            {
              "annotation": "str | Path | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "output_pdf"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "force"
            }
          ],
          "path": "spectralbridge.utils.qa_summary.render_drone_qa_report",
          "signature": "render_drone_qa_report(base_dir: str | Path, *, qa_summary: dict[str, Any] | None=None, output_pdf: str | Path | None=None, force: bool=False) -> dict[str, Any]",
          "summary": "Render/reuse the final dashboard and PDF using compact QA products only.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "public",
          "classification_reason": "Explicit package/subpackage export",
          "docs_references": [],
          "docstring": "Backward-compatible wrapper returning the final drone QA PDF path.\n\nParameters\n----------\nbase_dir : Path\n    Directory containing completed drone QA products to summarize.\noutput_html : Path | None, default=None\n    Legacy report destination argument forwarded to the established QA report writer; the wrapper returns its final PDF path.\npattern : str, default='*__qa.png'\n    Glob selecting legacy per-flight QA PNG products when no structured QA summary is supplied.\nqa_summary : dict[str, Any] | None, default=None\n    Optional structured drone QA payload; None discovers the established on-disk summary/products.\nforce : bool, default=False\n    Regenerate the requested outputs instead of reusing an otherwise valid checkpoint or report.\n\nReturns\n-------\nPath\n    Final drone QA PDF path produced by the compatibility report wrapper.\n\nSee Also\n--------\nspectralbridge.pipelines.pipeline.process_one_flightline : Related source-derived API contract.",
          "examples": [],
          "exports": [
            "spectralbridge.utils.build_drone_qa_summary",
            "spectralbridge.utils.qa_summary.build_drone_qa_summary"
          ],
          "kind": "function",
          "line": 462,
          "methods": [],
          "name": "build_drone_qa_summary",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "base_dir"
            },
            {
              "annotation": "Path | None",
              "default": "None",
              "kind": "positional-or-keyword",
              "name": "output_html"
            },
            {
              "annotation": "str",
              "default": "'*__qa.png'",
              "kind": "positional-or-keyword",
              "name": "pattern"
            },
            {
              "annotation": "dict[str, Any] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "qa_summary"
            },
            {
              "annotation": "bool",
              "default": "False",
              "kind": "keyword-only",
              "name": "force"
            }
          ],
          "path": "spectralbridge.utils.qa_summary.build_drone_qa_summary",
          "signature": "build_drone_qa_summary(base_dir: Path, output_html: Path | None=None, pattern: str='*__qa.png', *, qa_summary: dict[str, Any] | None=None, force: bool=False) -> Path",
          "summary": "Backward-compatible wrapper returning the final drone QA PDF path.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/utils/qa_summary.py",
      "sha256": "2a7efa9b73a4019799b357eed5d313fc8e751e9dbbe948bda4715cf2a6ec1f70"
    },
    {
      "area": "utilities",
      "constants": [],
      "declared_exports": [
        "_nonempty_file",
        "is_valid_envi_pair",
        "is_valid_json"
      ],
      "docstring": "Lightweight file integrity helpers for pipeline idempotency checks.",
      "export_expressions": [
        "__all__ = ['_nonempty_file', 'is_valid_envi_pair', 'is_valid_json']"
      ],
      "imports": {
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations"
      },
      "module": "spectralbridge.utils_checks",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return ``True`` if *path* exists, is a file, and has non-zero size.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 9,
          "methods": [],
          "name": "_nonempty_file",
          "parameters": [
            {
              "annotation": "Path | None",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.utils_checks._nonempty_file",
          "signature": "_nonempty_file(path: Path | None) -> bool",
          "summary": "Return ``True`` if *path* exists, is a file, and has non-zero size.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return ``True`` if both ENVI files exist and are non-empty.",
          "examples": [],
          "exports": [
            "spectralbridge.utils_checks.is_valid_envi_pair"
          ],
          "kind": "function",
          "line": 21,
          "methods": [],
          "name": "is_valid_envi_pair",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "img_path"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "hdr_path"
            }
          ],
          "path": "spectralbridge.utils_checks.is_valid_envi_pair",
          "signature": "is_valid_envi_pair(img_path: Path, hdr_path: Path) -> bool",
          "summary": "Return ``True`` if both ENVI files exist and are non-empty.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Return ``True`` if the JSON file exists, is non-empty, and parses.",
          "examples": [],
          "exports": [
            "spectralbridge.utils_checks.is_valid_json"
          ],
          "kind": "function",
          "line": 27,
          "methods": [],
          "name": "is_valid_json",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "json_path"
            }
          ],
          "path": "spectralbridge.utils_checks.is_valid_json",
          "signature": "is_valid_json(json_path: Path) -> bool",
          "summary": "Return ``True`` if the JSON file exists, is non-empty, and parses.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/utils_checks.py",
      "sha256": "2ec8a6d4201d620883a672451cc3e9b062dbf392bfd407a976261826fb73d1c4"
    },
    {
      "area": "qa",
      "constants": [],
      "declared_exports": [
        "ValidationCase",
        "ValidationObservation",
        "ValidationResult",
        "load_campaign",
        "run_campaign",
        "run_case",
        "write_campaign"
      ],
      "docstring": "Structured evidence records for SpectralBridge validation campaigns.\n\nValidation campaigns are distinct from ordinary unit tests.  A unit test protects\none contract; a campaign runs a named operation over a matrix of input variations\nand preserves the diagnostics as publication-facing evidence.",
      "export_expressions": [
        "__all__ = ['ValidationCase', 'ValidationObservation', 'ValidationResult', 'load_campaign', 'run_campaign', 'run_case', 'write_campaign']"
      ],
      "imports": {
        "Any": "typing.Any",
        "Callable": "typing.Callable",
        "Iterable": "typing.Iterable",
        "Mapping": "typing.Mapping",
        "Path": "pathlib.Path",
        "annotations": "__future__.annotations",
        "asdict": "dataclasses.asdict",
        "dataclass": "dataclasses.dataclass",
        "datetime": "datetime.datetime",
        "field": "dataclasses.field",
        "timezone": "datetime.timezone"
      },
      "module": "spectralbridge.validation",
      "objects": [
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "Return a recursively JSON-compatible representation of ``value``.",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 23,
          "methods": [],
          "name": "_json_value",
          "parameters": [
            {
              "annotation": "Any",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "value"
            }
          ],
          "path": "spectralbridge.validation._json_value",
          "signature": "_json_value(value: Any) -> Any",
          "summary": "Return a recursively JSON-compatible representation of ``value``.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "diagnostics"
            },
            {
              "annotation": "Mapping[str, bool]",
              "default": null,
              "name": "checks"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "()",
              "name": "notes"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Diagnostics and explicit checks returned by one validation variation.",
          "examples": [],
          "exports": [
            "spectralbridge.validation.ValidationObservation"
          ],
          "kind": "class",
          "line": 43,
          "methods": [],
          "name": "ValidationObservation",
          "parameters": [],
          "path": "spectralbridge.validation.ValidationObservation",
          "signature": null,
          "summary": "Diagnostics and explicit checks returned by one validation variation.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "module"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "variation_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "description"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "inputs"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "expected"
            },
            {
              "annotation": "ValidationRunner | None",
              "default": "field(repr=False, compare=False)",
              "name": "runner"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "skip_reason"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "One operation/input combination in a validation campaign.",
          "examples": [],
          "exports": [
            "spectralbridge.validation.ValidationCase"
          ],
          "kind": "class",
          "line": 52,
          "methods": [],
          "name": "ValidationCase",
          "parameters": [],
          "path": "spectralbridge.validation.ValidationCase",
          "signature": null,
          "summary": "One operation/input combination in a validation campaign.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [
            {
              "annotation": "str",
              "default": null,
              "name": "module"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "variation_id"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "description"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "inputs"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "expected"
            },
            {
              "annotation": "str",
              "default": null,
              "name": "status"
            },
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "name": "diagnostics"
            },
            {
              "annotation": "Mapping[str, bool]",
              "default": null,
              "name": "checks"
            },
            {
              "annotation": "float",
              "default": null,
              "name": "duration_seconds"
            },
            {
              "annotation": "tuple[str, ...]",
              "default": "()",
              "name": "notes"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "error"
            },
            {
              "annotation": "str | None",
              "default": "None",
              "name": "skip_reason"
            }
          ],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Serializable result from one :class:`ValidationCase`.",
          "examples": [],
          "exports": [
            "spectralbridge.validation.ValidationResult"
          ],
          "kind": "class",
          "line": 65,
          "methods": [
            {
              "docstring": "",
              "line": 81,
              "name": "to_dict",
              "parameters": [],
              "private": false,
              "signature": "to_dict(self) -> dict[str, Any]"
            }
          ],
          "name": "ValidationResult",
          "parameters": [],
          "path": "spectralbridge.validation.ValidationResult",
          "signature": null,
          "summary": "Serializable result from one :class:`ValidationCase`.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run one case, converting failures and skips into structured evidence.",
          "examples": [],
          "exports": [
            "spectralbridge.validation.run_case"
          ],
          "kind": "function",
          "line": 85,
          "methods": [],
          "name": "run_case",
          "parameters": [
            {
              "annotation": "ValidationCase",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "case"
            }
          ],
          "path": "spectralbridge.validation.run_case",
          "signature": "run_case(case: ValidationCase) -> ValidationResult",
          "summary": "Run one case, converting failures and skips into structured evidence.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 129,
          "methods": [],
          "name": "_git_revision",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "repo_root"
            }
          ],
          "path": "spectralbridge.validation._git_revision",
          "signature": "_git_revision(repo_root: Path) -> str",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "internal",
          "classification_reason": "Private/compatibility/CLI module or implementation utility",
          "docs_references": [],
          "docstring": "",
          "examples": [],
          "exports": [],
          "kind": "function",
          "line": 142,
          "methods": [],
          "name": "_git_dirty",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "repo_root"
            }
          ],
          "path": "spectralbridge.validation._git_dirty",
          "signature": "_git_dirty(repo_root: Path) -> bool | None",
          "summary": "",
          "summary_basis": "not documented"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Run ``cases`` and return a versioned, machine-readable campaign record.",
          "examples": [],
          "exports": [
            "spectralbridge.validation.run_campaign"
          ],
          "kind": "function",
          "line": 156,
          "methods": [],
          "name": "run_campaign",
          "parameters": [
            {
              "annotation": "Iterable[ValidationCase]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "cases"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "campaign_id"
            },
            {
              "annotation": "str",
              "default": null,
              "kind": "keyword-only",
              "name": "mode"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "keyword-only",
              "name": "repo_root"
            },
            {
              "annotation": "Mapping[str, Any] | None",
              "default": "None",
              "kind": "keyword-only",
              "name": "metadata"
            }
          ],
          "path": "spectralbridge.validation.run_campaign",
          "signature": "run_campaign(cases: Iterable[ValidationCase], *, campaign_id: str, mode: str, repo_root: Path, metadata: Mapping[str, Any] | None=None) -> dict[str, Any]",
          "summary": "Run ``cases`` and return a versioned, machine-readable campaign record.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Atomically write one campaign JSON file.",
          "examples": [],
          "exports": [
            "spectralbridge.validation.write_campaign"
          ],
          "kind": "function",
          "line": 186,
          "methods": [],
          "name": "write_campaign",
          "parameters": [
            {
              "annotation": "Mapping[str, Any]",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "campaign"
            },
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.validation.write_campaign",
          "signature": "write_campaign(campaign: Mapping[str, Any], path: Path) -> Path",
          "summary": "Atomically write one campaign JSON file.",
          "summary_basis": "source docstring"
        },
        {
          "attributes": [],
          "audience": "advanced",
          "classification_reason": "Direct module API; no package-level stability guarantee",
          "docs_references": [],
          "docstring": "Load and minimally validate a campaign record.",
          "examples": [],
          "exports": [
            "spectralbridge.validation.load_campaign"
          ],
          "kind": "function",
          "line": 200,
          "methods": [],
          "name": "load_campaign",
          "parameters": [
            {
              "annotation": "Path",
              "default": null,
              "kind": "positional-or-keyword",
              "name": "path"
            }
          ],
          "path": "spectralbridge.validation.load_campaign",
          "signature": "load_campaign(path: Path) -> dict[str, Any]",
          "summary": "Load and minimally validate a campaign record.",
          "summary_basis": "source docstring"
        }
      ],
      "path": "src/spectralbridge/validation.py",
      "sha256": "e17ff9f4632c58897b14b380657fc91a5a848ddf0e6c3d38c00c6eefc7e73fa7"
    }
  ],
  "policy": "Public: explicit supported package/subpackage exports or library_analysis facade. Advanced: other non-private direct-module definitions. Internal: private, compatibility and CLI implementation helpers. Classification documents existing visibility; it changes no exports.",
  "schema_version": 1,
  "unresolved_exports": []
}
