#236: Airflow test harness + live e2e DAG + ops docs + example DAGs - #246
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughCloses Airflow epic ChangesAirflow Epic
Sequence Diagram(s)sequenceDiagram
participant pytest as test_e2e_generate_operator
participant driver as _e2e_generate_driver
participant airflow as dag.test()
participant op as SignalForgeGenerateOperator
participant bq as BigQuery
pytest->>pytest: skip if Airflow missing or env vars absent
pytest->>pytest: copy fixture to tmp_path and isolate AIRFLOW_HOME
pytest->>pytest: migrate DB and rewrite profiles.yml
pytest->>driver: subprocess.run with project_dir arg
driver->>airflow: DAG sf_e2e_generate .test()
airflow->>op: execute write=False on_flagged=succeed
op->>bq: query stg_bikeshare_trips
op-->>airflow: xcom_push kept/kept_uncertain/dropped/flagged
airflow-->>driver: task instance state
driver-->>pytest: stdout SF_E2E_RESULT JSON with state and xcom
pytest->>pytest: assert state==success and dropped>=1
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related issues
Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
Comment |
…gnalforge_nightly_drift
…ghtly_drift rename (orchestrator)
…e DAG + parse/template tests
…pass in airflow-ops.md
…g.test() on Austin fixture
…ation (subprocess driver)
…-closer + dag.test() AIRFLOW_HOME lesson
There was a problem hiding this comment.
Pull request overview
This PR closes out Airflow epic #228’s final “test+docs” child (#236) by adding a canonical gated live E2E that runs a real SignalForgeGenerateOperator via dag.test(), extending example DAG coverage (rename drift example + add post-dbt-build prune example), and updating ops/docs surfaces to reflect the completed integration.
Changes:
- Added a gated live E2E Airflow test that runs an inline DAG through
dag.test()in a subprocess with an isolatedAIRFLOW_HOME+ migrated metadata DB. - Added/updated example DAGs (
signalforge_nightly_driftrename + newsignalforge_after_dbt_build) and expanded DAG-parse + templated-field render tests. - Updated docs/plan/README/CHANGELOG/SKILL pointers to reflect the shipped Airflow integration and managed-runtime caveats.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/airflow/test_e2e_generate_operator.py | New gated live E2E test driving SignalForgeGenerateOperator via dag.test() |
| tests/airflow/_e2e_generate_driver.py | Subprocess driver to run dag.test() under isolated AIRFLOW_HOME |
| tests/airflow/test_dag_parse.py | Adds parse + render_template_fields coverage for the new/renamed example DAGs |
| examples/airflow/signalforge_after_dbt_build.py | New post-dbt-build prune-existing example DAG |
| examples/airflow/signalforge_nightly_drift.py | Renames drift monitor DAG id to signalforge_nightly_drift |
| docs/airflow-ops.md | Adds managed-runtime (“documented, not certified”) guidance + updates drift DAG references |
| src/signalforge/skills/signalforge/SKILL.md | Adds an Airflow pointer section for scheduled runs |
| README.md | Rewords the v0.7 roadmap row to reflect the landed Airflow integration |
| CHANGELOG.md | Adds #236 rollup entries (rename + epic closeout) |
| plans/super/236-airflow-e2e-docs.md | Adds the detailed super-plan document for #236 |
| .claude/rules/airflow-integration.md | Updates rules to reflect the new epic-closer patterns and renamed DAG |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…ing accuracy, quote bash path)
PR Review SummaryAddressed the Copilot review. All fixes in Fixed (3 items)
False Positives (2 items)
Validation after fixes: default suite 4119 passed, pyright 0 errors; gated airflow suite 77 passed / 1 skipped (the live e2e self-skips without creds) vs real Airflow 2.10.4. |
Summary
Super plan for #236 — the closing test+docs child of Airflow epic #228.
Phase: detailing (awaiting approval)
Stories: 6 implementation + Quality Gate + Patterns & Memory
Decisions: 6 captured (DEC-001 … DEC-006)
Headline finding
~80% of #236's acceptance is already shipped by #229–#235 (subpackage, operators ×3, hook, drift, 877-line ops doc, 16-file gated test suite, CI airflow job, MkDocs nav). The plan is scoped to net-new gaps only (DEC-004) — no re-doing shipped work.
Net-new work
SignalForgeGenerateOperator+dag.test()(tmpAIRFLOW_HOME+airflow db migrate) on the Austin bikeshare fixture; asserts XCom tier counts + ≥1 always-passes drop (DEC-001).drift_monitor→nightly_drift; addsignalforge_after_dbt_build.py(DEC-002).Architecture review
One blocker resolved:
dag.test()needs an initialized metadata DB → DEC-001 setsAIRFLOW_HOME+airflow db migrate. Rename blast-radius, packaging, docs-coherence all PASS.Load-bearing constraints baked in
.claude/rules/airflow-integration.mdedits are orchestrator-only (workers can't write.claude/).airflowtests are deselected in the default suite → workers validate offline; orchestrator certifies against.venv-airflowbefore close (the test+docs: fakesnow harness + FakeSnowflakeClient + gated live e2e (TPCH_SF1) + ops docs #124 live-debugging-pass budget).Plan document
See
plans/super/236-airflow-e2e-docs.md.Next steps
Summary by CodeRabbit
Release Notes
New Features
dbt buildpruning.Changed
Documentation
Tests