Implementation status — 2026-08-03
Implemented and locally validated in 78615c3 on dataflow/fix-dataflow-install-timeout. Review: fork draft PR #1; upstream comparison. GitHub rejected creation of the upstream PR for this account, so the implementation and validation evidence are recorded in this issue comment.
Summary
The DataFlow PR & Discussion Dataset Builder workflow needs two related fixes:
- its pre-agent DataFlow installation is unbounded and can consume GitHub Actions' six-hour job limit; and
- after a successful installation, the current pipeline does not use DataFlow because its imports and storage calls target an obsolete API.
The workflow can currently produce a dataset only through its pure-Python fallback. A successful package installation alone is therefore not sufficient.
Workflow source: https://github.com/github/gh-aw/blob/main/.github/workflows/dataflow-pr-discussion-dataset.md
Latest affected scheduled run: https://github.com/github/gh-aw/actions/runs/30602686038
Public-run evidence and failure classification
Primary scheduled-run blocker: unbounded dependency installation
In scheduled run #13:
- activation, checkout, experiment-state push, and discussion fetching succeeded;
Install DataFlow began at approximately 03:54 UTC;
pip install --quiet open-dataflow repeatedly timed out while resolving/downloading packages including typer-slim, mpmath, and presidio-analyzer;
- GitHub cancelled the operation at approximately 09:53 UTC; and
- PR fetching, Copilot CLI setup, and agent execution were skipped.
Scheduled runs #4–#8, #10, #11, and #13 show the same approximately six-hour cancellation pattern. The workflow's timeout-minutes: 30 is compiled onto the later agent execution step and does not bound the earlier custom install step.
Earlier runs produced artifacts but still did not complete
Run #2 later failed while initializing memory/dataflow-dataset, because the repository requires signed commits. The memory branch is still absent. This is an independent finalization failure after data production.
Local reproduction against the current package
The workflow's exact pipeline was tested locally with CPython 3.12.7 and open-dataflow==1.0.10.
Installation result
Using uv:
- resolution completed in approximately 2.7 seconds;
- a full cached installation completed in approximately 20 seconds;
- 219 packages were installed; and
- the virtual environment occupied approximately 1.8 GB.
The dependency graph includes Torch, torchvision, torchaudio, Transformers, Gradio, Google Cloud clients, Presidio, spaCy, and other packages unrelated to this workflow's narrow filtering/deduplication use case. This confirms both that uv materially improves resolution and that the installation must still have an explicit timeout and fallback.
Exact current pipeline result
The package imports successfully, but the workflow immediately executes:
storage = FileStorage(first_entry_file_name=INPUT)
len(storage)
FileStorage in 1.0.10 does not implement __len__, producing:
TypeError: object of type 'FileStorage' has no len()
The exception is caught by the workflow and sets storage = None, so every successfully installed 1.0.10 run enters the pure-Python fallback before trying any DataFlow operator.
The referenced modules also no longer exist:
ModuleNotFoundError: No module named 'dataflow.operators.filter'
ModuleNotFoundError: No module named 'dataflow.operators.dedup'
FileStorage also has no save() or iteration API matching the current script's output path.
With a three-record fixture, the exact workflow code did produce one deduplicated output record, but reported:
{
"input_count": 3,
"after_length_filter": 2,
"after_alpha_filter": 2,
"after_dedup": 1,
"operators_used": ["fallback_python_pipeline"],
"fallback_mode": true
}
This verifies the fallback, not the DataFlow path.
Current DataFlow API smoke test
The corresponding current API is exposed from dataflow.operators.general_text:
CharNumberFilter
AlphaWordsFilter
MinHashDeduplicateFilter
HashDeduplicateFilter
A local smoke pipeline using FileStorage.read() plus CharNumberFilter, AlphaWordsFilter, and HashDeduplicateFilter completed successfully and reduced the same fixture from 3 → 2 → 2 → 1 records.
However, AlphaWordsFilter attempts to download NLTK punkt_tab during construction even with use_tokenizer=False. That hidden network operation must not be allowed to introduce another unbounded wait. Its semantics also measure alphabetic words, whereas the existing fallback measures alphabetic characters.
Root causes
The workflow combines several independent problems:
pip install open-dataflow is unbounded, unpinned, fatal, and runs before the documented fallback can be reached.
- The workflow targets obsolete DataFlow import paths and class names.
- It treats
FileStorage as a sized, iterable object with save(), which is not the current API.
- A current candidate operator performs an implicit NLTK network download.
- Reporting can imply that DataFlow processed the dataset even when only the fallback ran.
- The absent repo-memory branch cannot be initialized by an unsigned Actions commit under current repository rules.
Agentic implementation plan
- Modify
.github/workflows/dataflow-pr-discussion-dataset.md; do not edit the generated lock file manually.
- Preserve the current virtual-environment location, but replace the unbounded pip command with a bounded, pinned
uv installation:
- bound the
uv bootstrap separately;
- bound the DataFlow installation to no more than 20 minutes;
- configure explicit HTTP timeout/retry values;
- pin both installation tooling and
open-dataflow to reviewed versions; and
- make installation failure non-fatal so the existing fallback remains reachable.
- Validate more than
import dataflow. The install gate must smoke-test the exact storage and operator APIs selected by the pipeline.
- Update the pipeline for the selected current DataFlow version:
- count records through
FileStorage.step().read("dict") or DataFrames, not len(storage);
- import operators from
dataflow.operators.general_text;
- use current class names and signatures;
- advance storage steps deliberately after each operator; and
- materialize the final DataFrame/list to
dataset_clean.jsonl instead of calling the nonexistent storage.save().
- Preserve the current filtering contract:
- enforce both the existing 50-character minimum and 100,000-character maximum;
- preserve the 0.25 alphabetic-character-ratio threshold unless a semantic change is explicitly intended; and
- keep near-deduplication with an exact-hash fallback.
- Do not allow an implicit NLTK download. Either:
- retain the deterministic pure-Python alphabetic-character-ratio stage while using DataFlow for supported length/dedup stages; or
- provision and cache the required NLTK resource under its own timeout before constructing
AlphaWordsFilter.
- Treat fallback as a supported, observable mode rather than as DataFlow success:
- emit an Actions warning when installation or API validation fails;
- set
fallback_mode from actual execution;
- record only operators that really ran; and
- make the Discussion title/body distinguish
dataflow, mixed, and fallback execution modes.
- Resolve repo-memory finalization with a maintainer-approved choice:
- preferred: seed
memory/dataflow-dataset once with a signed commit; or
- remove repo-memory and its success criterion if trend memory is not needed for this experiment.
- Preserve the existing
caveman_mode experiment and its state. The install/API fix applies before variant execution and must not reset the experiment branch.
- Run
make recompile, review the generated lock file, and run the required strict compile and repository validation without manually triggering this scheduled workflow.
A representative bounded install shape is:
VENV=/tmp/gh-aw/python/venv
python3 -m venv "$VENV"
dataflow_ready=false
if timeout 5m "$VENV/bin/pip" install --quiet "uv==<reviewed-version>" &&
timeout 20m env UV_HTTP_TIMEOUT=60 UV_HTTP_RETRIES=3 \
"$VENV/bin/uv" pip install --python "$VENV/bin/python3" \
"open-dataflow==<validated-version>" &&
timeout 2m "$VENV/bin/python3" /path/to/exact_dataflow_api_smoke_test.py; then
dataflow_ready=true
else
echo "::warning::DataFlow installation or API validation failed; using the pure-Python fallback"
fi
The exact version pin should be validated on the repository's Ubuntu runner. open-dataflow==1.0.10 is a locally verified candidate, not proof of cross-platform runner compatibility.
Acceptance criteria
- No dependency installation, API import, or auxiliary download can occupy the job for six hours.
- A failed or unavailable DataFlow installation reaches the pure-Python fallback and records that mode honestly.
- A successful DataFlow-mode run executes at least one current DataFlow operator; merely importing the package is insufficient.
- The current pipeline no longer calls
len(storage), iterates FileStorage, or calls storage.save().
- The selected operator imports and signatures are covered by a small deterministic smoke test.
- No operator performs an unbounded runtime download, including NLTK resources.
- The 50–100,000 character bound, 0.25 alphabetic-character ratio, and deduplication behavior remain explicit and testable.
pipeline_stats.json and the Discussion report accurately distinguish DataFlow, mixed, and fallback execution.
- The workflow produces a non-empty
dataset_clean.jsonl artifact or fails with a specific data-processing error.
- Repo-memory finalization cannot turn an already-produced dataset into an ambiguous DataFlow failure.
- The next scheduled run completes within the intended timeout rather than being cancelled by GitHub Actions' six-hour limit.
caveman_mode experiment assignment and state remain intact.
Validation checklist
- Unit/smoke fixture: short text, duplicate text, low-alpha text, and valid text.
- Forced install failure: fallback completes and reports
fallback mode.
- Successful install: the API smoke gate and at least one DataFlow operator run.
- Output assertions: valid JSONL, expected record counts, deterministic mode/operator reporting.
make recompile and generated lock-file review.
gh aw compile dataflow-pr-discussion-dataset --strict.
make agent-report-progress and normal generated-shell/CI validation.
Implementation status — 2026-08-03
Implemented and locally validated in
78615c3ondataflow/fix-dataflow-install-timeout. Review: fork draft PR #1; upstream comparison. GitHub rejected creation of the upstream PR for this account, so the implementation and validation evidence are recorded in this issue comment.Summary
The
DataFlow PR & Discussion Dataset Builderworkflow needs two related fixes:The workflow can currently produce a dataset only through its pure-Python fallback. A successful package installation alone is therefore not sufficient.
Workflow source: https://github.com/github/gh-aw/blob/main/.github/workflows/dataflow-pr-discussion-dataset.md
Latest affected scheduled run: https://github.com/github/gh-aw/actions/runs/30602686038
Public-run evidence and failure classification
Primary scheduled-run blocker: unbounded dependency installation
In scheduled run #13:
Install DataFlowbegan at approximately 03:54 UTC;pip install --quiet open-dataflowrepeatedly timed out while resolving/downloading packages includingtyper-slim,mpmath, andpresidio-analyzer;Scheduled runs #4–#8, #10, #11, and #13 show the same approximately six-hour cancellation pattern. The workflow's
timeout-minutes: 30is compiled onto the later agent execution step and does not bound the earlier custom install step.Earlier runs produced artifacts but still did not complete
dataset_clean.jsonl: https://github.com/github/gh-aw/actions/runs/26617128352dataset_clean.jsonl: https://github.com/github/gh-aw/actions/runs/26994527432Run #2 later failed while initializing
memory/dataflow-dataset, because the repository requires signed commits. The memory branch is still absent. This is an independent finalization failure after data production.Local reproduction against the current package
The workflow's exact pipeline was tested locally with CPython 3.12.7 and
open-dataflow==1.0.10.Installation result
Using
uv:The dependency graph includes Torch, torchvision, torchaudio, Transformers, Gradio, Google Cloud clients, Presidio, spaCy, and other packages unrelated to this workflow's narrow filtering/deduplication use case. This confirms both that
uvmaterially improves resolution and that the installation must still have an explicit timeout and fallback.Exact current pipeline result
The package imports successfully, but the workflow immediately executes:
FileStoragein 1.0.10 does not implement__len__, producing:The exception is caught by the workflow and sets
storage = None, so every successfully installed 1.0.10 run enters the pure-Python fallback before trying any DataFlow operator.The referenced modules also no longer exist:
FileStoragealso has nosave()or iteration API matching the current script's output path.With a three-record fixture, the exact workflow code did produce one deduplicated output record, but reported:
{ "input_count": 3, "after_length_filter": 2, "after_alpha_filter": 2, "after_dedup": 1, "operators_used": ["fallback_python_pipeline"], "fallback_mode": true }This verifies the fallback, not the DataFlow path.
Current DataFlow API smoke test
The corresponding current API is exposed from
dataflow.operators.general_text:CharNumberFilterAlphaWordsFilterMinHashDeduplicateFilterHashDeduplicateFilterA local smoke pipeline using
FileStorage.read()plusCharNumberFilter,AlphaWordsFilter, andHashDeduplicateFiltercompleted successfully and reduced the same fixture from 3 → 2 → 2 → 1 records.However,
AlphaWordsFilterattempts to download NLTKpunkt_tabduring construction even withuse_tokenizer=False. That hidden network operation must not be allowed to introduce another unbounded wait. Its semantics also measure alphabetic words, whereas the existing fallback measures alphabetic characters.Root causes
The workflow combines several independent problems:
pip install open-dataflowis unbounded, unpinned, fatal, and runs before the documented fallback can be reached.FileStorageas a sized, iterable object withsave(), which is not the current API.Agentic implementation plan
.github/workflows/dataflow-pr-discussion-dataset.md; do not edit the generated lock file manually.uvinstallation:uvbootstrap separately;open-dataflowto reviewed versions; andimport dataflow. The install gate must smoke-test the exact storage and operator APIs selected by the pipeline.FileStorage.step().read("dict")or DataFrames, notlen(storage);dataflow.operators.general_text;dataset_clean.jsonlinstead of calling the nonexistentstorage.save().AlphaWordsFilter.fallback_modefrom actual execution;dataflow,mixed, andfallbackexecution modes.memory/dataflow-datasetonce with a signed commit; orcaveman_modeexperiment and its state. The install/API fix applies before variant execution and must not reset the experiment branch.make recompile, review the generated lock file, and run the required strict compile and repository validation without manually triggering this scheduled workflow.A representative bounded install shape is:
The exact version pin should be validated on the repository's Ubuntu runner.
open-dataflow==1.0.10is a locally verified candidate, not proof of cross-platform runner compatibility.Acceptance criteria
len(storage), iteratesFileStorage, or callsstorage.save().pipeline_stats.jsonand the Discussion report accurately distinguish DataFlow, mixed, and fallback execution.dataset_clean.jsonlartifact or fails with a specific data-processing error.caveman_modeexperiment assignment and state remain intact.Validation checklist
fallbackmode.make recompileand generated lock-file review.gh aw compile dataflow-pr-discussion-dataset --strict.make agent-report-progressand normal generated-shell/CI validation.