From 537dc664616cdbaee2d1d0fdf041fad5d9fc0701 Mon Sep 17 00:00:00 2001 From: Adeolu Mary Oshadare Date: Sat, 25 Apr 2026 16:39:34 +0100 Subject: [PATCH 1/2] docs: update Mary's role doc with sprint progress and live band mapping code - Add DONE/PENDING task list for April 2026 sprint - Include actual config.yaml band definitions per analysis type - Add SCL cloud masking reference table - Update codebase ownership to reflect active modules --- team_docs/Adeolu_Mary_Oshadare_Role.pdf | Bin 0 -> 12626 bytes team_docs/generate_role_docs.py | 73 ++++++++++++++++++++---- 2 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 team_docs/Adeolu_Mary_Oshadare_Role.pdf diff --git a/team_docs/Adeolu_Mary_Oshadare_Role.pdf b/team_docs/Adeolu_Mary_Oshadare_Role.pdf new file mode 100644 index 0000000000000000000000000000000000000000..51b940ed11df0bbf8565c3f17810938b9b1891cd GIT binary patch literal 12626 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⁣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 R0)af7KmaYR_)7`E{{bDa%+CM- literal 0 HcmV?d00001 diff --git a/team_docs/generate_role_docs.py b/team_docs/generate_role_docs.py index 0c4aaf2..138a9bb 100644 --- a/team_docs/generate_role_docs.py +++ b/team_docs/generate_role_docs.py @@ -174,18 +174,32 @@ def create_adeolu_doc(): pdf.bullet("Build data validation and quality checks for incoming satellite imagery") pdf.bullet("Manage the data/ directory structure (raw, processed, satellite)") pdf.bullet("Create EDA notebooks for spatial data exploration and visualization") - pdf.ln(2) + pdf.ln(1) + + pdf.subsection_title("Sprint Progress - April 2026") + pdf.bullet("DONE: band_mapping.py - analysis-specific band mapping from config.yaml") + pdf.bullet("DONE: gee_downloader.py - GEE tile download with metadata") + pdf.bullet("DONE: preprocessing.py - SCL-based cloud masking") + pdf.bullet("DONE: dataset.py - PyTorch Dataset and DataLoader") + pdf.bullet("DONE: augmentation.py - training/validation transforms") + pdf.bullet("DONE: synthetic.py - synthetic fallback tile generation") + pdf.bullet("PENDING: Real GEE tile download in inference pipeline (not just NDVI stats)") + pdf.bullet("PENDING: Analysis-specific band mapping enforcement in inference preprocessing") + pdf.bullet("PENDING: Cloud masking integration at inference time before model forward pass") + pdf.bullet("PENDING: Synthetic fallback guardrails - clearly label synthetic tiles in metadata") + pdf.ln(1) # Codebase Ownership pdf.section_title("Your Codebase Ownership") pdf.body_text("You are the primary owner of the following files and directories:") pdf.code_block( "src/climatevision/data/ # PRIMARY OWNER - Entire data module\n" - " sentinel2.py # Sentinel-2 downloader & preprocessor\n" - " landsat.py # Landsat data loader\n" - " dataset.py # PyTorch Dataset classes\n" - " preprocess.py # Cloud masking, normalization\n" - " augmentation.py # Data augmentation pipeline\n" + " band_mapping.py # Analysis-specific band mapping (ACTIVE)\n" + " gee_downloader.py # GEE tile downloader (ACTIVE)\n" + " preprocessing.py # Cloud masking, normalization (ACTIVE)\n" + " dataset.py # PyTorch Dataset & DataLoader (ACTIVE)\n" + " augmentation.py # Data augmentation pipeline (ACTIVE)\n" + " synthetic.py # Synthetic tile fallback (ACTIVE)\n" " __init__.py # Module exports\n" "\n" "src/climatevision/utils/\n" @@ -193,8 +207,9 @@ def create_adeolu_doc(): " visualization.py # CO-OWNER - Spatial visualizations\n" "\n" "scripts/\n" - " setup_gee.py # Google Earth Engine setup\n" - " download_data.py # Automated satellite data download\n" + " prepare_data.py # Automated satellite data download\n" + "\n" + "config.yaml # Band mapping & analysis type config\n" "\n" "data/ # Data directory structure\n" " raw/ | processed/ | satellite/\n" @@ -288,7 +303,41 @@ def create_adeolu_doc(): "# Follow browser prompt to authorise your GEE service account" ) - pdf.subsection_title("Step 2: Ingest Satellite Data") + pdf.subsection_title("Step 2: Analysis-Specific Band Mapping") + pdf.body_text("config.yaml defines bands per analysis type. Your band_mapping.py reads this:") + pdf.code_block( + "# config.yaml analysis type band definitions\n" + "deforestation: [B04, B03, B02, B08] # Red, Green, Blue, NIR -> 4ch -> 2cl\n" + "ice_melting: [B02, B03, B04, B11] # Blue, Green, Red, SWIR -> 4ch -> 3cl\n" + "flooding: [B03, B08, B11] # Green, NIR, SWIR -> 3ch -> 3cl\n" + "\n" + "# Python usage\n" + "from climatevision.data.band_mapping import get_bands_for_analysis, get_model_config\n" + "\n" + "bands = get_bands_for_analysis('flooding')\n" + "# -> ['B03', 'B08', 'B11']\n" + "\n" + "cfg = get_model_config('flooding')\n" + "# -> {'in_channels': 3, 'num_classes': 3, 'weights': 'models/unet_flood.pth'}" + ) + pdf.ln(2) + + pdf.subsection_title("Step 3: Cloud Masking with SCL Band") + pdf.body_text("Sentinel-2 Scene Classification Layer (SCL) pixel values:") + pdf.code_block( + "# SCL band values\n" + "KEEP = [4, 5, 6, 7, 10] # vegetation, bare soil, water, low cloud, thin cirrus\n" + "MASK = [0, 1, 2, 3, 8, 9] # NO_DATA, SATURATED, DARK, SHADOW, med/high cloud\n" + "\n" + "# Usage in preprocessing.py\n" + "from climatevision.data.preprocessing import apply_scl_cloud_mask\n" + "\n" + "clean_image = apply_scl_cloud_mask(image, scl_band)\n" + "# image: (C, H, W) scl_band: (H, W) uint8" + ) + pdf.ln(2) + + pdf.subsection_title("Step 4: Ingest Satellite Data") pdf.code_block( "# Download Sentinel-2 imagery for a bounding box and date range\n" "python scripts/prepare_data.py \\\n" @@ -301,7 +350,7 @@ def create_adeolu_doc(): "# Output: GeoTIFF tiles saved to data/raw/amazon_2023/" ) - pdf.subsection_title("Step 3: Preprocess & Build Dataset") + pdf.subsection_title("Step 5: Preprocess & Build Dataset") pdf.code_block( "# Run cloud masking, normalization, and 256x256 tiling\n" "python - <<'EOF'\n" @@ -323,7 +372,7 @@ def create_adeolu_doc(): "EOF" ) - pdf.subsection_title("Step 4: Compute Spectral Indices") + pdf.subsection_title("Step 6: Compute Spectral Indices") pdf.code_block( "# Calculate NDVI, EVI, and moisture indices from raw bands\n" "python - <<'EOF'\n" @@ -336,7 +385,7 @@ def create_adeolu_doc(): "EOF" ) - pdf.subsection_title("Step 5: Commit & Push Your Work") + pdf.subsection_title("Step 7: Commit & Push Your Work") pdf.code_block( "# Switch to your git identity\n" "source team_docs/switch_user.sh adeolu\n" From 604b72f809908f1ac16d16d93c75d0cea7490605 Mon Sep 17 00:00:00 2001 From: Adeolu Mary Oshadare Date: Sat, 25 Apr 2026 22:23:18 +0100 Subject: [PATCH 2/2] docs: add Linda Oraegbunam role document with governance pipeline - Responsible AI & Model Governance Lead role definition - 3-month timeline: explainability, bias audit, security, reporting - Code pipeline: SHAP, bias metrics, security scan, LLM reports - Sprint progress and codebase ownership --- team_docs/Linda_Oraegbunam_Role.pdf | Bin 0 -> 10952 bytes team_docs/generate_role_docs.py | 247 ++++++++++++++++++++++++++++ 2 files changed, 247 insertions(+) create mode 100644 team_docs/Linda_Oraegbunam_Role.pdf diff --git a/team_docs/Linda_Oraegbunam_Role.pdf b/team_docs/Linda_Oraegbunam_Role.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ddcb683cab50e92087070c99572215abe4fa1ad GIT binary patch literal 10952 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 QU@k6R00V=xiVWbt0NI|#VgLXD literal 0 HcmV?d00001 diff --git a/team_docs/generate_role_docs.py b/team_docs/generate_role_docs.py index 138a9bb..3ce212f 100644 --- a/team_docs/generate_role_docs.py +++ b/team_docs/generate_role_docs.py @@ -2359,3 +2359,250 @@ def create_gold_doc(): create_paul_doc() create_gold_doc() print(f"\nAll 8 role documents generated in: {OUTPUT_DIR}") + +def create_linda_doc(): + pdf = RoleDoc("Linda Oraegbunam") + pdf.add_page() + + pdf.set_font("Helvetica", "B", 18) + pdf.cell(0, 10, "Linda Oraegbunam", align="C", new_x="LMARGIN", new_y="NEXT") + pdf.set_font("Helvetica", "", 11) + pdf.set_text_color(100, 100, 100) + pdf.cell(0, 7, "Responsible AI & Model Governance Lead", align="C", new_x="LMARGIN", new_y="NEXT") + pdf.set_text_color(0, 0, 0) + pdf.ln(5) + + pdf.key_value("GitHub", "@obielin") + pdf.key_value("Access Level", "Maintainer") + pdf.key_value("Reports To", "@Goldokpa (Project Owner)") + pdf.key_value("Project Duration", "3 Months") + pdf.ln(3) + + pdf.section_title("How This Role Fits You") + pdf.body_text( + "Your FRSS fellowship, peer-reviewed publications in AI ethics, and open-source security tooling (skillguard) " + "give you a governance lens that no one else on this team has. While others build models and pipelines, " + "you ensure the outputs are trustworthy, explainable, and secure enough for NGOs and government agencies to act on." + ) + pdf.body_text( + "Your skillguard project - detecting prompt injection and supply chain attacks in agentic AI - maps directly " + "to securing ClimateVision's inference pipeline. Your agentsync work on multi-agent orchestration applies to " + "building autonomous monitoring agents that track deforestation regions without human intervention." + ) + pdf.body_text( + "Your HMRC experience operationalising 30+ governed KPIs and your Readrly.io MLOps work with fairness/bias " + "evaluation frameworks mean you understand how to build auditability into production systems. That is exactly " + "what ClimateVision needs: every prediction must be explainable, every model version auditable, and every " + "regional disparity measurable." + ) + pdf.ln(2) + + pdf.section_title("Your Role on ClimateVision") + pdf.body_text( + "You own the responsible AI, explainability, and governance layer - everything that turns black-box " + "segmentation outputs into trustworthy, actionable intelligence for conservation stakeholders." + ) + pdf.subsection_title("Core Responsibilities") + pdf.bullet("Build SHAP-based explainability for U-Net segmentation predictions - explain WHY each pixel was classified") + pdf.bullet("Implement bias and fairness audits across geographic regions (Amazon, Congo, Southeast Asia)") + pdf.bullet("Create anomaly detection for inference inputs and outputs - flag unusual predictions for human review") + pdf.bullet("Design model governance framework: version tracking, audit trails, compliance documentation") + pdf.bullet("Conduct AI security audit of FastAPI inference pipeline (OWASP Agentic Top 10, input validation)") + pdf.bullet("Build automated impact reports using LLM/NLP pipelines from model outputs") + pdf.bullet("Integrate responsible AI evaluation into CI/CD - automated fairness checks on every model release") + pdf.ln(2) + + pdf.subsection_title("Sprint Progress - April 2026") + pdf.bullet("PENDING: SHAP explainability integration for segmentation masks") + pdf.bullet("PENDING: Regional bias audit framework") + pdf.bullet("PENDING: Anomaly detection for inference pipeline") + pdf.bullet("PENDING: Model governance and audit trail system") + pdf.bullet("PENDING: AI security audit of API endpoints") + pdf.bullet("PENDING: LLM-based automated impact report generation") + pdf.ln(1) + + pdf.section_title("Your Codebase Ownership") + pdf.body_text("You are the primary owner of the following files and directories:") + pdf.code_block( + "src/climatevision/governance/ # PRIMARY OWNER - New module\n" + " explainability.py # SHAP explainability for segmentation\n" + " bias_audit.py # Regional fairness evaluation\n" + " anomaly_detector.py # Input/output anomaly detection\n" + " audit_logger.py # Model audit trails\n" + " __init__.py\n" + "\n" + "src/climatevision/security/ # PRIMARY OWNER - New module\n" + " api_security.py # API input validation & sanitization\n" + " pipeline_guard.py # Inference pipeline security checks\n" + " __init__.py\n" + "\n" + "src/climatevision/reports/ # PRIMARY OWNER - New module\n" + " llm_reporter.py # LLM-based impact report generation\n" + " __init__.py\n" + "\n" + "scripts/\n" + " audit_model.py # Run full governance audit on a model\n" + " security_scan.py # OWASP-style scan of API endpoints\n" + "\n" + "notebooks/\n" + " 06_explainability.ipynb # SHAP visualization notebook\n" + " 07_bias_audit.ipynb # Regional fairness analysis\n" + " 08_security_audit.ipynb # API security assessment" + ) + pdf.ln(2) + + pdf.section_title("Your 3-Month Delivery Timeline") + pdf.month_block("MONTH 1: Explainability & Bias (Weeks 1-4)", [ + ("Week 1-2: SHAP Explainability", [ + "Integrate SHAP (DeepExplainer) into U-Net forward pass for pixel-level attribution", + "Build explainability.py - generate heatmaps showing which bands/regions drove predictions", + "Create 06_explainability.ipynb with visual examples across all 3 analysis types", + "Add /api/explain endpoint returning SHAP values for a given prediction", + ]), + ("Week 3-4: Bias & Fairness Audit", [ + "Build bias_audit.py - evaluate model performance disparity across regions", + "Implement demographic parity and equalized odds metrics for geographic splits", + "Create automated bias report generation (JSON + PDF)", + "Write 07_bias_audit.ipynb demonstrating fairness evaluation", + ]), + ]) + pdf.month_block("MONTH 2: Security & Anomaly Detection (Weeks 5-8)", [ + ("Week 5-6: AI Security Audit", [ + "Map ClimateVision API to OWASP Agentic Top 10 and MITRE ATLAS frameworks", + "Build api_security.py - input sanitization, rate limiting, payload validation", + "Implement pipeline_guard.py - detect adversarial inputs to inference pipeline", + "Run security_scan.py against all endpoints and document findings", + ]), + ("Week 7-8: Anomaly Detection", [ + "Build anomaly_detector.py - isolation forest + statistical checks for predictions", + "Flag predictions with confidence outside historical norms", + "Create anomaly alert integration with Olufemi's alert system", + "Add /api/anomalies endpoint for querying flagged predictions", + ]), + ]) + pdf.month_block("MONTH 3: Governance & Reporting (Weeks 9-12)", [ + ("Week 9-10: Model Governance", [ + "Build audit_logger.py - immutable audit trail for every model version and prediction", + "Integrate with MLflow for governance metadata tagging", + "Create model card generator (automated from training config + evaluation metrics)", + "Implement CI gate: block releases that fail fairness or security thresholds", + ]), + ("Week 11-12: LLM Impact Reports & Documentation", [ + "Build llm_reporter.py - generate natural-language impact reports from prediction data", + "Integrate with Francis's carbon analytics for comprehensive stakeholder reports", + "Write governance documentation and responsible AI deployment guide", + "Final security sign-off and production readiness review", + ]), + ]) + + pdf.section_title("Your Git Workflow") + pdf.code_block( + "# Create feature branches from develop\n" + "git checkout develop\n" + "git pull origin develop\n" + "git checkout -b feature/governance-shap-explainability\n" + "\n" + "# Your branch naming convention:\n" + "feature/governance-* (governance & explainability features)\n" + "feature/security-* (security & audit features)\n" + "feature/reports-* (LLM report generation)\n" + "fix/governance-* (bug fixes)" + ) + pdf.body_text( + "All PRs go to the develop branch. Tag @edoh-Onuh for ML architecture reviews, " + "Olufemi for API integration, and @franchaise for analytics alignment." + ) + pdf.ln(3) + + pdf.section_title("Your Key Collaborators") + pdf.bullet("@edoh-Onuh (ML Lead) - His models are what you explain and audit. Coordinate on model architectures, checkpoint formats, and prediction outputs.") + pdf.bullet("Olufemi Taiwo (API Lead) - Your /api/explain and /api/anomalies endpoints extend his API. Align on schemas, auth, and rate limiting.") + pdf.bullet("@franchaise (Analytics Lead) - His carbon metrics feed your LLM impact reports. Coordinate on data contracts and report templates.") + pdf.bullet("@cutewizzy11 (Full-Stack) - Frontend visualisations of SHAP heatmaps and anomaly dashboards need his React expertise.") + + pdf.section_title("Your Code Pipeline") + pdf.body_text("Your pipeline covers explainability generation, bias evaluation, security scanning, and governance reporting.") + + pdf.subsection_title("Step 1: Environment Setup") + pdf.code_block( + "git clone https://github.com/Climate-Vision/ClimateVision.git\n" + "cd ClimateVision\n" + "pip install -r requirements.txt\n" + "pip install shap mlflow transformers torch\n" + "\n" + "# Verify dependencies\n" + "python -c \"import shap, transformers, torch; print('Governance stack ready')\"" + ) + + pdf.subsection_title("Step 2: Generate SHAP Explanations") + pdf.code_block( + "# Run SHAP explainability on a prediction mask\n" + "python - <<'EOF'\n" + "from climatevision.governance.explainability import explain_prediction\n" + "explanation = explain_prediction(\n" + " model_path='models/unet_deforestation.pth',\n" + " image_path='data/test/amazon_tile.tif',\n" + " analysis_type='deforestation'\n" + ")\n" + "print(f\"Top contributing bands: {explanation['top_bands']}\")\n" + "print(f\"Spatial attribution saved to: {explanation['heatmap_path']}\")\n" + "EOF" + ) + + pdf.subsection_title("Step 3: Run Bias Audit") + pdf.code_block( + "# Evaluate fairness across geographic regions\n" + "python - <<'EOF'\n" + "from climatevision.governance.bias_audit import run_bias_audit\n" + "report = run_bias_audit(\n" + " model_path='models/unet_deforestation.pth',\n" + " regions=['amazon', 'congo', 'southeast_asia'],\n" + " metric='equalized_odds'\n" + ")\n" + "print(f\"Fairness score: {report['score']:.3f}\")\n" + "print(f\"Disparity detected: {report['disparity_regions']}\")\n" + "EOF" + ) + + pdf.subsection_title("Step 4: Security Scan") + pdf.code_block( + "# Run OWASP-style scan on API endpoints\n" + "python scripts/security_scan.py --target http://localhost:8000\n" + "\n" + "# Output: security_report.json with findings and remediation" + ) + + pdf.subsection_title("Step 5: Generate LLM Impact Report") + pdf.code_block( + "# Generate natural-language report from prediction data\n" + "python - <<'EOF'\n" + "from climatevision.reports.llm_reporter import generate_impact_report\n" + "report = generate_impact_report(\n" + " run_id=12345,\n" + " region='amazon',\n" + " include_shap=True,\n" + " include_carbon=True\n" + ")\n" + "print(report['summary'])\n" + "# -> 'The model detected 1,247 hectares of deforestation with 94% confidence...'\n" + "EOF" + ) + + pdf.subsection_title("Step 6: Commit & Push Your Work") + pdf.code_block( + "# Switch to your git identity (create one if needed)\n" + "git config user.name 'Linda Oraegbunam'\n" + "git config user.email 'linda@placeholder.com'\n" + "\n" + "git checkout develop && git pull origin develop\n" + "git checkout -b feature/governance-shap-explainability\n" + "\n" + "git add src/climatevision/governance/\n" + "git add notebooks/06_explainability.ipynb\n" + "git commit -m \"feat(governance): add SHAP explainability for segmentation predictions\"\n" + "\n" + "git push origin feature/governance-shap-explainability" + ) + + pdf.output(os.path.join(OUTPUT_DIR, "Linda_Oraegbunam_Role.pdf")) + print("Created: Linda_Oraegbunam_Role.pdf")