Review date: 2026-09-04 Branch: main
This file is the authoritative work queue for non-trivial SpectralBridge work. Agents must update it before coding, after verification, and whenever work is left incomplete so the next agent can resume immediately.
- Read this file before making substantive changes.
- Select the highest-priority unfinished item unless the user directs otherwise.
- Update the chosen item with
Status,Owner,Started, andPlanbefore coding. - Add or update tests with every behavior change.
- Update docs when public behavior, contracts, outputs, or workflows change.
- After verification, record outcome, blockers, and the next recommended task.
- Priority: User-directed
- Status: Implemented and committed; push blocked
- Owner: Codex
- Started: 2026-09-06
- Goal: Correct the built-in product schema so target-only canonical flightlines containing all four Landsat and both matched MicaSense products are recognized as eligible for all four default translation relationships.
- Scope:
- Diagnose realistic filename matching, sidecar pairing, source-record sensor assignment, product availability, and default pair completeness.
- Preserve strict generic validation and the target-only translation profile.
- Add focused realistic filename and six-family target-only discovery/full-run regressions.
- Run focused and full verification, then commit and push the fix to main.
- Outcome:
- Confirmed that both realistic filename regexes, including the escaped
literal
+, match the intended descriptors and that.img-to-.hdrsidecar resolution is correct. - Corrected the built-in product descriptors to the authoritative generated schemas: four matched TM/ETM+ bands and five matched OLI/OLI-2 bands. Updated the four default pair descriptors to use the corresponding 1:1 matched subsets while preserving six-band TM/ETM+ and seven-band OLI/OLI-2 target expectations.
- Added a production-shaped, target-only canonical fixture with exactly the six staged product families. Discovery exposes all six sensor names and correct headers, marks all four relationships complete, accepts the flightline without raw/corrected hyperspectral products, and completes the translation pipeline.
- Updated the installed-artifact bulk fixture to use the correct five-band matched OLI product.
- Confirmed that both realistic filename regexes, including the escaped
literal
- Verification:
- Focused filename and six-family tests: 2 passed.
- Bulk plus installed-smoke tests: 44 passed.
- Full suite: 295 collected, 289 passed, 6 skipped; known warnings only.
- Ruff, compileall,
git diff --check, docs-link validation, strict MkDocs, and AI-transparency freshness checks passed. - Fresh wheel and sdist build passed; the freshly built wheel passed the bounded offline installed-artifact smoke for normal, drone, and bulk.
- Blockers: The local branch is committed and one commit ahead of
origin/main, but this host cannot authenticate to GitHub: HTTPS has no usable username/ credential, SSH has no accepted public key, and the GitHub CLI is unavailable. - Next recommended task: Authenticate this host, run
git push origin main, then rerun native preflight on the read-only 122-flightline staging tree and retain its census/exclusion outputs as production-validation evidence.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-09-04
- Goal: Keep the bulk workflow generic by modeling flightline identity, product recognition, analysis requirements, translation relationships, and structured exclusions independently of any validation archive, site set, sensor pair, or manuscript analysis.
- Scope:
- Add an extensible identity/product registry and generic translation-pair descriptors while retaining built-in NEON and Landsat/MicaSense support.
- Separate processing completeness, product availability, and profile-specific analysis eligibility, including minimal target-only input.
- Add deterministic machine-readable exclusion records and configurable invalid-flightline behavior with population-safe exclusion as the default.
- Expose simple analysis/profile and sensor/pair selection through Python and CLI, preserve current calls, and return a useful structured preflight.
- Cover generic/nested/target-only/zero-byte/missing/malformed/duplicate/ transient/optional-QA cases with tiny neutral fixtures and update the generic single/multiple/bulk user journey.
- Plan:
- Audit the just-added archive adapter and existing bulk analysis assumptions against current package metadata, public APIs, normal output naming, tests, and docs.
- Introduce small immutable profile/product/pair/reason-code contracts and centralize target recognition without changing upstream science.
- Adapt discovery, extraction, catalog persistence, orchestration, and preflight around those contracts; keep analysis modules independently callable and merged-Parquet compatibility intact.
- Verify focused behavior first, then full tests, lint, compilation, strict docs, generated artifacts, and a fresh package build when tooling permits.
- Outcome: Added modular scientific identity parsing, analysis profiles, product and translation-pair registries, target-only eligibility, strict per-flightline validation, population-safe extraction, deterministic exclusion Parquet/JSON/CSV, configurable pair selection, structured preflight, provenance, generic documentation, and neutral regression fixtures. P74 corrected the final production-discovered default band-schema mismatch without adding campaign-specific behavior.
- Verification: Full source suite, Ruff, compileall, documentation links, strict MkDocs, transparency freshness, package build, and exact-wheel installed-artifact smoke passed on 2026-09-06; see P74 for counts.
- Blockers: None.
- Next recommended task: Preserve the real staging run as external validation evidence; do not encode its hierarchy or flightline count in package logic.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-09-04
- Goal: Make
run_bulk_pipelineconsume completed normal-pipeline flightline directories beneath arbitrary compute/storage folders, derive compact restart-safe analytical observations in a separate output cache, and retain compatibility with canonical merged-Parquet inputs. - Scope:
- Audit and document the actual normal-pipeline on-disk output contract.
- Add automatic or explicit discovery modes for completed flightline outputs and prebuilt merged Parquets, with canonical NEON identity authoritative.
- Add fast metadata-only preflight, duplicate/incomplete classification, QA-aware catalog records, chunked target-product extraction, provenance, failure isolation, and restart-safe per-flightline caches.
- Feed compact observations into the existing DuckDB/census/translation/LOSO analysis layer without changing scientific algorithms, coefficients, thresholds, or normal-pipeline defaults.
- Update tests, the bulk vignette/notebook workflow, and publication-facing documentation for the real Aug 2026 archive layout.
- Plan:
- Trace authoritative normal output naming and the current bulk schema and analysis requirements before selecting required target products.
- Extend catalog/preflight models and discovery with analysis-specific eligibility and duplicate handling.
- Implement bounded ENVI-to-compact-Parquet extraction under
bulk_output/cacheusing existing readers, followed by the existing analytical pipeline. - Add realistic nested-tree, duplicate, incomplete, restart, no-data, and end-to-end tests; then run targeted and repository-wide verification.
- Audited normal-pipeline output contract:
- The scientific unit is
<base>/<canonical-flightline-id>/; the HDF5 input may remain at<base>/<canonical-flightline-id>.h5. - Raw ENVI is persisted as the canonical uncorrected
*_envi.img/.hdrpair. Corrected ENVI is persisted as<id>_brdfandtopo_corrected_envi.img/.hdr, with correction JSON and the canonical<id>_brdf_model.jsonsidecar. - A completed convolution stage persists seven target ENVI pairs: Landsat 5
TM, Landsat 7 ETM+, Landsat 8 OLI, Landsat 9 OLI-2, MicaSense, and the two
wavelength-matched MicaSense products. Brightness-adjusted products and
their convolution-only
*_undarkened_envicompanions may both exist. - Root QA files and
qa/stages/*products are persisted when their stages complete; metadata/config JSON and CSV sidecars are optional evidence. - Raw, corrected, target-sensor, and merged Parquets are conditional on the extraction branch and successful downstream completion. Full extraction creates them by default, while polygon extraction deliberately skips the full-pixel Parquets. Therefore merged Parquet is useful compatibility input but is not a valid prerequisite for recognizing a completed archive.
- Current translation analyses require only canonical identity and at least one wavelength-matched MicaSense/Landsat target pair. They do not require rereading corrected hyperspectral bands or rerunning convolution.
- The scientific unit is
- Outcome:
run_bulk_pipeline(..., input_mode="auto")now prefers recursively discovered canonical completed-flightline directories, while explicitflightline_outputsand compatiblemerged_parquetmodes remain available.- Metadata-only preflight catalogs canonical identity, arbitrary outer storage provenance, raw/corrected/target products, QA status and selected QA invalid/no-data metrics, pair eligibility, duplicates, structural rejection reasons, source bytes, and estimated cache bytes without reading raster pixels.
- Eligible target-sensor ENVI products are read in bounded windows through
the existing Parquet reader. Narrow per-sensor files and joined
observations are written only under
bulk_output/cache, carry source and extraction provenance, reuse valid caches, and isolate failures by flightline. Correction and convolution are never recomputed. - The existing DuckDB federation, census, pooled/per-flightline/per-site and balanced regressions, candidate coefficient export, and leave-one-site-out modules consume the compact caches unchanged.
- README, architecture/output/CLI/naming documentation, bulk vignette, notebook, and publication audit now state the direct normal-output contract. The installed-artifact smoke fixture also exercises this preferred mode.
- Verification:
.venv/bin/pytest -q tests/test_bulk_pipeline.py tests/test_installed_artifact_smoke.py— 27 passed..venv/bin/pytest -q— 272 passed, 6 skipped.uvx ruff check src tests scripts/check_installed_artifact.py scripts/check_release_metadata.py scripts/generate_ai_transparency.py scripts/generate_validation_docs.py scripts/run_validation_campaign.py— passed.- Python compileall, notebook JSON validation, docs-link check, strict MkDocs
build, AI-transparency freshness check, and
git diff --check— passed. - A fresh wheel rebuild was attempted for a new exact-artifact run, but the execution approval service rejected cache access after its usage limit was reached. The installed-smoke code path itself passed in the focused test; the rebuilt-wheel rerun remains an explicit verification gap rather than a hidden success claim.
- Blockers: None for the implemented source contract. Fresh exact-wheel confirmation remains pending external tool availability.
- Next recommended task: Generalize completed-flightline discovery, product requirements, and translation relationships so the validation archive remains an example rather than the package data model (P73).
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-09-04
- Goal: Make the exact built wheel execute every major public stage of the normal NEON, drone, and bulk pipelines on deliberately tiny deterministic fixtures outside the checkout, while keeping production-scale scientific validation as a separate evidence tier.
- Scope:
- Extend
scripts/check_installed_artifact.pyto exercise real correction, convolution/resampling, extraction, merge, QA, restart, drone full/polygon, and bulk materialization paths without altering scientific algorithms or defaults. - Add explicit fixture/resource budgets, offline isolation, readable-output assertions, and focused tests for the smoke framework.
- Remove the normal pipeline's runtime dependence on the repository-local
bin/validate_parquetsimplementation. - Add a Python 3.10/3.11/3.12 clean-wheel release-artifact gate and document the two-tier synthetic-smoke versus real-production validation contract.
- Extend
- Plan:
- Trace the three pipeline orchestrators and reuse the smallest valid synthetic fixtures and production stage functions already covered nearby.
- Move Parquet validation into an installed package module with a compatible repository CLI wrapper and focused regression tests.
- Implement and test bounded stage-complete fixtures, then integrate the exact built artifact into release CI without adding a publishing step.
- Update the publication audit and durable production-validation evidence template, build both artifacts, clean-install the exact wheel across the supported matrix, and record only observed results.
- Outcome:
- Expanded
scripts/check_installed_artifact.pyinto a deterministic, offline, stage-complete exact-artifact check. Normal uses an 8 x 8 x 32 H5 and runs raw ENVI, BRDF/topographic preparation and application, all seven sensor products, full Parquet extraction, merge, stage/legacy QA, and a restart reuse assertion. Drone uses two 8 x 8 x 10 H5 fixtures and runs real correction, full and intersecting-polygon extraction, merge, and QA. Bulk uses three flightlines/twelve rows and runs discovery, catalog, DuckDB, census, translation, LOSO, optional materialization, and restart. - Added one-worker/thread and eight-row chunk limits, fixture-dimension and 2 MiB H5 ceilings, blocked sockets, temp-root/symlink containment, a 128 MiB output ceiling, readable-value/schema assertions, and elapsed/size output.
- Moved Parquet validation into installed
spectralbridge.parquet_validation, added thespectralbridge-validate-parquetsconsole command, and retained the former repository script only as a compatibility wrapper. - Refactored the GitHub release workflow to run source/docs/version gates,
build wheel and sdist once, run
twine check, install the exact wheel in clean Python 3.10/3.11/3.12 jobs plus the sdist on Python 3.10, and permit a GitHub release only after all artifact smokes pass. No PyPI publish step was added. - Documented Tier A installed-artifact CI versus Tier B large-VM production validation and added a durable production-run evidence checklist.
- Expanded
- Verification:
- Focused source tests: 81 passed, with existing deprecation/all-NaN warnings.
- Full source suite passed with six skips and the same known warnings.
- Ruff passed for
src,tests, and all release/validation scripts used by the workflow. Python compilation, generated AI-transparency and validation checks, documentation links, strict MkDocs build, and workflow YAML parsing also passed. - The release-metadata gate correctly rejects the current
v2.2.0candidate because the first changelog version is2.3.0; this is a documented release decision, not a smoke-framework failure. - Final build: wheel (371,053 bytes) and sdist (15,644,694 bytes) succeeded;
both passed
twine check. Expected setuptools license-deprecation and existing sdist inventory warnings remain. - The final exact wheel stage-complete smoke passed outside the checkout on local macOS Python 3.10.16, 3.11.11, and 3.12.8; dependency checks passed in all three environments. Temporary output remained approximately 12.2–12.5 MB per run. The first complete matrix pass finished in 28.350, 30.329, and 28.228 seconds respectively; the final rebuilt-wheel pass also completed successfully.
- The final exact sdist install and the same smoke passed on Python 3.10.16, producing 12,224,965 bytes in 18.148 seconds; its dependency check passed.
- Synthetic H5 files are approximately 24,016 bytes (normal) and 18,296
bytes (drone). Wheel SHA-256:
5761dcde1e6340dda83f4e34fad28888a4219799783a1f26611a4b01af4dcfe1; sdist SHA-256:557a3e3d052defe8e6e72e001eea58dadf87875d9a15a0828c67141f5057d1c5.
- Remaining blockers: The actual Linux GitHub matrix has not run until this change reaches CI. PyPI remains blocked on maintainer decisions for release version/history, authorship and DOI, data/asset provenance and licensing, dependency policy, and trusted-publishing ownership/configuration.
- Next recommended task: Resolve the publication version and approved citation identity, then run a release-candidate Tier B validation on a large-memory VM and attach both tiers of evidence to the candidate.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-09-03
- Goal: Determine, from built distribution artifacts and clean installed
environments, whether the normal NEON, drone, and bulk pipelines can be run
after
pip install spectralbridgewithout a repository checkout. - Scope:
- Inventory public APIs, CLIs, runtime package data, dependencies, Python support, version/citation metadata, CI/release workflows, documentation, compatibility paths, scientific configuration, licensing, and repository hygiene.
- Build and inspect the real wheel and sdist, validate their metadata, and install artifacts into isolated environments with the checkout excluded from import resolution.
- Exercise all three installed pipelines with the smallest meaningful offline fixtures available, recording limitations rather than changing scientific behavior.
- Create an authoritative prioritized audit and ordered PyPI release checklist; do not publish, tag, or broadly refactor during this task.
- Plan:
- Audit package configuration, APIs, resources, docs, tests, CI, release metadata, citation, license, and prior readiness material.
- Build wheel and sdist with intended tooling and inspect exact contents.
- Run clean-install import, CLI, resource, and three-pipeline smoke checks.
- Document blockers and maintainer decisions with concrete evidence and update this work queue after verification.
- Outcome:
- Added
docs/dev/publication-hardening-audit-2026-09-04.mdas the current authoritative PyPI readiness decision. The verdict is not ready and the audit records six release blockers, high-priority risks, evidence limits, ownership, and an ordered publication checklist. - Built and inspected the exact 2.2.0 wheel and sdist, validated both with Twine, and confirmed that all five runtime data resources are in both artifacts and load from installed package paths.
- Clean-installed the wheel outside the checkout on Python 3.10, 3.11, 3.12, and 3.14 and the sdist on Python 3.10. Imports, dependencies, all 15 CLI help paths, and the deliberately abbreviated three-pipeline smoke passed.
- Added
scripts/check_installed_artifact.py, which rejects checkout imports, checks public APIs/resources, runs real synthetic normal H5-to-ENVI and drone orchestration paths, and runs the tiny bulk catalog/DuckDB/census/ translation/leave-one-site-out path.
- Added
- Verification:
.venv/bin/pytest -q(passed; 6 skipped, existing warnings only).venv/bin/pytest -q tests/test_drone_pipeline.py(53 passed).venv/bin/pytest -q tests/test_bulk_pipeline.py(14 passed).venv/bin/pytest -q tests/test_qa(5 passed, 1 skipped)uvx ruff check src tests scripts/check_installed_artifact.py scripts/generate_ai_transparency.py scripts/generate_validation_docs.py scripts/run_validation_campaign.py(passed).venv/bin/python -m compileall -q src/spectralbridge scripts/check_installed_artifact.py(passed).venv/bin/python scripts/check_docs_links.py(passed).venv/bin/mkdocs build --strict --site-dir /tmp/spectralbridge-pypi-audit-site(passed; existing navigation/tool notices only).venv/bin/python scripts/generate_ai_transparency.py --check(passed)git diff --check(passed)uv build, artifact-content inspection, anduvx twine check(passed; deprecated Setuptools license-metadata warnings recorded in the audit)- Clean wheel smoke on Python 3.10.16, 3.11.11, 3.12.8, and 3.14.3 and clean sdist smoke on Python 3.10.16 (passed outside checkout)
- Release blockers:
- The complete installed-wheel contract is not yet demonstrated: the normal correction/convolution/extraction/merge/QA path and drone correction plus full/polygon extraction paths remain outside the release smoke.
- Release automation lacks PyPI publishing and required clean-artifact gates; version history, author/DOI metadata, packaged-data/assets provenance, and package-first PyPI instructions require resolution.
- Next recommended task: Close audit blocker B1 by extending the release smoke with approved tiny fixtures for the complete normal path and both drone extraction modes, without changing scientific defaults or algorithms.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-09-03
- Completed: 2026-09-03
- Goal: Harden the independent bulk pipeline for read-only, production-scale collections of completed flightlines; recover canonical scientific identity from products rather than distributed-compute folder names; use virtual DuckDB observations by default; and add population-aware translation and leave-one-site-out analyses.
- Scope:
- Keep the normal NEON and drone pipelines unchanged.
- Add a canonical flightline/source-file catalog with explicit duplicate and rejection handling, source provenance, product availability, schemas, and recoverable processing configuration.
- Isolate all bulk outputs in a fresh directory and make full observation materialization opt-in.
- Refactor bulk logic into catalog, dataset, provenance, and modular analysis modules.
- Implement dataset census, pixel/flightline/site and balanced synthetic translation summaries, and leave-one-site-out validation.
- Expand bulk tests, CLI/API contracts, and production documentation.
- Plan:
- Audit the current bulk framework, canonical NEON paths/names, merged-table schemas, QA metadata, and existing validation analysis.
- Implement the catalog and virtual dataset contracts with deterministic manifests and restart validation.
- Add the three analysis families as independently callable modules using column-projected DuckDB queries.
- Add synthetic regression fixtures covering identity, sister runs, duplicates, heterogeneous schemas, balancing, LOSO, and source immutability.
- Run focused and broader tests, compile/lint checks, strict docs validation, and regenerate AI transparency artifacts.
- Outcome:
- Added an independent
spectralbridge.bulkpackage with catalog, provenance, virtual-dataset, and modular analysis layers; neither the normal NEON pipeline nor the drone pipeline was changed. - Canonical identities now come from SpectralBridge product names, sister runs remain independent, and true cross-directory duplicate identities are cataloged and excluded explicitly.
- The default DuckDB observation relation reads accepted Parquet products
in place, while
materialize_observations=Truecreates an optional consolidated Parquet artifact in the new output tree. - Added metadata-only dataset census, pooled/per-flightline/per-site and balanced synthetic translation analyses, candidate coefficient exports, and leave-one-site-out validation with explicit insufficient-data states.
- Corrected the three reusable-analysis Parquet registration expressions so they parse under the supported Python 3.10 grammar while preserving SQL path escaping.
- Expanded the CLI, API documentation, production vignette, schemas, naming/output contracts, notebook, and regression coverage.
- Added an independent
- Verification:
.venv/bin/pytest -q(passed; 6 skipped, existing warnings only).venv/bin/pytest -q tests/test_bulk_pipeline.py(14 passed).venv/bin/python -m compileall -q src/spectralbridge(passed)- Python 3.10 grammar parse of all Python files under
src,tests, plusscripts/generate_ai_transparency.py(140 files passed) .venv/bin/python scripts/check_docs_links.py(passed).venv/bin/mkdocs build --strict --site-dir /tmp/spectralbridge-production-bulk-site(passed; existing MkDocs navigation/version notices only).venv/bin/python scripts/generate_ai_transparency.py --check(passed)git diff --check(passed)
- Blockers: Ruff is not installed in the repository virtual environment or on
PATH, so the requested Ruff check could not be run. - Next recommended task: Add the first correction-effectiveness population analysis, comparing raw, topographically corrected, and BRDF-corrected products by site and flightline using the cataloged stage/configuration provenance.
- Priority: User-directed
- Status: Complete
- Owner: Cursor Agent
- Started: 2026-09-03
- Completed: 2026-09-03
- Goal: Add an opt-in
split_across_trackmode that processes a NEON flightline as independent left/right column halves without changing the default full-flightline path. - Outcome: Default
go_forth_and_multiply/process_one_flightlinepath is unchanged.split_across_track=Truedownloads the original H5 once, then processes{id}_leftand{id}_rightwith an across-track H5 column window so ENVI + BRDF only load that half. Shared H5 stays at<base>/<id>.h5; each half folder gets a full renamed product tree. - Verification:
pytest -q tests/test_neon_cube.py tests/test_split_across_track.py tests/test_pipeline_ray_engines.py tests/test_stage_export.py tests/test_brdf_topo_chunking.py tests/test_brdf_topo_streamlined.py - Blockers: None.
- Next recommended task: Run a real stalled YELL/WREF flightline with
split_across_track=Trueandengine="thread", max_workers=1.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-17
- Goal: Keep the new stage QA reports (acquisition through analysis tables) and the legacy flightline QA panel, but run both only after the scientific pipeline has finished. Stage QA must read each stage's on-disk ENVI/Parquet products with bounded sampling so Jupyter kernels do not OOM after BRDF/topo writes a multi-GB corrected cube.
- Plan:
- Stop emitting stage QA between download/export/correction/convolution.
- After polygon extraction (or skip), free memory, then
run_completed_flightline_qafollowed byrender_flightline_panel. - Sample hyperspectral ENVI from a BSQ memmap one band at a time; never materialize a full cube as float32.
- Add regression tests and update stage-QA docs.
- Completion notes:
- Mid-stage
_emit_stage_qa_safecalls were removed fromprocess_one_flightlineand from the H5 download loop. _run_end_of_pipeline_qaruns after convolution/merge/polygon: stage QA from on-disk artifacts, then the legacy_qa.pngpanel.emit_stage_qamemmaps BSQ ENVI and copies a spatial preview one band at a time; paired BRDF QA loads the reference preview separately and does not keep two full cubes.qa_mode="off"still skips new stage reports but still writes the legacy panel. Default remainsstandard.
- Mid-stage
- Verification:
/opt/anaconda3/bin/pytest -q tests/test_stage_qa.py tests/test_brightness_coefficients.py(31 passed)
- Blockers: None.
- Next recommended task: Re-run the NIWO flightline with default
qa_mode(or"standard") so stage QA happens after convolution instead of after the BRDF write.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-09-03
- Goal: Add a pipeline, separate from the NEON and drone processors, that recursively discovers completed run outputs under a supplied directory, builds one restart-safe cross-run analysis dataset, and calculates pooled MicaSense-to-Landsat regressions from the full collection.
- Scope:
- Accept a local root directory, including paths under the user's home directory, and recursively inventory compatible merged Parquet outputs.
- Materialize a portable super-Parquet dataset and a queryable DuckDB catalog without loading all rows into Python memory.
- Calculate deterministic pooled per-band MicaSense-to-Landsat regression coefficients with source and row-count provenance.
- Keep all artifacts in an explicit bulk-analysis output directory and make no changes to individual NEON or drone run directories.
- Add a public Python entry point, dedicated CLI, focused tests, and user and reference documentation.
- Plan:
- Audit existing merge, sensor-panel, path, CLI, documentation, and testing conventions.
- Implement recursive discovery, schema-aware union, DuckDB-backed materialization, pooled regression summaries, and restart-safe manifests.
- Add regression and contract tests for discovery, provenance, incompatible inputs, deterministic reruns, and CLI/API exposure.
- Document inputs, outputs, scientific interpretation, and the distinction between pooled synthetic regression and brightness adjustment.
- Run focused tests, lint or compilation checks, documentation validation, and AI-transparency regeneration.
- Outcome (2026-09-03):
- Added the independent
run_bulk_pipelineAPI andspectralbridge-bulkCLI. They accept one canonical merged Parquet or recursively inventory a supplied directory tree without invoking or mutating the NEON and drone orchestrators. - Defaulted discovery to full-pixel
*_merged_pixel_extraction.parquetproducts and added explicitpolygonandbothmodes so polygon subsets are not silently double-counted. Invalid canonical candidates remain visible as rejected catalog records. - Added a streaming DuckDB union-by-name build of
bulk_observations.parquetwith per-row source provenance, plusbulk_analysis.duckdb,bulk_sources.parquet, pooled coefficient JSON/Parquet, and a restart manifest. - Added exact pooled MicaSense-X/Landsat-Y regressions across all valid rows, recording slope, intercept, correlation, R², bias, RMSE, MAE, row count, source count, and value ranges. The artifacts explicitly retain the same-source synthetic evidence boundary and state that upstream persisted brightness state is consumed as-is rather than refitted.
- Added five focused bulk-pipeline tests, public API/CLI coverage, a dedicated documentation page, CLI/API/output/schema references, README/start-page guidance, and a clean runnable bulk-analysis notebook.
- Added the independent
- Verification:
- Full
pytest -qsuite passes with the repository's six expected skips. - Thirty focused bulk, sensor-panel, public-API, and notebook tests pass; the five bulk-specific tests also pass independently.
- Strict MkDocs build, documentation link validation, Python compilation, diff whitespace checks, and AI-transparency freshness checks pass.
- Full
- Blockers: Ruff is not installed in the local environment, so Ruff could not be run.
- Next recommended task: Run
spectralbridge-bulkagainst the real processed data tree, review the pooled population and upstream brightness consistency, and only then approve a versioned coefficient set for drone translation.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-17
- Goal: Resolve the pasted full-suite failures without changing scientific assumptions or pipeline behavior.
- Scope:
- Align brightness coefficient tests and synthetic QA fixtures with the currently packaged brightness coefficient JSON files.
- Make pipeline engine tests robust to no-op/stubbed downloads while keeping real download logging intact.
- Confirm the stale Playwright docs assertion is already repaired locally or patch it if needed.
- Refresh AI transparency artifacts after logging the prompt.
- Plan:
- Read the failing tests, current coefficient files, and orchestration code.
- Apply the smallest code/test changes that restore the intended contracts.
- Run focused failing tests plus lightweight repository checks.
- Outcome (2026-08-17):
- Confirmed the pasted Playwright assertion was already repaired locally; the local test now checks the durable "Before minus after correlation." table cell.
- Treated commit
8417135and the packaged brightness JSON files as the current source of truth, then updated brightness tests and the synthetic stage-QA brightness fixture to use those current coefficients instead of stale pre-update values. - Made the high-level pipeline logger tolerate test stubs or no-op download
helpers that return
None, while real downloads still log the returned H5 filename. - Regenerated and verified AI transparency artifacts after logging this prompt.
- Focused failing tests pass, and the exact pasted full command
pytest -q --cov=spectralbridge --cov-branchpasses locally with 53.94% coverage against the 45% floor.
- Blockers: Ruff is not installed in the local
.venv, so no Ruff check was available. - Next recommended task: Decide whether checked-in real R10C brightness QA artifacts should be regenerated from products produced with the newer Table Mountain HLS coefficient table, or explicitly labeled as historical validation artifacts.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-17
- Goal: Produce a single downloadable PDF companion to the combined stage-QA HTML report so users can compare complete flightline summaries outside the browser.
- Scope:
- Add a canonical
combined_qa.pdfartifact next tocombined_qa.html. - Build the PDF from the same combined and stage payloads used by the HTML reports, including stage summaries and available diagnostic figures.
- Preserve existing HTML, JSON, plot, naming, and restart behavior.
- Document the artifact and add focused regression coverage.
- Add a canonical
- Plan:
- Extend the combined QA paths and report assembly code.
- Add a deterministic multi-page PDF renderer with graceful handling of missing stage plots.
- Verify with a focused stage-QA test and update generated AI transparency.
- Outcome (2026-08-17):
- Added canonical
qa/combined/combined_qa.pdfoutput viaCombinedQAPaths.pdf. assemble_combined_report()now writes the HTML first and then emits a single letter-sized, page-numbered PDF containing the combined summary, cross-stage interpretation, pipeline evolution figure, each stage summary, and each available stage diagnostic image.- Regenerated the checked-in R10C validation artifact at
docs/validation/artifacts/r10c-l002-20210915/qa/combined/combined_qa.pdfas a 19-page PDF. - Updated output and stage-QA docs and refreshed AI transparency artifacts.
- Focused stage-QA tests, compile checks, doc-link checks, PDF metadata inspection, and rendered-page visual checks pass.
- Added canonical
- Blockers: Ruff is not installed in the local
.venv, so Ruff could not be run from this environment. - Next recommended task: Add a small CLI/status message that prints the PDF path
after
spectralbridge-stage-qarebuilds an existing flightline report.
- Priority: User-directed
- Status: Paused after user redirect
- Owner: Codex
- Started: 2026-08-17
- Goal: Determine why the local kernel exits as BRDF processing begins and distinguish an out-of-memory/process-backend failure from a scientific data or algorithm error.
- Scope:
- Trace BRDF initialization, chunk allocation, and execution backend settings.
- Inspect the available R10C run artifacts and any local diagnostic logs.
- Report the evidence-backed cause and conservative ways to run the existing pipeline without changing its scientific assumptions.
- Plan:
- Read the BRDF/topographic orchestration and its focused tests/docs.
- Estimate first-chunk memory and identify work duplicated across workers.
- Reproduce only with a bounded diagnostic if existing evidence is insufficient, then document findings and next actions.
- Current finding:
- Evidence gathered before redirect points to first-tile memory pressure in scene-mode BRDF/topographic application rather than a scientific data quality failure: the R10C cube expands to roughly 10 GiB as float32, and the current scene-mode apply path can hold several full-scene arrays before the progress bar advances beyond 0%.
- Remaining work:
- If resumed, provide the user-facing diagnosis and optionally implement a bounded row-strip application mode that preserves scene-level coefficients.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-17
- Goal: Add an explicit end-of-run comparison of paired synthetic MicaSense and Landsat products, with the plotted linear-regression coefficients retained for inspection while empirical calibration remains deferred.
- Scope:
- Reuse the existing wavelength-matched MicaSense/Landsat synthetic panels.
- Label the plot as a synthetic diagnostic rather than empirical calibration.
- Persist deterministic slope, intercept, correlation, R², and sample-count records for every plotted band pair.
- Preserve existing PNG filenames and pipeline restart behavior.
- Plan:
- Refactor the plotting regression helper to return its displayed metrics.
- Write one JSON sidecar beside each generated comparison panel.
- Add focused regression tests and document the new QA artifact.
- Outcome (2026-08-17):
- Preserved the existing end-of-run MicaSense-versus-Landsat PNG filename and made its title and footer explicitly identify both axes as synthetic products derived from the same corrected NEON source.
- The plotted ordinary least-squares equation now comes from one reusable metric record containing slope, intercept, correlation, R², and sample count. Each PNG receives an atomic, same-stem JSON coefficient sidecar.
- Made DuckDB reservoir sampling repeatable with a fixed seed so repeated runs produce identical coefficient records; the deterministic fallback also avoids random ordering.
- Added focused numerical and artifact tests, including byte-identical JSON regeneration. Nine targeted tests, strict MkDocs, documentation links, generated-page checks, AI-transparency freshness, compilation, and visual inspection pass.
- Blockers: None.
- Next recommended task: Later empirical translation work should supply paired observed sensor measurements and blocked validation folds; it must not reuse these same-source synthetic coefficients as fitted calibration evidence.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-17
- Goal: Restore the docs browser smoke test after the generated topographic validation page replaced an older prose sentence with structured check and diagnostic documentation.
- Scope:
- Align the browser assertion with durable content generated from
scripts/validation_docs_content.py. - Preserve the current scientific wording and generated-doc contract.
- Rebuild the docs and run focused source and browser verification.
- Align the browser assertion with durable content generated from
- Plan:
- Confirm the rendered page contains the structured topographic diagnostic.
- Replace only the stale prose assertion with a current durable contract.
- Run focused validation-doc and Playwright tests, then record the outcome.
- Outcome (2026-08-17):
- Confirmed the failure was test drift introduced when the generated module guide replaced the legacy sentence with structured check and diagnostic tables; the validation results and page generation were current.
- Replaced the deleted prose assertion with the unique generated diagnostic
definition,
Before minus after correlation., preserving the intended topographic-correction browser contract without changing scientific text. - Generated validation pages are current, five focused validation-doc tests pass, strict MkDocs build passes, the rendered diagnostic is uniquely visible, and the full Playwright docs smoke test passes.
- Blockers: None.
- Next recommended task: Continue P46 with a pinned, representative live NEON flightline inventory before interpreting the offline campaign as cross-site scientific validation.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-15
- Goal: Keep the expanded QA implementation easy to navigate and make the Validation website explain every implemented check in the stage where users encounter it, illustrated with the real R10C run.
- Scope:
- Audit
src/spectralbridge/qa/for clear responsibilities, naming, docstrings, and avoidable concentration of unrelated logic. - Refactor only where organization can improve without changing scientific calculations, thresholds, schemas, filenames, or pipeline behavior.
- Expand every Validation module page with the test purpose, varied inputs, pass/fail interpretation, diagnostics, limitations, and related stage QA.
- Add a stage-oriented real-data validation guide with example figures from the checked-in R10C report bundle and clear links to HTML/JSON evidence.
- Keep generated validation pages reproducible from their generator.
- Audit
- Plan:
- Inventory QA source modules, test ownership, validation-page generation, navigation, and real figures.
- Add a concise QA architecture map and extract documentation metadata from generated-page prose so tests remain traceable and maintainable.
- Regenerate the website pages, add real stage examples, and verify source, generated-doc, link, visual, lint, and test contracts.
- Outcome (2026-08-15):
- Confirmed that
src/spectralbridge/qa/already separates schemas, paths, thresholds, metrics, brightness diagnostics, network diagnostics, plots, stage assembly, reporting, and orchestration. Added section markers and missing helper docstrings in the stage coordinator without changing its calculations, thresholds, schemas, filenames, or output behavior. - Added a maintainer-facing QA implementation map with module ownership, execution flow, extension rules, and matching test locations.
- Centralized publication-facing explanations in typed documentation records. Every recorded module input, Boolean check, diagnostic, real-stage check family, pass contract, review action, and evidence limitation is covered by a regression test.
- Expanded the Validation overview and all eight module pages, and added a
six-stage QA guide that reports the observed R10C status and value for each
check family. The pages distinguish software contracts, numerical QA, and
scientific validation and preserve
WARN/NOT EVALUATEDevidence. - Added linked, captioned examples from every stage of the checked-in R10C run. Figure cards are responsive and use correct nested-page paths; a regression test protects that deployment contract.
- Regenerated the website pages from campaign JSON, refreshed the AI transparency artifacts, and visually inspected desktop and narrow layouts. Focused validation tests, the full suite, repository-wide Ruff, strict MkDocs, documentation-link checks, generated-page freshness, and browser console checks pass.
- Made the idempotence/skip test explicitly select the thread backend. Its subject is restart behavior, while Ray selection remains covered by the dedicated engine tests; this avoids a real Ray startup during unit tests.
- Confirmed that
- Blockers: None.
- Next recommended task: Continue P46 with a pinned, representative live NEON flightline inventory before interpreting the current offline campaign as cross-site scientific validation.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-15
- Goal: Give every canonical QA stage a meaningful image, add clear Parquet extraction/merge and correction diagnostics, and reproduce the historical R brightness-coefficient figures in tested Python code.
- Scope:
- Emit at least one deterministic, location-labeled image for acquisition, input, correction parameters, combined correction, convolution, and analysis-table stages.
- Add table-structure and merged-output plots without loading entire Parquet products into memory.
- Port the plots and statistical intent in
coef_plots_Ty.qmdat commita30498ato Python against the packaged coefficient JSON files. - Add brightness-correction numerical and plotting tests without changing coefficients or correction behavior.
- Plan:
- Audit the historical QMD, active brightness code, coefficient schemas, stage artifacts, and existing tests.
- Add reusable stage renderers and a Python coefficient-diagnostics entry point using the existing QA plot contract.
- Regenerate the real report bundle, document the figures, and verify tests, lint, docs, and generated artifacts.
- Outcome (2026-08-15):
- Added deterministic, location-labeled images for every canonical stage: source artifact inventory, input reflectance, correction parameters, combined BRDF/topographic correction, spectral convolution with brightness audits, and Parquet extraction/merge structure.
- Added stage-QA schema 1.3 and plot-contract version 1.1. Every stage records the plot contract; new fixed ranges cover brightness adjustments, BRDF coefficients, and physical geometry summaries.
- Ported the core statistical intent of historical
coef_plots_Ty.qmdinto Python: paired before/after reflectance, per-band linear gains, fitted-versus-configured coefficient profiles, and bandwise medians. Invalid diagnostic cells are excluded pairwise and source products are not modified. - Added a non-provisional brightness-application contract test. On the real
R10C run, all four Landsat products passed with maximum absolute fitted gain
errors between
2.61e-08and2.76e-08, against a1e-4tolerance. - Added a report-only physical-range review for persisted correction geometry.
The real run now marks four sentinel-contaminated fields as
WARN, displays their unfiltered summaries, and does not mask or rewrite them. - Parquet figures distinguish extracted and merged products while obtaining row counts and schemas through DuckDB rather than loading full tables.
- Regenerated and visually inspected the checked-in R10C HTML/JSON/PNG report bundle. Focused tests, the full branch-aware suite, repository-wide Ruff, strict MkDocs build, documentation links, and AI-transparency freshness all pass. Combined branch-aware coverage is 52.84%, above the 45% gate.
- Blockers: None.
- Next recommended task:
- Run a small multi-site pilot and review whether the fixed plot ranges and geometry-warning summaries remain interpretable before starting the full approximately 300-flightline campaign.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-15
- Goal: Make QA figures directly comparable across an approximately 300-run validation campaign without relying on surrounding report headers.
- Scope:
- Standardize physical x/y axes and map color ranges wherever a shared scale is scientifically meaningful.
- Preserve values outside display limits in metrics and annotate clipping; plotting limits must not alter data or QA calculations.
- Embed flightline/location identity in every stage and combined figure.
- Use georeferenced map axes when valid ENVI map metadata are available; otherwise label sampled row/column axes explicitly.
- Plan:
- Define and document one reusable QA plotting-scale contract.
- Pass location and map metadata through the stage plotting entry points.
- Add plot-contract tests and regenerate the real-flightline report bundle.
- Outcome (2026-08-15):
- Added stage-QA schema 1.2 and machine-readable plot-contract version 1.0 with fixed wavelength, reflectance, valid/negative fraction, correction, RGB, and seam-score display ranges.
- Standardized reflectance/difference map normalization. The correction map uses one fixed symmetric-log normalization so subtle differences remain visible while all runs keep identical endpoints and transformation.
- Embedded compact site, domain, flightline, and date labels in every stage and combined figure. Spatial panels now use ENVI map metadata for UTM easting/northing axes, with explicit sampled row/column fallback.
- Values outside display limits remain unchanged in files and metrics; affected panels annotate the clipped display fraction.
- Added direct axis, color-normalization, georeferencing, location-label, and combined-figure contract tests. Regenerated and visually inspected the real R10C report bundle.
- Full unit-mode suite: 218 passed and seven expected skips. Branch-aware coverage is 56.41% statements, 38.55% branches, and 52.01% combined.
- Blockers: None.
- Next recommended task:
- Run a small multi-site pilot with plot-contract version 1.0 before the full campaign, then version any display-contract change instead of silently rescaling an active campaign.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-15
- Goal: Interpret structural flight-track background and known poor-quality wavelength regions correctly in stage QA while retaining every pixel, band, and stored value unchanged.
- Scope:
- Report bounding-box occupancy separately from valid support within the observed flight footprint.
- Label established poor-quality wavelength regions in metrics, per-band summaries, checks, and reports without masking, filtering, replacing, or rewriting any data.
- Evaluate unexpected high reflectance on the remaining usable wavelengths, while continuing to disclose the all-band result.
- Do not change correction, convolution, extraction, or pipeline behavior.
- Plan:
- Add report-only footprint and spectral-quality metrics to stage QA.
- Add regression tests proving values are retained and classifications are explicit.
- Regenerate the real-flightline QA artifacts and update their interpretation.
- Outcome (2026-08-15):
- Added schema 1.1 footprint metrics that report bounding-box occupancy separately from valid support inside the observed footprint. No spatial value is cropped, masked, or rewritten.
- Added report-only labels for the repository's established poor-quality
wavelength ranges. Per-band metrics now use
known_bad_retained,usable, orunclassified_retained; all-band summaries remain visible and no wavelength is removed. - Real input and corrected products retain all 426 bands, with 68 labeled as known bad. The all-band fraction above 1.2 remains 0.0593, while the usable 358-band fraction is approximately 0.0000142. Within-footprint support is 1.0 and bounding-box footprint occupancy remains 0.5713.
- Regenerated the real report bundle. Overall QA is now
WARN: input and correction warn about retained bad bands; convolution and every computational/output stage pass. - Added byte-preservation and classification regression coverage. The full unit-mode suite passes with 213 tests and seven expected skips; combined branch-aware coverage is 51.73%.
- Blockers: None.
- Next recommended task:
- Validate these report-only classifications across the planned multi-site, multi-date campaign before changing any scientific mask policy.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Add deterministic, restart-safe, provenance-aware QA after every canonical processing stage and assemble a cross-stage report that tests physical signal preservation and computational artifacts.
- Repository audit:
- The current NEON orchestrator has five explicit stage functions: download, raw ENVI export, correction-parameter JSON, combined BRDF/topographic correction, and sensor convolution; Parquet export, DuckDB merge, and the legacy final QA panel occur inside or immediately after convolution.
- Topographic and BRDF correction are applied sequentially inside one canonical file-transform stage, but no topographic-only intermediate is persisted. QA must therefore state when separate attribution is not evaluable instead of inventing a stage artifact.
- Existing
qa_plots.pyproduces useful final PNG/JSON/PDF diagnostics, andqa_metrics.pydefines a compact metrics schema, but there is no reusable stage-report schema, configured threshold classification, explicitNOT EVALUATED, or combined cross-stage synthesis. qa_dashboard.pyconsumes_qa_metrics.parquet, but no producer for that documented artifact exists undersrc/; this is a pre-existing output contract gap.- The repository contains deterministic synthetic software fixtures but no checked-in real processed HDF5/ENVI/Parquet dataset. Synthetic reports can validate implementation mechanics but must not be presented as scientific evidence.
- Architecture plan:
- Add a modular
spectralbridge.qapackage for schemas, configurable provisional thresholds, shared numerical metrics, seam/chunk diagnostics, deterministic stage paths, stage runners, plots, and HTML assembly. - Preserve existing
_qa.png/.json/.pdfoutputs while adding versioned stage JSON/HTML/PNG reports below each canonical flightline directory. - Emit standard QA automatically from
process_one_flightline; expose an explicit off/standard/deep mode without changing scientific defaults. - Use actual on-disk stage artifacts and deterministic sampling. Record every
unavailable diagnostic as
NOT EVALUATEDwith a reason. - Assemble a combined report that compares valid fraction, reflectance summaries, correction magnitude, seam scores, and stage statuses, and only emits cross-stage findings supported by those metrics.
- Add tests for deterministic paths/metrics, threshold logic, residuals, SRF support, seam/no-seam, chunk invariance, missing ancillary handling, report restart safety, and orchestrator integration.
- Document what each implemented diagnostic means, its provisional threshold, how to reproduce it, attribution limitations, and which requested advanced diagnostics remain deferred pending real data or translation models.
- Add a modular
- Progress (2026-08-14):
- Added the versioned
spectralbridge.qapackage, automatic per-stage emission, combined HTML/JSON reports, provisional thresholds, deterministic sampling and fingerprints, spatial/spectral summaries, seam scoring, correction deltas, Parquet checks, and reusable SRF, chunk-invariance, residual, blocked-group, path, and cycle metrics. - Added
--qa-mode,spectralbridge-stage-qa, focused regression tests, and the stage-QA documentation/output contract while preserving legacy QA. - Added a real-flightline validation page and a compact 3.4 MB bundle of stage JSON/HTML/PNG reports plus the legacy QA panel. The 2.4 GB HDF5 and approximately 21 GB of intermediate products remain local and unversioned.
- Attempted the authorized NIWO L019 real-data download. NEON returned HTTP
403 because its data endpoint now requires authentication. The attempt also
exposed an invalid
requests.ProxyErrorreference; this is fixed and protected by tests. Download helpers now readNEON_API_TOKENorNEON_TOKENfrom the environment and explain missing authentication. - Ran the user-provided R10C L002 2021-09-15 HDF5 through the complete bounded
polygon pipeline with deep QA. The process exited normally, wrote 18
readable Parquet products, and merged 25 rows × 929 columns. Provisional QA
initially returned
FAILfor 0.5713 all-array valid support and 0.0593 of sampled source values above 1.2; correction magnitude itself passed at absolute-difference q99 0.003894. P57 subsequently stratified those metrics by flight footprint and established bad-band regions without changing data. - The real run exposed and prompted regression fixes for missing reflectance scale/no-data ENVI metadata, no-data leakage through Landsat brightness adjustment, polygon table discovery, legacy-panel reflectance scaling and no-data masking, its fixed count-scale plot axis, and an eager NumPy division warning.
- Verified all 218 collected tests (212 passed, six expected skips) using a parallel run with HDF5 file locking disabled for the test process. Current branch-aware coverage is 55.95% statements, 38.18% branches, and 51.56% combined, above the 45% floor. Ruff, strict MkDocs, documentation-link validation, diff whitespace, and generated AI-transparency checks pass. The new docs and raw reports were also inspected in a browser; the only console error was the temporary local server's absent favicon.
- Added the versioned
- Blockers: None for the implemented framework.
- Deferred diagnostics:
- Ancillary-aware illumination/geometry residual attribution and a genuine
alternate-application-chunk rerun remain
NOT EVALUATED; the canonical stage has no topo-only artifact or independent application-chunk control. - Exact SRF coverage remains
NOT EVALUATEDuntil convolved artifacts persist the response weights used for each output band. - Translation-edge held-out residuals, blocked validation, path/cycle consistency, and direct Landsat NBAR comparison require paired observations and model artifacts outside a canonical NEON-only processing run.
_qa_metrics.parquetremains a pre-existing documented producer gap for the legacy dashboard and should be handled as a separate output-contract task.
- Ancillary-aware illumination/geometry residual attribution and a genuine
alternate-application-chunk rerun remain
- Next recommended task:
- Run a pinned multi-site, multi-date validation campaign to tune the provisional support/extreme/seam thresholds and decide whether valid support should be stratified by acquisition footprint or land-only pixels.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Make the runnable vignette notebooks feel familiar to users of the
active root-level
Raster_processing.ipynbandDrone_processing.ipynbnotebooks by following their orchestration, output-checking, and narrative patterns more closely. - Scope:
- Treat the two root notebooks as the style and workflow reference.
- Preserve existing public pipeline functions, scientific behavior, output contracts, dry-run safeguards, and the nine-notebook learning sequence.
- Change notebook examples and documentation only; do not modify pipeline implementation.
- Plan:
- Compare the root notebooks with every vignette notebook at the cell, function-call, configuration, restart, and output-diagnostic levels.
- Reuse the root notebooks' established orchestration and inspection calls where they are appropriate for a focused vignette.
- Normalize the vignette narrative around setup, editable configuration, execution, restart-safe output checks, and interpretation.
- Add notebook contract coverage and verify clean execution in guarded mode, documentation links, and strict site rendering.
- Outcome:
- Used
Raster_processing.ipynbandDrone_processing.ipynbas direct workflow references without modifying either active research notebook. - Reworked all nine clean vignette notebooks into a consistent numbered sequence: setup or context, editable configuration, run/resume, concrete output inspection, and interpretation or next steps.
- Kept
go_forth_and_multiplyandrun_drone_pipelineas the public orchestrators in the full NEON and drone vignettes, matching the root notebooks' lower-case configuration and function-call style. - Carried the root notebooks' practical diagnostics into the focused
vignettes: processed/failed/merged/QA summaries,
pprint, DuckDB Parquet previews, pandas merged-table previews, file inventories, and reusable ENVI band/RGB plotting helpers. - Retained low-level
stage_*calls only where a notebook intentionally runs one part of the pipeline, and documented how each stage relates to the public orchestrator. - Removed machine-specific transfer/install commands and saved outputs from
the reusable versions; every processing cell remains guarded by
RUN = Falseand no pipeline implementation or scientific behavior changed. - Updated the notebook catalog and directory README to explain the relationship between active research notebooks and portable vignettes.
- Added contract tests proving that the vignettes continue to mirror the root notebooks' orchestrators and diagnostic patterns.
- Used
- Verification:
- All nine notebook JSON/schema, clean-output, compile, and guarded-execution contracts passed, including the new root-notebook alignment assertions.
- Rendered temporary HTML exports of the full NEON and drone notebooks and visually verified their headings, cell sequence, code, and explanatory text in the browser without executing processing cells.
- Strict MkDocs build, documentation-link validation, Ruff, AI-transparency artifact verification, and repository whitespace checks passed.
- Blockers:
- None.
- Next recommended task:
- Have a regular user of the two active root notebooks review the revised vignettes and identify any additional exploratory checks worth promoting into the portable teaching sequence.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Ensure every website notebook link opens the real tracked
.ipynbin the GitHub repository viewer instead of navigating to a static GitHub Pages asset that cannot render as a notebook. - Scope:
- Keep all nine notebook files, cells, kernels, code, and dry-run safeguards unchanged.
- Update link destinations and explanatory copy only.
- Plan:
- Inventory every documentation link to a notebook and replace relative
GitHub Pages asset links with stable GitHub
blob/mainnotebook URLs. - Clearly state that notebooks can be viewed on GitHub and cloned/downloaded for local execution, but are not live browser runtimes.
- Add link-contract coverage and verify strict docs, links, notebook schema, and the rendered GitHub destination.
- Inventory every documentation link to a notebook and replace relative
GitHub Pages asset links with stable GitHub
- Outcome:
- Kept all nine vignette notebooks as actual tracked
.ipynbfiles underdocs/vignettes/notebooks/; no notebook cells, outputs, kernels, or scientific code changed. - Replaced every website-relative notebook asset link with a GitHub
blob/mainlink to the corresponding repository file, including the module vignettes, notebook catalog, resume guide, and custom-correction reference. - Clarified that GitHub is the web viewer and that cloning or downloading is required to execute or modify a notebook.
- Added source and browser contracts that require the exact nine notebooks, prohibit documentation links back to GitHub Pages notebook assets, and verify the rendered catalog exposes nine GitHub repository links.
- Kept all nine vignette notebooks as actual tracked
- Verification:
- Notebook/example contracts passed.
- Strict MkDocs build and documentation-link validation passed.
- Playwright site smoke test passed against the built documentation,
including the exact
02_correct_neon.ipynbGitHub destination. - Ruff, AI-transparency artifact verification, and repository whitespace checks passed.
- Blockers:
- None.
- Next recommended task:
- Deploy the documentation changes, then confirm the public notebook catalog links to GitHub after the Pages build refreshes.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Transform the supplied three-panel scientific concept figure into a readable, engaging homepage sequence that matches the SpectralBridge visual system without embedding one dense poster.
- Scope:
- Use the supplied figure as the scientific and compositional reference.
- Derive separate text-free visual assets for sensors, processing, and translation; keep scientific labels and explanations as accessible HTML.
- Preserve the established Drone -> NEON -> Landsat framing, pipeline behavior, scientific values, routes, and existing calls to action.
- Plan:
- Preserve the supplied technical figure without generative simplification; do not use the rejected abstract illustration drafts.
- Present the original figure as three separately enlarged, editorial homepage panels so its existing fonts, plots, arrows, and terminology are readable while retaining exact scientific content.
- Integrate the panels with responsive CSS, accessible descriptions, and links to the relevant vignettes.
- Verify asset paths, strict docs, links, browser console, desktop/mobile layout, and homepage regression checks.
- Outcome:
- Preserved the user's supplied 1536 x 1024 technical figure byte-for-byte in
docs/images/homepage/spectralbridge-technical-overview.png; rejected abstract image-generation drafts were not added to the repository or used by the site. - Added an editorial homepage sequence that crops the original figure into three separately enlarged views for observing systems, the processing chain, and the sensor translation network.
- Kept every original plot, label, wavelength range, arrow, and scientific relationship intact while adding large accessible HTML headings, concise interpretation, related-vignette links, figure descriptions, and a full-resolution source link.
- Added a horizontally inspectable mobile viewport so the technical figure stays legible instead of being reduced to the width of a phone.
- Recreated the supplied reproducibility-principles strip as responsive HTML so its typography remains readable at every viewport.
- Made no changes to pipeline code, algorithms, scientific values, routes, or runtime outputs.
- Preserved the user's supplied 1536 x 1024 technical figure byte-for-byte in
- Verification:
- Confirmed the repository asset and supplied source have identical SHA-256 hashes.
- Strict MkDocs build and documentation link validation passed.
- Expanded Playwright documentation test passed, including three panels, source links, minimum desktop figure width, mobile internal scrolling, page overflow, asset failures, browser errors, and console errors.
- In-app browser review confirmed the original technical typography is readable at desktop width and the page has no horizontal overflow.
- Ruff and repository whitespace checks passed.
- Blockers:
- None.
- Next recommended task:
- Ask the figure author to verify the homepage captions against the intended calibration-network interpretation before deploying the site.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Repair the FAQ and prevent the same raw-HTML/code-block rendering
failure across documentation pages using
markdown="1"containers. - Scope:
- Keep page content, navigation routes, pipeline instructions, and runtime behavior unchanged.
- Normalize only the indentation that controls Markdown parsing inside the existing HTML layout components.
- Plan:
- Confirm the FAQ failure in the published site and inventory pages sharing the same markup pattern.
- Normalize affected page markup and extend browser checks to detect raw HTML leakage on every repaired route.
- Verify strict docs, links, desktop/mobile layout, and representative page content before completion.
- Outcome:
- Confirmed the published FAQ rendered its intended hero and cards as a raw HTML code block, matching the cloud/HPC tutorial defect.
- Audited all documentation sources using
markdown="1"containers and normalized Markdown-sensitive indentation on 15 affected routes spanning API, concepts, FAQ, pipeline, quickstart, reference, troubleshooting, cloud/HPC, CLI, and Parquet pages. - Removed the redundant plain Markdown page headings that became visible once
the styled hero headings rendered correctly; every repaired page now has
exactly one semantic
<h1>. - Expanded the Playwright smoke test to visit every affected route and reject missing hero markup or leaked raw HTML, with dedicated FAQ and cloud/HPC card and mobile-overflow checks.
- Preserved all prose, commands, links, routes, scientific values, pipeline code, and runtime behavior.
- Verification:
- Strict MkDocs build passed.
- Expanded Playwright documentation test passed across all 15 routes at desktop width and the FAQ/cloud pages at 390-pixel mobile width.
- In-app browser inspection confirmed every repaired route has one hero, one
<h1>, no raw-markup leakage, and no desktop horizontal overflow. - Ruff, documentation link validation, and repository whitespace checks passed.
- Blockers:
- None.
- Next recommended task:
- Deploy the documentation branch and smoke-test the public GitHub Pages URLs after the workflow completes.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Restore structured rendering on the published cloud/HPC tutorial, which currently displays its HTML layout as literal code and text.
- Plan:
- Compare the published page with its Markdown source and local rendering.
- Repair the malformed HTML structure without changing tutorial meaning or pipeline instructions.
- Add a regression check for raw-HTML leakage and verify the page visually at desktop and mobile widths, then run strict docs and link checks.
- Outcome:
- Confirmed in the published site that indented content inside
markdown="1"containers was being parsed as code, exposing HTML tags and collapsing the intended card layout. - Normalized the tutorial's Markdown-in-HTML boundaries so headings, cards, lists, links, and both Bash examples render as their intended elements.
- Added a browser regression check for the hero cards, raw-HTML leakage, and mobile horizontal overflow.
- Made no changes to pipeline instructions, runtime code, APIs, or outputs.
- Confirmed in the published site that indented content inside
- Verification:
- Strict MkDocs build passed.
- Documentation link validation and repository whitespace checks passed.
- Focused Playwright documentation test passed at desktop and 390-pixel mobile viewports.
- In-app browser inspection confirmed three hero cards, two rendered code blocks, no raw-markup leakage, and no desktop horizontal overflow.
- Blockers:
- None.
- Next recommended task:
- Audit other pages using indented
markdown="1"containers for the same raw-markup rendering defect.
- Audit other pages using indented
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Correct the repository's high-level scientific framing so users understand that NEON is the airborne intermediary translating between drone observations and Landsat-compatible reflectance.
- Scope:
- Update prominent onboarding and conceptual language.
- Preserve existing pipeline behavior, APIs, routes, filenames, and historical tutorial filenames.
- Plan:
- Replace direct drone-to-Landsat marketing shorthand with an explicit Drone -> NEON -> Landsat relationship.
- Add a concise explanation of what “translated by NEON” means scientifically.
- Run documentation links and a strict site build.
- Outcome:
- Reframed the homepage, README, and start guide around the explicit Drone -> NEON -> Landsat scientific relationship.
- Identified NEON airborne hyperspectral observations as the translating reference rather than implying a direct drone-to-Landsat conversion.
- Clarified on the concepts page, drone vignette, and retained MicaSense tutorial that the drone and NEON entry points remain separate and that the drone workflow does not directly convolve its inputs into Landsat bands.
- Preserved all pipeline code, APIs, routes, filenames, scientific values, and restart behavior.
- Verification:
- Strict MkDocs build passed.
- Documentation link validation passed.
- AI transparency artifacts regenerated and passed their consistency check.
- Repository diff whitespace check passed.
- Blockers:
- None.
- Next recommended task:
- Have a domain scientist confirm that “translating reference” matches the intended description of NEON's role in the project methodology.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Make the repository understandable and runnable for scientists across local, notebook, container, cloud, and HPC environments without changing the working pipeline or its on-disk contracts.
- Scope:
- Keep all pipeline modules, stage order, scientific assumptions, filenames, and restart behavior unchanged.
- Add a concise start-here map and clearly label runtime code, user examples, maintainer tools, validation evidence, legacy material, and data assets.
- Catalog every active JSON file by authority, consumer, units, edit policy, and validation method rather than adding unrecognized metadata to runtime JSON schemas.
- Add documented, container-friendly Python entry scripts and organized Jupyter notebooks for the full NEON workflow, local-HDF5/resume workflows, individual stages, drone processing, QA, polygon extraction, and a custom correction hook between canonical stages.
- Link notebooks to the existing one-vignette-per-module learning structure.
- Verification plan:
- Validate every notebook with
nbformat, compile all notebook code cells, and run configuration-only modes for new scripts. - Run strict MkDocs, link checks, Ruff, focused docs tests, naming/path tests, and existing pipeline regression tests relevant to imported entry points.
- Validate every notebook with
- Outcome:
- Added
START_HERE.md, a website repository map, and prominent README link so new users can choose a full run, local HDF5 run, notebook, drone run, validation path, or extension path without traversing the whole repository. - Added two self-checking, container-friendly Python runners with
self-documenting JSON configurations under
examples/. - Added a JSON catalog that distinguishes authoritative packaged parameters, example copies, run-generated evidence, validation plans, generated results, units, consumers, edit policy, and validation methods.
- Added a script catalog and labeled three hard-coded root utilities as site-specific or historical rather than supported entry points.
- Added nine clean, ordered notebook vignettes matching the full workflow and module pages, including an isolated custom-correction hook after topo/BRDF and before convolution.
- Added notebook links to every module vignette and a
notebooksoptional dependency for a reproducible JupyterLab environment. - Made no changes to pipeline stage order, algorithms, scientific parameter values, filename contracts, or restart behavior.
- Added
- Verification:
.venv/bin/python -m pytest -q tests/test_example_entrypoints.py tests/test_paths.py— 4 passed..venv/bin/python -m pytest -q tests/test_polygon_pipeline.py— 4 passed.- Both example scripts pass
--checkwithout network or imagery access. - Official
nbformatschema validation passes for all nine notebooks; they have stable cell IDs, clean kernels/no outputs, compile, and execute theirRUN = Falsecells with current imports. - Strict MkDocs build, documentation link check, and docs Playwright smoke test pass; browser review confirmed all nine notebook downloads and the JSON and custom-correction pages are visible with no console errors.
- Ruff and Python compile checks pass for new examples/tests and relabeled root utilities.
uv build --out-dir /tmp/spectralbridge-organized-distproduced a wheel and source distribution successfully.
- Blockers:
- None.
- Next recommended task:
- Ask one new package user to attempt the
START_HERE.mdcheck-mode flow and one domain scientist to review the custom-correction validation contract.
- Ask one new package user to attempt the
- Priority: User-directed CI failure
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Restore the drone QA merged-Parquet preview behavior when the safe reader reaches its pandas fallback without a requested column projection.
- Plan:
- Reproduce the two focused failures and trace the safe Parquet fallback.
- Make the pandas call omit the optional
columnskeyword when it is unused. - Rerun the focused preview tests, safe-Parquet tests, and full drone pipeline test module; run Ruff on the touched files.
- Outcome:
- Updated
_safe_read_parquetso its pandas fallback callspandas.read_parquet(path)when no column projection was requested, while preserving the projected call when columns are supplied. - Restored merged-preview row counts, non-NoData row selection, and rightmost spectral-column display without changing DuckDB or PyArrow behavior.
- Updated
- Verification:
.venv/bin/python -m pytest -q tests/test_drone_pipeline.py— 53 passed..venv/bin/python -m pytest -q tests/test_qa_safe_parquet.py— 1 passed.uvx ruff check src/spectralbridge/qa_plots.py tests/test_drone_pipeline.py tests/test_qa_safe_parquet.pygit diff --check
- Blockers:
- None.
- Next recommended task:
- Rerun the repository CI workflow to confirm the Python 3.11 runner matches the focused local result.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Redesign the MkDocs site to feel like an editorial, science-focused creative studio while preserving SpectralBridge's learning, validation, and technical-reference information architecture.
- Reference direction:
- Retain the strong hierarchy, editorial type, generous whitespace, and narrative structure inspired by science media sites.
- Restore the original SpectralBridge logo and derive the palette from its navy, sky-blue, teal, green, and spectral yellow colors instead of using the reference site's black/yellow identity.
- Write and design for scientists translating hyperspectral observations from drone and airborne sensors into Landsat-compatible reflectance.
- Do not copy proprietary artwork, text, logos, or page layouts. Keep the result recognizably SpectralBridge and accessible as technical documentation.
- Plan:
- Inspect the reference site's visual system and the current MkDocs theme, homepage markup, logo assets, and CSS overrides.
- Establish a logo-derived SpectralBridge color, typography, spacing, navigation, card, table, code, and footer system with responsive behavior.
- Recompose the homepage into an editorial science story with clear routes into Learn, Validation, and Technical reference.
- Apply the design system to content pages without reducing documentation readability or changing scientific content.
- Render and inspect desktop/mobile pages, run accessibility-oriented browser checks, and verify strict docs, links, and documentation smoke tests.
- Outcome:
- Restored the original panoramic SpectralBridge logo on the homepage and the original compact spectral bridge mark in the site header.
- Kept the editorial information hierarchy while replacing the reference site's black/yellow identity with a logo-derived navy, sky-blue, teal, green, lime, and restrained gold palette.
- Reframed the homepage for scientists moving hyperspectral reflectance from drone and airborne observations into Landsat-compatible products.
- Propagated the scientific palette through navigation, content heroes, cards, tables, admonitions, workflow sections, buttons, and the footer.
- Confirmed desktop and phone layouts have no page-level horizontal overflow; wide validation tables remain independently scrollable on phones.
- Verification:
MPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/mkdocs build --strict --site-dir /tmp/spectralbridge-site-impactpython3 scripts/check_docs_links.pySPECTRALBRIDGE_DOCS_SITE=http://127.0.0.1:8765 .venv/bin/python -m pytest -q tests/test_docs_playwright.pyuvx ruff check src tests scripts/generate_ai_transparency.py scripts/generate_validation_docs.py scripts/run_validation_campaign.pyMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/python scripts/generate_ai_transparency.py --checkMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/python scripts/generate_validation_docs.py --check- In-app browser review of the homepage and representative learning, validation, and reference pages at 1280×900 and 390×844.
- Blockers:
- None.
- Next recommended task:
- Ask a small group of drone and Landsat scientists to perform a short findability review of the Learn, Validation, and Technical reference paths.
- Priority: User-directed
- Status: In progress
- Owner: Codex
- Started: 2026-08-14
- Goal: Add reproducible validation suites that exercise every user-facing pipeline module across varied inputs, record quantitative diagnostics, and publish one results page per module in a dedicated website section.
- Plan:
- Inventory current stage functions, fixtures, tests, and existing QA metrics to define explicit validation contracts without changing scientific assumptions.
- Implement a deterministic validation manifest and result schema that record input variation, expected behavior, observed diagnostics, status, runtime, provenance, and skip reasons.
- Add an offline validation runner for reliable CI-scale variation testing and a separately marked live NEON campaign for opt-in sampling across sites and flight lines without making normal tests download hundreds of large files.
- Generate a validation website index and one page per module from the recorded results, including variation lists, pass/fail summaries, and diagnostics suitable for improving QA plots.
- Add contract tests for the runner and generated documentation, then verify the smallest relevant suites, documentation build, and links.
- Scope decision:
- Treat “100 iterations” as a campaign target, not a unit-test default. Live download and full-scene processing require network, storage, compute, and a pinned NEON product inventory; those runs will be explicit and resumable.
- Progress:
- Added a versioned validation evidence schema with atomic JSON output, explicit checks, diagnostics, runtimes, errors, skip reasons, Git revision, and dirty-worktree provenance.
- Added a deterministic offline runner that can scale to any requested iteration count and invokes actual functions for download reuse, synthetic HDF5-to-ENVI conversion, topographic correction, BRDF correction, sensor convolution, Parquet extraction, CSV conversion, chunked saving, restart integrity, and QA rendering.
- Recorded an initial five-variation-per-module campaign: 40 passed, 0 failed, and 0 skipped. The evidence is explicitly labeled as synthetic or already-present-input software validation, not external scientific validation.
- Added a top-level Validation website section with an overview and eight generated module pages showing every input variation, quantitative diagnostics, explicit checks, pass/fail state, QA implications, and reproduction commands.
- Added a live 100-flightline campaign specification that requires exact flightline inventory, checksums, dates, and approved network/storage/compute resources before execution.
- Added CI freshness checks, validation framework tests, and rendered-site smoke coverage. No scientific QA thresholds were changed from synthetic evidence alone.
- Used the campaign to identify and fix a concrete QA-rendering issue: PDF
status panels now use font-safe
OK/WARN/FAILlabels instead of a missing cross-mark glyph, with a regression assertion for that warning.
- Verification:
MPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/python scripts/run_validation_campaign.py --iterations-per-module 5(40 passed)MPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/python -m pytest -q tests/test_validation_campaign.py(3 passed)MPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/python -m pytest -q tests/test_qa/test_qa_metrics_smoke.py(3 passed).venv/bin/python scripts/generate_validation_docs.py --checkSPECTRALBRIDGE_DOCS_SITE=http://127.0.0.1:8765 .venv/bin/python -m pytest -q tests/test_docs_playwright.py(1 passed).venv/bin/mkdocs build --strict --site-dir /tmp/spectralbridge-site-validationpython3 scripts/check_docs_links.pyuvx ruff check src tests scripts/generate_ai_transparency.py scripts/generate_validation_docs.py scripts/run_validation_campaign.pypython3 -m compileall -q src tests scriptsandgit diff --check- In-app browser review covered desktop and mobile validation layouts, dense table containment, navigation, and console output; no browser errors were found.
- Blockers:
- The repository does not currently contain 100 representative NEON HDF5 fixtures, and this task has not authorized the bandwidth/storage cost of a 100-flightline live campaign.
- Next recommended task:
- Build and pin the 100-flightline NEON inventory, estimate download and output storage, choose a durable campaign workspace, and approve the live resource budget. Then execute the campaign restart-safely and use its distributions to review QA panels and thresholds with scientific oversight.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Make the documentation site less overwhelming by separating task-oriented educational vignettes from technical reference material, with one canonical vignette per pipeline module plus full-run and restart/resume workflows.
- Plan:
- Inventory existing docs and map each page to an educational vignette, technical reference, troubleshooting, or maintainer-only role.
- Consolidate the visible MkDocs navigation into two primary learning paths while preserving useful existing pages and stable file locations.
- Add a vignette index, one canonical vignette for each user-facing pipeline module, a full-pipeline vignette, and a “Carry On My Wayward Son” restart vignette for resuming partially completed file-based runs.
- Cross-link the educational pages to deeper technical descriptions without duplicating scientific assumptions.
- Verify links, strict MkDocs rendering, navigation clarity, and relevant documentation tests; then record completion and remaining gaps here.
- Completion notes:
- Reduced the public site to four top-level destinations: Home, Learn, Technical reference, and Project. The homepage now presents the educational and technical paths directly instead of exposing the full documentation inventory at once.
- Added a canonical Learn index, a full-pipeline vignette, a “Carry On My Wayward Son” restart vignette, and one vignette for each of seven user-facing modules: NEON acquisition, correction, sensor harmonization, analysis tables, QA, drone processing, and polygon extraction.
- Added a technical-reference landing page that groups stage/file contracts, interfaces, schemas, algorithms, extension points, and architecture.
- Preserved the older tutorial URLs for incoming links but removed the overlapping pages from navigation and search so learners see one canonical path per module.
- Documented the new information-architecture and vignette conventions in the documentation style guide and updated the rendered-site smoke contract.
- Verification:
.venv/bin/mkdocs build --strict --site-dir /tmp/spectralbridge-site-webcleanuppython3 scripts/check_docs_links.pySPECTRALBRIDGE_DOCS_SITE=http://127.0.0.1:8765 .venv/bin/python -m pytest -q tests/test_docs_playwright.py(1 passed)uvx ruff check tests/test_docs_playwright.py scripts/generate_ai_transparency.py.venv/bin/python scripts/generate_ai_transparency.py --checkpython3 -m compileall -q tests scriptsandgit diff --check- In-app browser review covered the homepage, Learn and Technical reference navigation, the restart vignette, mobile layout, search results, and browser console output; no rendering or console errors were found.
- Blockers:
- None for this request. MkDocs still reports intentionally unlisted legacy and maintainer pages; they remain available for stable links and future archival decisions.
- Next recommended task:
- Have a new user follow the full-pipeline and restart vignettes against a small fixture, then refine any steps whose required inputs or expected outputs are not obvious without prior SpectralBridge knowledge.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-08-14
- Goal: Audit publication readiness and test coverage, then add a reproducible AI-transparency report generated from the verbatim prompt log with summary figures, narrative statistics, and explicit model/provenance limitations.
- Plan:
- Inventory publication, citation, governance, packaging, release, and reproducibility artifacts and record evidence-backed readiness findings.
- Run the available test suite, coverage measurement, lint, packaging, and documentation checks, separating verified results from environment gaps.
- Define a deterministic prompt-log parser and transparent classification rules that do not infer unavailable model metadata.
- Generate version-controlled text and figure outputs and add automation to detect stale AI-transparency artifacts.
- Add regression tests and documentation for the generator, then rerun the smallest relevant checks and the broader verification available locally.
- Completion notes:
- Added an evidence-backed publication-readiness and test-coverage audit under
docs/dev/, and updated the living publication checklist with verified gates and remaining blockers. - Added a standard-library prompt-log analyzer that generates a public Markdown statement, machine-readable JSON, and four accessible SVG figures covering prompt timing, topics, intents, lengths, and recorded AI identity.
- Added prospective AI system/model fields to the prompt-log contract and
explicitly preserves unknown historical model identities as
Not recorded. - Added regression tests and a CI staleness check for all generated transparency artifacts.
- Added branch-aware coverage collection and retained JSON/XML CI artifacts, with a conservative 45% combined regression floor.
- Made the CI Ruff baseline explicit (
E4,E7,E9, andF) and removed the one unused import that prevented that baseline from passing. - Aligned test extras with the existing pytest
<9contributor constraint.
- Added an evidence-backed publication-readiness and test-coverage audit under
- Verification:
MPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/python -m pytest -q tests/test_ai_transparency.py(3 passed)MPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/python -m pytest -q tests/test_duckdb_merge.py(6 passed).venv/bin/python scripts/generate_ai_transparency.py --checkpython3 scripts/check_docs_links.pypython3 -m compileall -q src tests scriptsuvx ruff check src tests scripts/generate_ai_transparency.pyuv run --extra docs mkdocs build --strict --site-dir /tmp/spectralbridge-site-audit- Full unit-mode coverage run: 186 passed, 7 skipped, 2 failed; 49.66% statements, 33.43% branches, and 45.56% combined coverage.
uv buildproduced the 2.2.0 sdist and wheel; both passedtwine check.- A clean Python 3.12 wheel install imported version 2.2.0, included the brightness coefficient JSON, and ran primary CLI help commands.
- Blockers:
- The publication release remains blocked by two drone-preview test failures, metadata/version and DOI inconsistencies, placeholder authorship, and the outstanding GPL/third-party provenance review. See the dated audit for the complete evidence and recommendations.
- The strict docs build reports 25 Markdown pages outside MkDocs navigation; maintainers should confirm that each exclusion is intentional.
- Next recommended task:
- Repair and confirm the two drone-preview test contracts in Python 3.10/3.11 CI, then add a release metadata consistency check before raising coverage in the lowest-tested scientific modules.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-11
- Goal: Fix the full-test CI regressions reported in the attached pytest log without changing scientific workflow behavior.
- Plan:
- Identify shared causes behind the reported failures before making broad edits.
- Restore testable module boundaries where monkeypatches should intercept pipeline calls.
- Add or adjust focused regression coverage only where needed.
- Run targeted tests for each fixed failure cluster, then broader test modules when feasible.
- Completion notes:
- Fixed
tests/test_cross_sensor_cal_shim.pyso fresh namespace import tests restore priorspectralbridgeandcross_sensor_calmodules after each check. This prevents later tests from holding stale direct function imports while monkeypatch modifies a different live module instance. - Fixed
tests/conftest.pyso the fake PyArrow shim is only installed when realpyarrowcannot be imported, instead of shadowing an installed PyArrow package before pandas ArrowDtype tests run. - No scientific workflow code was changed for this stabilization pass.
- Fixed
- Verification:
python3 -m py_compile tests/test_cross_sensor_cal_shim.py tests/conftest.pyMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_cross_sensor_cal_shim.py tests/test_drone_pipeline.py::test_run_drone_pipeline_skips_polygons_cleanly tests/test_drone_pipeline.py::test_run_drone_pipeline_accepts_tiff_sources tests/test_drone_pipeline.py::test_apply_drone_corrections_uses_full_scene_chunk tests/test_stage_export.py::test_stage_export_envi_targets_raw_names tests/test_polygons.py::test_extract_polygon_parquet_from_envi_stabilizes_null_only_metadata_chunksMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_cross_sensor_cal_shim.py tests/test_drone_pipeline.py tests/test_logging_config.py tests/test_parquet_export.py tests/test_pipeline_convolution.py tests/test_pipeline_ray_engines.py tests/test_polygons.py tests/test_stage_export.py --disable-warningsreached 100% with no assertion failures in local output.MPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q --disable-warningsreached 100% with no assertion failures in local output.
- Blockers:
- The local full-suite process reports a signal-style pytest exit value after
printing 100% completion (
PYTEST_EXIT:143when explicitly echoed), so CI should be treated as the authoritative final full-suite process-exit check. The attached assertion failures are no longer reproduced after the test isolation fixes.
- The local full-suite process reports a signal-style pytest exit value after
printing 100% completion (
- Next recommended task:
- Push the test-isolation fixes and rerun CI; if CI still reports a nonzero exit after all assertions pass, investigate Ray/process shutdown separately.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-10
- Goal: Make drone pipeline runs with zero discovered H5/TIFF inputs explicit and actionable in logs and QA metadata.
- Plan:
- Preserve the existing non-raising empty-run behavior for compatibility.
- Add explicit QA metadata describing the searched path, whether it exists, whether it is a file or directory, and the supported input extensions.
- Emit an actionable warning when no drone inputs are discovered.
- Add a regression test for empty input discovery status.
- Completion notes:
- Added explicit empty-discovery QA metadata to
run_drone_pipeline(), including input path, resolved path, existence, path type, supported input extensions,input_discovery_status, andskip_reason. - Added a visible
[drone] No supported drone inputs discovered...message when a run finds no.h5,.tif, or.tiffflight inputs. - Preserved the existing non-raising empty-run behavior for restart-safe compatibility.
- Added regression coverage for empty input discovery status and written QA JSON metadata.
- Added explicit empty-discovery QA metadata to
- Verification:
python3 -m py_compile src/spectralbridge/pipelines/drone.py tests/test_drone_pipeline.pyMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py::test_run_drone_pipeline_reports_empty_input_discoveryMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py
- Blockers:
- Ruff is not installed in the local
.venv, soruff checkcould not be run here.
- Ruff is not installed in the local
- Next recommended task:
- In the notebook, inspect the current working directory and the requested
input folder with
Path.cwd()andlist(Path("drone_inputs").rglob("*"))to confirm the TIFF/H5 files are actually under the path passed torun_drone_pipeline().
- In the notebook, inspect the current working directory and the requested
input folder with
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-10
- Goal: Fix the docs Playwright smoke test failure caused by browser console errors from remote GLightbox CDN assets returning HTTP 403 during local site testing.
- Plan:
- Remove remote GLightbox CSS/JS references from
mkdocs.ymlso the built docs site uses local assets only during browser smoke tests. - Preserve the local no-op GLightbox initializer, which safely exits when the optional library is absent.
- Rebuild or otherwise verify docs configuration and rerun the focused docs smoke test when local tooling is available.
- Remove remote GLightbox CSS/JS references from
- Completion notes:
- Removed the external jsDelivr GLightbox CSS and JS entries from
mkdocs.yml. - Kept the local
docs/js/glightbox-init.jsno-op guard so docs pages remain safe if GLightbox is reintroduced locally later. - Confirmed no remaining docs or MkDocs configuration references to the remote GLightbox CDN assets.
- Removed the external jsDelivr GLightbox CSS and JS entries from
- Verification:
python3 scripts/check_docs_links.pyrg -n "cdn\\.jsdelivr|glightbox/dist" docs mkdocs.yml.venv/bin/pytest -q tests/test_docs_playwright.pyskipped locally becauseSPECTRALBRIDGE_DOCS_SITEwas not set.
- Blockers:
- The local environment does not have
mkdocsinstalled, somkdocs build --strictand the served-site Playwright check could not be run here.
- The local environment does not have
- Next recommended task:
- Let CI rebuild the docs site from
mkdocs.ymland rerun the browser smoke test; the two prior 403 console errors should be gone because the remote assets are no longer requested.
- Let CI rebuild the docs site from
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-10
- Goal: Track the drone field manifest in the repository and reference the bundled copy from the drone pipeline.
- Plan:
- Add the provided manifest CSV as package data under
src/spectralbridge/data. - Include CSV package data in
pyproject.toml. - Update the drone manifest resolver so omitted
drone_manifest_pathand bare manifest filenames can resolve to the bundled package-data copy. - Add tests proving the bundled default is used without requiring a notebook local CSV.
- Add the provided manifest CSV as package data under
- Completion notes:
- Added the provided field manifest as
src/spectralbridge/data/drone_field_manifest.csv. - Updated package metadata so CSV files under
spectralbridge.dataare included as package data. - Updated
run_drone_pipeline()sodrone_manifest_path=Noneresolves to the bundled manifest by default. - Updated manifest resolution so the original long CSV filename also resolves to the bundled package-data copy when no local file is present.
- Updated the MicaSense/drone tutorial to document the bundled default and custom-manifest override behavior.
- Added the provided field manifest as
- Verification:
python3 -m py_compile src/spectralbridge/pipelines/drone.py tests/test_drone_pipeline.pyMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py::test_run_drone_pipeline_uses_bundled_manifest_by_default tests/test_drone_pipeline.py::test_run_drone_pipeline_resolves_original_manifest_filename_to_bundle tests/test_drone_pipeline.py::test_run_drone_pipeline_resolves_manifest_relative_to_input_dir tests/test_drone_pipeline.py::test_run_drone_pipeline_resolves_manifest_relative_to_relative_input_folderMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.pypython3 scripts/check_docs_links.py
- Next recommended task:
- Run packaging/build checks in CI to confirm
drone_field_manifest.csvis present in built wheels and source distributions.
- Run packaging/build checks in CI to confirm
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-10
- Goal: Refresh the optional imagehash regression baseline for the intentionally redesigned AOP QA PNG quicklook.
- Plan:
- Generate the QA PNG from the existing test fixture.
- Compute the new perceptual hash for the 2x3 AOP QA panel layout.
- Update
tests/test_qa/test_qa_png_phash.pyand rerunpytest -q tests/test_qa.
- Completion notes:
- Recomputed the pHash baseline from the deterministic QA fixture and the redesigned 2x3 AOP QA PNG layout.
- Updated
tests/test_qa/test_qa_png_phash.pyfrom the old 2x2-panel hash tobe3e91c3c1e5c3db.
- Verification:
python3 -m py_compile tests/test_qa/test_qa_png_phash.pyMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_qapassed locally with the pHash test skipped becauseimagehashis not installed in the local.venv.
- Next recommended task:
- Let CI run the optional
imagehashpHash check against the refreshed baseline.
- Let CI run the optional
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-10
- Goal: Fix the drone manifest resolver so a relative
input_h5_dirsuch asdrone_inputsis checked for a relative manifest CSV even if the input directory has not resolved as an existing directory yet. - Plan:
- Add current-working-directory-relative input folder candidates to
_resolve_drone_manifest_path(). - Preserve the clearer missing-file error with checked paths.
- Add focused regression coverage for resolving
input_h5_dir="drone_inputs"plusdrone_manifest_path="manifest.csv".
- Add current-working-directory-relative input folder candidates to
- Completion notes:
- Updated
_resolve_drone_manifest_path()to check both the raw relativeinput_h5_dirand the current-working-directory-resolved input folder for relative manifest CSVs. - Resolved manifest paths are now stored as absolute paths in QA metadata so notebook runs are easier to audit.
- Added a CyVerse-shaped regression test for
input_h5_dir="drone_inputs"anddrone_manifest_path="manifest.csv".
- Updated
- Verification:
python3 -m py_compile src/spectralbridge/pipelines/drone.py tests/test_drone_pipeline.pyMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py::test_run_drone_pipeline_resolves_manifest_relative_to_input_dir tests/test_drone_pipeline.py::test_run_drone_pipeline_resolves_manifest_relative_to_relative_input_folder tests/test_drone_pipeline.py::test_run_drone_pipeline_missing_manifest_error_lists_checked_pathsMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py
- Next recommended task:
- In CyVerse, upload/copy the manifest CSV either to the notebook working
directory or to
drone_inputs/; the patched resolver will now find either.
- In CyVerse, upload/copy the manifest CSV either to the notebook working
directory or to
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-10
- Goal: Improve
run_drone_pipeline()behavior whendrone_manifest_pathis a relative path that is not found from the notebook working directory. - Plan:
- Resolve relative manifest paths against the current working directory and nearby drone input locations before loading the CSV.
- Raise an actionable
FileNotFoundErrorthat lists checked locations and tells users to pass an absolute path or place/upload the CSV into the working environment. - Add focused regression coverage for relative path resolution and missing manifest error clarity.
- Completion notes:
- Added
_resolve_drone_manifest_path()so relativedrone_manifest_pathvalues are checked from the notebook/current working directory, the drone input folder, and the input folder parent before loading the CSV. - Improved missing-manifest failures with an actionable
FileNotFoundErrorthat lists every checked path and tells users to pass an absolute path or upload/place the CSV into the working environment. - Added regression tests for resolving a manifest placed inside the drone input directory and for the clearer missing-file error.
- Added
- Verification:
python3 -m py_compile src/spectralbridge/pipelines/drone.py tests/test_drone_pipeline.pyMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py::test_run_drone_pipeline_resolves_manifest_relative_to_input_dir tests/test_drone_pipeline.py::test_run_drone_pipeline_missing_manifest_error_lists_checked_paths tests/test_drone_pipeline.py::test_lookup_flight_datetime_matches_compact_mixed_separator_idMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py
- Next recommended task:
- In the notebook/Jupyter environment, either upload the manifest CSV next to
the notebook or
drone_inputs/, or pass the absolute path to the uploaded CSV.
- In the notebook/Jupyter environment, either upload the manifest CSV next to
the notebook or
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-10
- Goal: Validate the real drone field manifest CSV against the manifest loader
and tighten flight-ID matching for mixed separator forms such as
SPR-1matching derived package stems likeSPR1_20230628. - Plan:
- Test
load_drone_manifest()andlookup_flight_datetime()against the provided field CSV without committing the CSV to the repository. - Make missing/blank manifest IDs skip cleanly instead of normalizing pandas
missing values to
NAN. - Add compact alphanumeric fallback matching while preserving exact and date-stripped matching priority.
- Add focused regression tests for
SPR-1->SPR1_YYYYMMDDmatching.
- Test
- Completion notes:
- Validated the provided field CSV in
/Users/tuff/Downloadswithout copying it into the repository. - Updated manifest ID normalization so pandas missing IDs skip cleanly as
missing values instead of becoming
NAN. - Added compact alphanumeric fallback matching so manifest IDs such as
SPR-1andSPR-2resolve derived stems such asSPR1_20230628andSPR2_20230628. - Confirmed the real manifest resolves representative package stems:
SPR1_20230628,SPR2_20230628,SH67_1_20230707,SH67W2_20230711,AOP_GOLDHILL_20230814, andAOP_GORDON_20230814. - The real CSV loaded 44 valid acquisition datetimes; row 31 (
MTST_11) is missing date/time and row 46 has a missingPlotvalue, both now reported with clear warnings.
- Validated the provided field CSV in
- Verification:
python3 -m py_compile src/spectralbridge/pipelines/drone.py tests/test_drone_pipeline.pyMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py::test_load_drone_manifest_parses_flight_datetime tests/test_drone_pipeline.py::test_lookup_flight_datetime_matches_manifest_id_without_date_suffix tests/test_drone_pipeline.py::test_lookup_flight_datetime_matches_compact_mixed_separator_idMPLCONFIGDIR=/tmp/spectralbridge-mpl .venv/bin/pytest -q tests/test_drone_pipeline.py
- Next recommended task:
- Use the manifest path in a real
run_drone_pipeline()TIFF run and confirm the generated per-flight QA audit reportssolar_geometry_sourceasmanifest_computedfor flights without explicit solar rasters/scalars.
- Use the manifest path in a real
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-09
- Goal: Restore drone solar-geometry derivation from a flight manifest CSV so TIFF-backed drone inputs can produce NEON-equivalent H5 solar angle datasets when explicit solar rasters/scalars are not supplied.
- Plan:
- Keep the standard NEON/AOP pipeline unchanged and contain all behavior in
src/spectralbridge/pipelines/drone.py. - Add optional
drone_manifest_pathandrequire_solar_geometryinputs to the drone adapter path without requiring them for existing H5 workflows. - Implement manifest loading, flight-ID lookup, raster-coordinate lat/lon generation, and per-pixel solar zenith/azimuth calculation for TIFF-to-H5 conversion.
- Record solar-geometry provenance and summary statistics in drone QA output.
- Add focused regression tests for manifest parsing, flight lookup, manifest-derived H5 geometry, and required-geometry failure behavior.
- Keep the standard NEON/AOP pipeline unchanged and contain all behavior in
- Completion notes:
- Added
load_drone_manifest()andlookup_flight_datetime()to the drone adapter with tolerant CSV column matching, flight-id normalization, and date-suffix matching such asAOP_GOLDHILL_20230814->AOP_GOLDHILL. - Extended
convert_drone_tiff_to_h5()to preserve the existing priority order for explicit solar rasters/scalars and compute per-pixelSolar_Zenith_Angle/Solar_Azimuth_Anglefrom manifest acquisition datetime plus raster CRS/transform when explicit geometry is absent. - Added
drone_manifest_pathandrequire_solar_geometrytorun_drone_pipeline()and threaded manifest-derived datetimes through the TIFF-to-H5 preparation stage without modifying the standard NEON/AOP pipeline. - Added per-flight QA/audit fields for solar geometry source, acquisition datetime used, and solar zenith/azimuth summary statistics.
- Updated the MicaSense/drone tutorial to document manifest-derived solar geometry and the required-geometry behavior.
- Added
- Verification:
python3 -m py_compile src/spectralbridge/pipelines/drone.py tests/test_drone_pipeline.pyCSCAL_TEST_MODE=full .venv/bin/pytest -q tests/test_drone_pipeline.pypython3 scripts/check_docs_links.py
- Remaining work:
ruff check src testswas not run becauseruffis not installed in the local.venvor available onPATHin this environment.
- Next recommended task:
- Run CI or a local environment with Ruff installed to verify linting, then test the manifest path against the real field CSV to confirm timestamp timezone assumptions match the acquisition metadata.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-09
- Goal: Redesign the normal AOP/NEON QA PNG so the compact quick-look panel explicitly shows the original ENVI, corrected ENVI, and core diagnostics, while leaving the multi-page PDF as the fuller audit report.
- Plan:
- Keep the existing metrics and PDF generation path intact.
- Reorganize the single-page PNG generated by
render_flightline_panel()so it includes raw and corrected RGB previews plus correction, harmonization, and QA-summary diagnostics. - Add focused tests that lock the new normal-pipeline QA panel layout without touching drone QA behavior.
- Completion notes:
- Updated the AOP/NEON single-page PNG generated by
render_flightline_panel()to use a compact 2x3 publication-facing layout with original ENVI RGB, corrected ENVI RGB, histogram diagnostics, wavelength correction distribution, convolved-vs-corrected scatter, and a compact QA summary/flags panel. - Kept the multi-page PDF generation path intact as the fuller audit artifact, preserving the existing raw/corrected/convolved overview and diagnostics.
- Updated
docs/pipeline/qa_panel.mdto document the distinction between the compact PNG quicklook, structured JSON metrics, and full PDF QA report. - Added a focused smoke regression in
tests/test_qa/test_qa_metrics_smoke.pyto lock the AOP QA PNG panel titles/layout.
- Updated the AOP/NEON single-page PNG generated by
- Verification:
python3 -m py_compile src/spectralbridge/qa_plots.py tests/test_qa/test_qa_metrics_smoke.pyCSCAL_TEST_MODE=full .venv/bin/pytest -q tests/test_qa/test_qa_metrics_smoke.pyCSCAL_TEST_MODE=full .venv/bin/pytest -q tests/test_qa/test_qa_png_phash.pyskipped because optionalimagehashis not installed in this environment.python3 scripts/check_docs_links.py
- Next recommended task:
- Continue the AOP QA review by deciding which diagnostics, if any, should be promoted from the PDF-only audit pages into the compact PNG quicklook.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Simplify the drone QA page by removing the inset
% changedmini-map from the correction-magnitude panel and improve panel labels so the layout is easier to interpret in exported QA PDFs. - Plan:
- Remove the inset map from the per-pixel correction magnitude panel while keeping the underlying summary statistics intact in the QA payload/text.
- Tighten and clarify the visible subplot titles/labels in the drone QA figure without changing the scientific metrics being rendered.
- Update the nearest render regression tests to lock the clarified titles and keep the layout stable.
- Completion notes:
- Removed the
% changedinset from the spatial correction-magnitude panel insrc/spectralbridge/qa_plots.pywhile preserving the underlying changed-pixel summary metrics in the QA payload and text box. - Renamed the visible drone QA subplot titles to clearer publication-facing labels for the RGB preview, spectral comparison, correction spectrum, spatial correction map, polygon overlay, merged preview, and raw/corrected invalid-band maps.
- Updated the subplot-layout regression in
tests/test_drone_pipeline.pyto assert the new titles and explicitly guard against reintroducing the% changedinset axis.
- Removed the
- Verification:
python3 -m py_compile src/spectralbridge/qa_plots.py tests/test_drone_pipeline.pyCSCAL_TEST_MODE=full .venv/bin/pytest -q tests/test_drone_pipeline.py -k 'render_drone_panel_places_invalid_maps_on_bottom_row or render_drone_panel_includes_correction_status or render_drone_panel_logs_sampling_debug_and_writes_debug_payload'
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Stabilize chunked polygon Parquet writing so polygon metadata columns keep consistent Arrow-compatible schemas across chunks even when an early chunk is entirely null for a text field and a later chunk contains strings.
- Plan:
- Inspect the shared polygon extraction write path used by
extract_polygon_parquet_from_envi()and identify the narrowest safe place to normalize polygon metadata dtypes before Parquet chunk emission. - Preserve numeric, datetime, binary WKB, and integer
polygon_idtypes while ensuring text/object/categorical polygon metadata columns cannot be inferred as Arrownullfrom an all-missing first chunk. - Add a regression test that reproduces the null-only-first-chunk failure mode and verify the chunked writer remains stable without changing NEON behavior broadly.
- Inspect the shared polygon extraction write path used by
- Completion notes:
- Added polygon-metadata dtype inference and per-chunk normalization in
src/spectralbridge/polygons.pyso chunked polygon extraction stabilizes text/object/categorical metadata as pandas string dtype, preserves nullable integerpolygon_id, keeps numeric and datetime metadata typed, and preserves WKB bytes instead of letting null-only early chunks lock the writer to Arrownull. - Kept the change local to the shared polygon extraction path used by
extract_polygon_parquet_from_envi()instead of changing the global Parquet writer behavior for unrelated NEON exports. - Added
tests/test_polygons.pyto reproduce the null-only-first-chunk metadata scenario (species,cover_subcategory,dead_subcategory) and assert that both extracted chunks reach the writer with stable dtypes and preserved later-string values.
- Added polygon-metadata dtype inference and per-chunk normalization in
- Verification:
python3 -m py_compile src/spectralbridge/polygons.py tests/test_polygons.pyCSCAL_TEST_MODE=full .venv/bin/pytest -q tests/test_polygons.pyCSCAL_TEST_MODE=full .venv/bin/pytest -q tests/test_drone_pipeline.py
- Remaining work:
ruff check src testscould not be run in this local environment becauseruffis declared in project metadata/CI but is not currently installed in either.venvor the system Python available to Codex.
- Priority: User-directed
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Extend the drone pipeline so it can accept either existing HDF5 inputs or source GeoTIFF reflectance inputs, automatically recognize the source type, and convert TIFF sources into the working HDF5 contract before the existing drone workflow continues.
- Plan:
- Preserve the existing HDF5 path unchanged and add a narrow TIFF bridge rather than rewriting the correction or QA workflow.
- Convert TIFF inputs into the same working-HDF5 layout the current
NeonCubereader already understands, with explicit validation of raster alignment and ancillary requirements. - Add regression tests for source-type detection, TIFF-to-working-HDF5 conversion, and mixed-source pipeline execution.
- Completion notes:
run_drone_pipeline()now discovers either.h5inputs or reflectance.tif/.tiffinputs and automatically branches to the existing HDF5 path or a new TIFF-to-working-HDF5 conversion bridge.- The TIFF bridge emits the same site-group legacy HDF5 layout already
accepted by
NeonCube, preserving the downstream correction, QA, and polygon workflows instead of creating a parallel TIFF-only execution path. - HDF5 inputs still take precedence when both HDF5 and TIFF sources resolve to the same derived flight stem.
- Added focused regression coverage in
tests/test_drone_pipeline.pyfor source discovery, TIFF-backed pipeline runs, working-HDF5 preparation, andNeonCubereadability of converted TIFF inputs. - Updated
docs/tutorials/micasense-to-landsat.mdto document the mixed source contract, ancillary TIFF expectations, and TIFF scalar solar-angle fallbacks.
- Remaining work:
- TIFF support currently relies on strict ancillary filename discovery and
either default 10-band Erick notebook wavelengths/FWHM or explicit
tiff_wavelengths_nm/tiff_fwhm_nmarguments for other band layouts.
- TIFF support currently relies on strict ancillary filename discovery and
either default 10-band Erick notebook wavelengths/FWHM or explicit
- Progress notes:
- Follow-up cleanup is still needed in
tests/test_drone_pipeline.pyso the progress/status assertions reflect the new mixed-source logging message instead of the old HDF5-only wording.
- Follow-up cleanup is still needed in
- Completion notes:
- Updated the drone progress/status regression test to assert the new
mixed-source log wording (
type=h5 | stage=preparing working H5) instead of the old HDF5-only phrase. - Re-ran a focused mixed-source drone slice covering HDF5 progress logs, TIFF source discovery, TIFF-backed runs, and the no-polygon HDF5 path.
- Updated the drone progress/status regression test to assert the new
mixed-source log wording (
- Next recommended task: If TIFF-backed workflows expand further, add a richer package metadata contract for ancillary discovery and explicit spectral metadata instead of relying on filename heuristics alone.
- Priority: P0
- Status: Completed
- Owner: Codex
- Started: 2026-06-02
- Goal: Audit repository licensing, citation, and release-governance state; update open-science documentation; and record blockers for any Apache 2.0 migration.
- Plan:
- Review current license, metadata, citation, docs, templates, and release files.
- Record discovered gaps and legal blockers before implementing low-risk governance/documentation updates.
- Add durable feature requests for DOI/Zenodo/release infrastructure where missing.
- Findings so far:
- The repository is currently GPLv3 in
LICENSE,pyproject.toml,CITATION.cff, andREADME.md. - Several runtime source files and docs explicitly state that portions are adapted from HyTools under GPLv3, which is a legal blocker for silently relicensing the current codebase to Apache 2.0.
CITATION.cffstill containsFILLMEmarkers, a future-looking release date, team-placeholder authors, and GPL metadata.- No
NOTICEfile exists. - No obvious Zenodo configuration or DOI workflow files are present in the repository snapshot reviewed so far.
- The repository is currently GPLv3 in
- Completion notes:
- Updated
README.mdwith stronger citation guidance, current license status, open-science framing, and a brief commercialization section that does not misstate the current GPL status. - Updated
CITATION.cffto removeFILLMEmarkers and incorrect release dating while keeping TODO comments for maintainer-approved author details. - Updated
CONTRIBUTING.md,AGENTS.md,pyproject.toml, andpublication_checklist.mdto reflect citation/release expectations and the need for legal/provenance review before any Apache 2.0 migration. - Confirmed that no issue/PR templates were present under
.github/, no Zenodo configuration was found, and local tags are inconsistent (0.1,v1.0.0).
- Updated
- Blockers:
- Apache 2.0 migration appears to require maintainer/legal review and likely a provenance audit for GPL-derived HyTools adaptations before any direct license replacement.
- Next recommended task: Prioritize DOI/Zenodo/release-governance work and decide whether an Apache 2.0 migration is legally feasible for the existing codebase.
- Priority: P0
- Status: Completed
- Owner: Codex
- Started: 2026-06-02
- Goal: Update repo governance so future work is resumable, reviewable, test-driven, and feature-request-driven.
- Plan:
- Update
AGENTS.mdwith explicitFEATURE_REQUESTS.mdworkflow rules. - Replace the cleanup-oriented placeholder queue with a durable prioritized backlog.
- Update
- Completion notes:
AGENTS.mdupdated to require work-queue-first execution, resumable status recording, regression-test preference, and drone HDF5/chunking guardrails.FEATURE_REQUESTS.mdconverted into the authoritative queue for ongoing hardening work.
- Next recommended task: Complete P1 before moving to lower-priority items.
- Priority: P1
- Status: Completed
- Owner: Codex
- Started: 2026-06-02
- Goal: Add regression tests that protect drone HDF5 orientation assumptions using tiny asymmetric non-square synthetic fixtures.
- Requirements:
- Include reflectance plus ancillary layers for
slope,aspect,solar_zn,solar_az,sensor_zn, andsensor_az. - Verify correct alignment and detect transpose, diagonal mirror, row reversal, and column reversal regressions.
- Document that these tests protect against upstream TIFF-to-HDF5 orientation regressions without adding TIFF logic to SpectralBridge.
- Include reflectance plus ancillary layers for
- Plan:
- Inspect current drone HDF5 loading/orientation helpers and nearby tests.
- Add focused regression tests with synthetic HDF5 fixtures.
- Update nearest docs only if the contract is not already documented.
- Completion notes:
- Added tiny asymmetric non-square synthetic HDF5 orientation tests in
tests/test_neon_cube.pycovering reflectance plusslope,aspect,solar_zn,solar_az,sensor_zn, andsensor_az. - Protected against transpose, row-reversal, and column-reversal regressions by asserting the loaded cube and ancillary rasters do not mirror those spatial transforms.
- Documented the drone HDF5 input contract in
docs/tutorials/micasense-to-landsat.md.
- Added tiny asymmetric non-square synthetic HDF5 orientation tests in
- Blockers: Diagonal-mirror regression coverage currently comes from transpose assertions because NumPy's 2-D mirror across the diagonal is a transpose for these synthetic rasters.
- Next recommended task: Continue with P4 and P5 to validate chunked extraction and per-flight parquet outputs end to end.
- Priority: P2
- Status: Completed
- Goal: Protect
_orient_cube()for(lines, columns, bands),(bands, lines, columns), and(lines, bands, columns)without permitting spatial mirroring or row/column flipping. - Completion notes:
- Added
_orient_cube()tests for all three supported spectral-axis placements and verified that only the spectral axis moves.
- Added
- Priority: P3
- Status: Completed
- Goal: Verify
cube.get_ancillary(...)fails clearly and actionably when ancillary dimensions do not match(lines, columns). - Completion notes:
- Added a targeted shape-mismatch regression test asserting the explicit
(4, 3)vs(3, 4)error message for ancillary rasters.
- Added a targeted shape-mismatch regression test asserting the explicit
- Priority: P4
- Status: Completed
- Owner: Codex
- Started: 2026-06-02
- Goal: Review drone extraction paths and confirm chunked reading, correction, extraction, and restart-safe behavior are preserved.
- Plan:
- Audit existing drone and polygon-extraction tests against the chunked processing guarantees.
- Add any missing regression coverage needed to prove chunked reading and extraction are still the live path.
- Only mark complete if the current implementation preserves chunked behavior without needing risky functional changes.
- Completion notes:
- Confirmed existing drone correction coverage already locks the correction
path to chunked full-scene iteration through
apply_drone_corrections. - Added a focused regression test in
tests/test_polygon_extraction.pyprovingprocess_raster_in_chunksstill reads and writes multiple chunk windows instead of collapsing to a whole-raster extraction path. - Updated stale polygon-extraction tests to patch the current
require_rasterio()import path, keeping the test suite aligned with the live implementation.
- Confirmed existing drone correction coverage already locks the correction
path to chunked full-scene iteration through
- Next recommended task: Continue with P5 to decide whether the current drone pipeline fully satisfies per-flight parquet expectations beyond polygon mode.
- Priority: P5
- Status: In progress
- Owner: Codex
- Started: 2026-06-03
- Goal: Validate per-flight parquet outputs for polygon mode and full extraction, restore missing functionality if needed using chunked processing, and surface QA metadata for parquet/merge/CSV status.
- Plan:
- Confirm the current polygon-mode per-flight parquet outputs retain polygon metadata all the way through extraction and merge.
- Audit the no-polygon drone path against the requested
<flight_stem>__extracted.parquetexpectation and treat any larger gap as a follow-up only if it can be fixed safely without destabilizing restart behavior. - Keep chunked extraction intact while closing any metadata-loss regressions.
- Progress notes:
- Audit found that polygon pixel-index parquets already store polygon metadata, but direct ENVI-to-polygon extracted parquets currently drop that metadata before merge.
- Fixed polygon-mode extraction so both the per-product parquet filter and
the direct ENVI chunked extractor preserve
polygon_idand user polygon attributes in the extracted per-flight parquet outputs.
- Remaining work:
- The current drone no-polygon path intentionally ends in
success_qa_only_no_polygonsrather than producing a<flight_stem>__extracted.parquetfull-scene output. Restoring that expectation would be a larger behavioral change and is intentionally left open pending a design decision so restart-safe behavior is not changed casually.
- The current drone no-polygon path intentionally ends in
- Blockers:
- The requested no-polygon per-flight extracted parquet contract does not match the current shipped drone workflow, so this item cannot be marked complete without deciding whether to add a new chunked full-scene parquet stage.
- Priority: P6
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Expand drone tests for orientation, extraction modes, chunking, CRS, overlap, metadata preservation, overlays, correction failures, and CSV failures.
- Completion notes:
- Confirmed the existing suite already covers the requested categories across
tests/test_neon_cube.pyandtests/test_drone_pipeline.py, including orientation alignment, polygon and no-polygon execution paths, chunked correction, CRS/overlap diagnostics, polygon metadata preservation, overlay image generation, correction-unavailable handling, and CSV export failures. - Re-ran a representative focused slice of those tests to verify the coverage remains live after the polygon parquet metadata changes.
- Confirmed the existing suite already covers the requested categories across
- Priority: P7
- Status: In progress
- Owner: Codex
- Started: 2026-06-03
- Goal: Add selective recovery and validation tests for restart-safe reuse, corrupt-output rebuilds, missing downstream products, and explicit statuses.
- Plan:
- Turn the current skip/rebuild code paths into explicit recovery contracts with focused tests around valid-output reuse, corrupt sidecar regeneration, and selective downstream recomputation.
- Reuse existing stage-level helpers where possible instead of adding a new recovery framework.
- Only change runtime behavior if a test exposes a real gap that can be fixed safely without broadening the pipeline contract.
- Progress notes:
- Added restart-contract tests proving a recovered raw ENVI export is reused on the next run instead of being rebuilt again.
- Added a recovery test proving corrupt parquet sidecars are regenerated once and then treated as valid skip candidates on subsequent runs.
- Added a selective recomputation test proving the convolution stage rebuilds only a missing downstream sensor product while leaving already-valid sensor outputs untouched.
- Remaining work:
- Explicit machine-readable statuses such as
skipped_existing_valid_output,recomputed_missing_output,recomputed_corrupt_output, andfailed_validationare still not emitted by the core NEON pipeline stages, so this item remains open.
- Explicit machine-readable statuses such as
- Blockers:
- Closing the status-vocabulary gap would require a deliberate API/logging decision rather than a test-only hardening pass.
- Priority: P8
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Protect required parquet schema fields, dtypes, and polygon metadata across per-flight and merged outputs.
- Completion notes:
- Added a canonical-schema regression in
tests/test_schema_parity.pycovering required field order throughCANONICAL_COLUMNSwhile remaining compatible with the lightweight fake-pyarrowtest environment. - Strengthened
tests/test_polygon_pipeline.pyto assert that extracted and merged polygon parquets retainpolygon_idplus user attributes such asspecies. - Updated
src/spectralbridge/polygons.pyso both polygon extraction paths preserve polygon index metadata without abandoning chunked ENVI reads or altering output naming.
- Added a canonical-schema regression in
- Priority: P9
- Status: Completed
- Owner: Codex
- Started: 2026-06-02
- Goal: Keep
import spectralbridgecanonical while preservingimport cross_sensor_calcompatibility, add import/CLI tests, and avoid cwd-dependent behavior. - Plan:
- Extend compatibility tests to assert the deprecation warning and key public imports under both namespaces.
- Add a packaging-level test for the published console-script entry points so docs and release metadata stay aligned with the implementation.
- Avoid changing import behavior unless a test proves a real compatibility gap.
- Progress notes:
- Added tests asserting that
import cross_sensor_calemits the expected deprecation warning while still re-exporting key top-level helpers fromspectralbridge. - Added a packaging-level test that every published console-script entry
point in
pyproject.tomlresolves to a callable implementation.
- Added tests asserting that
- Completion notes:
- Added non-repo-working-directory tests proving both namespaces and the
published CLI entry points still resolve from an arbitrary
cwd, reducing the risk of repo-root/container-path assumptions leaking into the package surface.
- Added non-repo-working-directory tests proving both namespaces and the
published CLI entry points still resolve from an arbitrary
- Priority: P10
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Expand CI coverage for
src/spectralbridge/**,tests/**,pyproject.toml, and workflow changes with targeted install/lint/test steps. - Completion notes:
- Hardened
.github/workflows/ci.ymlso push/PR triggers are scoped to the actual code/test/workflow surfaces requested, added a package-version import smoke step, and inserted targeted drone/QA regression slices ahead of the full pytest run. - Updated
.github/workflows/qa-ci.ymlto watchsrc/spectralbridge/**in addition to the legacy compatibility tree and to generate its fixture usingspectralbridge.qa_plotsinstead of the deprecated namespace.
- Hardened
- Verification notes:
- Local workflow YAML parsing could not be run with Python because
pyyamlis not installed in this environment, so workflow verification here was limited to source inspection plus targeted test execution.
- Local workflow YAML parsing could not be run with Python because
- Priority: P11
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Review duplicate handlers plus notebook, multiprocessing, and Ray logging behavior; document findings without major refactors.
- Completion notes:
- Added
docs/dev/logging-review.mddocumenting the current logging posture across the NEON pipeline, drone pipeline, QA modules, CLIs, multiprocessing, and Ray integration. - Confirmed the biggest consistency risks are import-time logger setup in
pipelines/pipeline.py, import-time level forcing inqa_plots.py, root-logger usage incorrections.py, and mixed CLI/root-logger handling vialogging.basicConfig(...). - Confirmed the current review did not find an immediate scientific or restart-safety bug, so no runtime logging refactor was made in this pass.
- Added
- Priority: P11
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Incrementally unify library vs CLI logging behavior, reduce import-time logger side effects, and standardize progress/log capture behavior across NEON, drone, multiprocessing, and Ray paths without destabilizing the scientific pipeline.
- Plan:
- Remove the safest import-time logger side effects first, especially where modules force levels or call root logging helpers during import.
- Keep CLI-visible logging behavior intact by moving configuration into explicit runtime helpers where possible.
- Add focused regression coverage for the changed logging contracts instead of attempting a broad logging-system rewrite.
- Completion notes:
- Added
src/spectralbridge/logging_utils.pywith a sharedconfigure_cli_logging()helper so CLI entry points configure root logging only when the root logger is otherwise unconfigured. - Updated
src/spectralbridge/qa_dashboard.pyandsrc/spectralbridge/cli/recover_cli.pyto use the shared helper instead of callinglogging.basicConfig(...)inline, and maderecover_cli.main()accept optional argv for cleaner testability. - Removed
qa_plotsimport-time level forcing so the module no longer silently pins its logger toINFO. - Switched
src/spectralbridge/corrections.pyfrom direct root-logger calls to a module-scoped logger so logging behavior now follows the package namespace hierarchy instead of bypassing it. - Added
tests/test_logging_config.pyto cover the shared CLI logging helper, theqa_plotsimport contract, thecorrections.log_stats()logger path, and the updated CLI entry point setup.
- Added
- Verification:
python3 -m py_compile src/spectralbridge/logging_utils.py src/spectralbridge/qa_dashboard.py src/spectralbridge/cli/recover_cli.py src/spectralbridge/qa_plots.py src/spectralbridge/corrections.py tests/test_logging_config.pyCSCAL_TEST_MODE=full .venv/bin/pytest -q tests/test_logging_config.pyCSCAL_TEST_MODE=full .venv/bin/pytest -q tests/test_drone_pipeline.py -k 'render_drone_panel_logs_sampling_debug_and_writes_debug_payload or render_drone_panel_includes_correction_status or render_drone_panel_places_invalid_maps_on_bottom_row'
- Priority: P11
- Status: Todo
- Goal: Decide whether the module-owned handler in
spectralbridge.pipelines.pipelineshould remain an intentional application behavior or eventually move to the same explicit runtime-configuration model now used by the lighter CLI utilities.
- Priority: P12
- Status: Completed
- Owner: Codex
- Started: 2026-06-02
- Goal: Review whether current smoke tests capture intentional public APIs without freezing internal helpers.
- Completion notes:
- Reworked the public API smoke tests to derive the matrix from intentional
module exports instead of every non-underscore helper found under
src/. - Kept coverage on top-level package, CLI, and pipeline entry points while allowing internal helpers to evolve without being frozen into the contract.
- Reworked the public API smoke tests to derive the matrix from intentional
module exports instead of every non-underscore helper found under
- Priority: P13
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Audit license/readme/citation/resources/manifest and confirm prompt logs, temporary outputs, large data, and development artifacts are not shipped unintentionally.
- Completion notes:
- Tightened
MANIFEST.into stop explicitly shipping maintainer-only files and to exclude obvious accidental artifacts such asPROMPT_LOG.md, root-level notebooks,:memory:, and local contribution notes. - Added
docs/dev/release-hygiene.mddocumenting the release-hygiene audit, the manifest changes, and the remaining repo-level concerns that are now visible to maintainers. - Confirmed local docs links still pass after the new review note was added.
- Tightened
- Verification notes:
- A real source-distribution build could not be executed in this environment
because the active Python lacks
setuptoolsandbuild, so this item was verified by manifest review plus targeted docs checks rather than by inspecting a built artifact directly.
- A real source-distribution build could not be executed in this environment
because the active Python lacks
- Priority: P14
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Review version definitions and release process to prevent drift.
- Completion notes:
- Added
docs/dev/versioning-review.mddocumenting the current version sources, the local tag drift, and the mismatch between packaged metadata (2.2.0) and the leadingCHANGELOG.mdrelease heading (2.3.0). - Updated
CONTRIBUTING.mdso release guidance explicitly includessrc/spectralbridge/__init__.pyand warns against leaving future release headings above the current packaged version unless they are clearly unreleased. - Updated
publication_checklist.mdwith an explicit version-sync checklist item so future releases verifypyproject.toml,__init__.py,CITATION.cff,CHANGELOG.md, and the Git tag together.
- Added
- Verification notes:
- This pass was a repository-state audit only. No version numbers or tag history were rewritten automatically.
- Priority: P15
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Review
ray,geopandas, andrasteriodependency posture and whether extras should change without breaking installs. - Completion notes:
- Added
docs/dev/dependency-review.mddocumenting the current dependency layout and whyray,rasterio, andgeopandasshould remain required under the current workflow contract. - Updated
docs/env.mdto reflect the real runtime dependency stack and to clarify thatrioxarray/xarrayare optional notebook companions, not direct package requirements. - Confirmed that changing extras automatically would amount to a packaging redesign rather than a safe hardening tweak, so dependency declarations were left unchanged in this pass.
- Added
- Priority: P16
- Status: Completed
- Owner: Codex
- Started: 2026-06-02
- Goal: Prefer
import spectralbridgein examples while documenting HDF5 contracts, chunking, restart behavior, parquet authority, CSV sidecars, and drone/NEON workflows. - Plan:
- Bring the homepage workflow visuals and high-traffic subpages into the new docs visual system so the site feels consistent end to end.
- Audit
quickstart.md,usage/cli.md, and the pipeline overview/output pages against the current package entry points and documented outputs. - Update page structure and copy to match the actual CLI defaults, outputs, and restart-safe behavior without inventing features.
- Progress notes:
- Updated the homepage workflow arrows to match the left-to-right visual flow.
- Reworked
docs/quickstart.md,docs/usage/cli.md,docs/pipeline/stages.md, anddocs/pipeline/outputs.mdinto the newer docs visual system while aligning examples and command details with the current package entry points. - Added broader docs styling so non-homepage pages better match the primary landing-page direction without requiring a full docs rewrite in one pass.
- Started a second docs pass for the remaining high-traffic pages:
docs/concepts/why-calibration.md,docs/pipeline/qa.md,docs/usage/parquet.md, anddocs/troubleshooting.md. - Completed that second pass and aligned those pages with the newer card-and-section layout while keeping the content tied to the current package behavior, restart guidance, and CLI entry points.
- Verified that the public docs and
README.mdno longer contain stalecross_sensor_calorcross-sensor-calreferences.
- Completion notes:
- Modernized the remaining older public docs pages that were still visually
and structurally out of sync with the refreshed site, including
docs/faq.md,docs/reference/configuration.md,docs/reference/validation.md,docs/reference/schemas.md,docs/api/index.md, anddocs/tutorials/cloud-workflow.md. - Updated those pages to use the newer card-and-section layout while keeping examples aligned with the current package behavior, canonical namespace, restart-safe workflow, and published CLI entry points.
- Corrected stale configuration guidance by removing unsupported runtime environment-variable claims and documenting the environment knobs that are actually read by the current code.
- Modernized the remaining older public docs pages that were still visually
and structurally out of sync with the refreshed site, including
- Verification:
python3 scripts/check_docs_links.py
- Priority: P17
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Document lightweight findings on duplicate metadata/path/output logic, chunking consistency, restart-safe consistency, QA consistency, and shared drone/NEON infrastructure opportunities.
- Plan:
- Review the live orchestration, path, merge, polygon, QA, and metadata modules rather than proposing a speculative redesign.
- Capture concrete duplication and consistency findings in a maintainer-facing architecture audit.
- Create follow-up feature requests only where the current implementation is working but visibly split across multiple helpers.
- Completion notes:
- Added
docs/dev/architecture-audit.mdwith a documentation-only review of the live orchestration, path, merge, polygon, metadata, chunking, and QA layers. - Confirmed that the strongest architectural invariants are still the file-based stage ordering, restart-safe reruns, chunk-preserving NEON processing, and treating parquet and QA outputs as contracts.
- Identified split naming authority between
FlightlinePathsandget_flightline_products()plus duplicated output-discovery logic across merge, polygon, QA, and summary helpers as the main maintainability hotspots. - Confirmed that the best shared drone/NEON opportunities are around artifact lookup and validation helpers, not around collapsing both orchestration layers into one pipeline entry point.
- Added
- Next recommended task: Continue with P18, and treat P25/P26 below as additive cleanup work rather than urgent refactors.
- Priority: P17
- Status: Todo
- Goal: Reduce duplicated parquet and merged-output discovery logic across
merge_duckdb.py,polygons.py,qa_plots.py, and QA summary helpers by introducing shared artifact-location utilities without changing filename contracts.
- Priority: P17
- Status: Todo
- Goal: Decide whether
FlightlinePathsshould subsume more ofget_flightline_products()or whether the current dual path/naming layer is intentionally permanent, then document that decision for future maintainers.
- Priority: P18
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Add and document DOI generation infrastructure, including Zenodo enablement steps, release-to-DOI workflow guidance, and maintainer-facing verification steps.
- Plan:
- Verify the repository's current external DOI/Zenodo state before changing local docs or badges.
- Surface any existing DOI clearly in the README while distinguishing between archived historical releases and the current package version.
- Add maintainer-facing documentation for Zenodo verification and release updates so DOI state remains reproducible.
- Completion notes:
- Verified that the repository already has a Zenodo software archive for the
pre-rename
earthlab/cross-sensor-cal: Version 1release published on 2024-05-09 with DOI10.5281/zenodo.11167877. - Added the existing Zenodo DOI badge to
README.mdand updated the citation section so it no longer claims DOI infrastructure is undocumented. - Added
docs/dev/doi-zenodo.mddocumenting the current Zenodo state, the distinction between the historic archived release and the currentSpectralBridgepackage version, and the maintainer verification workflow for future releases. - Added a Zenodo verification reminder to
publication_checklist.md.
- Verified that the repository already has a Zenodo software archive for the
pre-rename
- Next recommended task: Continue with P19, and treat P27 below as a follow-up if maintainers want a post-rename SpectralBridge-specific Zenodo release record to be explicitly refreshed.
- Priority: P18
- Status: Todo
- Goal: Ensure the next archived Zenodo release uses current SpectralBridge naming, synchronized version metadata, and the maintainers' preferred DOI target strategy (historic version DOI vs concept/latest DOI).
- Priority: P19
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Add durable release automation guidance covering tagged releases, release notes, changelog/release note generation, and citation metadata refresh steps.
- Plan:
- Review the existing GitHub Actions and maintainer docs to see what release automation is missing today.
- Add a conservative tag-driven release workflow that builds and validates package artifacts without assuming PyPI credentials.
- Document the maintainer release sequence, including changelog, citation, Zenodo, and release-note verification steps.
- Completion notes:
- Added
.github/workflows/release.ymlso version tags matchingvMAJOR.MINOR.PATCHnow buildsdistand wheel artifacts, runtwine check, install the built wheel for an import smoke test, upload the artifacts, and create or update a GitHub release with generated release notes. - Added
docs/dev/releasing.mddocumenting the maintainer release sequence, including version synchronization, changelog review, citation refresh, Zenodo verification, and the current limits of the automation. - Updated
CONTRIBUTING.mdandpublication_checklist.mdso the release workflow and maintainer checklist are part of the documented project process.
- Added
- Next recommended task: Continue with P20, and treat P28 below as a follow-up if maintainers want CI to block tag cuts when package metadata and tags are out of sync.
- Priority: P19
- Status: Todo
- Goal: Add a release-focused validation check that confirms the Git tag,
package version,
CITATION.cff, and changelog header are synchronized before a release is treated as valid.
- Priority: P20
- Status: Completed
- Owner: Codex
- Started: 2026-06-03
- Goal: Track associated publications, software-paper plans, preferred citation language, and versioned release citation policy in a maintainer-friendly way.
- Plan:
- Review the existing citation guidance, DOI notes, and maintainer-facing publication references already present in the repository.
- Add a dedicated maintainer document that records preferred citation language, publication-tracking placeholders, and the current policy for citing software releases vs associated papers.
- Link that guidance from the README and/or release-facing docs so it stays discoverable.
- Completion notes:
- Added
docs/dev/software-citation.mdas the maintainer-facing source of truth for preferred citation wording, versioned release citation policy, associated publication tracking, and software-paper placeholders. - Updated
README.mdso the public citation section now points maintainers to both the DOI/Zenodo note and the new citation-policy tracker. - Updated
publication_checklist.mdso software citation and publication tracking is part of the documented release-readiness checklist.
- Added
- Next recommended task: Continue with P21, and treat P29 below as a follow-up for filling in the actual publication list once maintainers confirm the canonical references.
- Priority: P20
- Status: Todo
- Goal: Replace the placeholder publication-tracking entries in
docs/dev/software-citation.mdwith the maintainer-approved software paper, associated publications, and canonical citation strings once those references are confirmed.
- Priority: P21
- Status: Todo
- Goal: Document maintainer-facing governance, open-science expectations, citation/release ownership, and commercialization-compatible stewardship guidance.
- Priority: P22
- Status: Todo
- Goal: Add or refresh GitHub issue/PR templates, acknowledgement guidance, and maintainer-facing contribution prompts for release/citation-sensitive changes.
- Priority: P23
- Status: Todo
- Goal: Normalize release tag conventions, document the canonical tag scheme, and reconcile any legacy inconsistent tags in maintainers' release records.
- 2026-06-02: Publication cleanup backlog completed and moved to
docs/dev/publication-cleanup-log.mdpluspublication_checklist.mdfor release gating details. - 2026-06-02: Hardened Ray startup compatibility by falling back to the thread executor when Ray cannot initialize before task submission in the local environment.
- 2026-06-02: Stabilized the public API smoke matrix so it imports the current repo source without polluting later tests.
- Local verification depends on which Python/test dependencies are available in the active environment. Record any missing tooling under the active item before stopping.