Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
efaa0c6
docs(ops): document constructor params on node-facing sources/ops
Gearlux May 29, 2026
7039333
feat: Flux.from_ops_yaml + role-split discovery categories + field pr…
Gearlux May 29, 2026
55535fa
feat(categories): tag concrete ops category=op; FilterOp/WrappedOp ->…
Gearlux May 30, 2026
1a2f1a5
Enhance tests for DataFlux with new target operations and type specif…
Gearlux May 31, 2026
91c0335
feat: make all @configurable classes lazy + zero-arg; ops/sources/typ…
Gearlux May 31, 2026
31aba22
feat: add NormalizeToUint8Op — generic value→uint8 op decoupled from …
Gearlux Jun 1, 2026
f2ae6ad
feat: add Enable and SampleSinkOp compose ops
Gearlux Jun 1, 2026
b874aa9
feat: add LabelMap — fittable class-name <-> id map
Gearlux Jun 2, 2026
018f6b5
feat: widen Sample.metadata to dict|list[dict] with .meta/.batch_meta…
Gearlux Jun 2, 2026
5187929
feat: detection target ops + ToTensorOp mode + shared bbox helper
Gearlux Jun 4, 2026
d60307e
feat: add RandomApply — Bernoulli gate op in dataflux.ops.compose
Jun 9, 2026
4f79e10
fix: make ThresholdOp robust against None and blank-string bounds
Jun 9, 2026
2968a68
feat: Add TransformChain op for sequentially applying a list of opera…
Jun 11, 2026
c848e1f
feat: add ConfigureOp and FormulaOp to public ops surface; fix mypy u…
Jun 11, 2026
08c9010
feat: FFT/window ops, image text+histogram helpers, CaptureOutputOp; …
Jun 16, 2026
43f703d
feat: add DropMetadataOp + PrintSampleOp; UnstashOps gain remove para…
Jun 18, 2026
e1fc419
feat: add confusion matrix payload functions for FluxStudio viewer; i…
Jun 20, 2026
9a568b4
chore: depend on logflow-ml>=0.2.0 (log-flow dist renamed for PyPI)
Gearlux Jul 5, 2026
06ebae5
chore: migrate logflow -> loggair (complete rename)
Gearlux Jul 6, 2026
6ed14b3
chore: run GitHub CI push trigger on main only; replace committed .vs…
Gearlux Jul 14, 2026
9145570
feat: rename to sampleflux + graph execution model, multi-type engine…
Gearlux Jul 18, 2026
2afd0b9
chore: re-scaffold Jenkinsfiles + CI from current aisland templates
Gearlux Jul 18, 2026
4118937
feat: modality-neutral engine — move signal-domain code to waivefront…
Gearlux Jul 19, 2026
fb4ace6
feat: augmentation ops — albumentations/torchvision adapters + genera…
Gearlux Jul 19, 2026
6c10eef
chore: mypy conformance for the generated augmentation-op families
Gearlux Jul 20, 2026
d738eb6
docs: cross-link architecture decision records from user docs; expand…
Gearlux Jul 22, 2026
ccbbd42
feat: typed-bag data model (TypedSample) — carrier, transforms, stora…
Gearlux Jul 22, 2026
cc8c3f3
feat(sampleflux): typed-native ops — ConvertToImage/Threshold/Connect…
Gearlux Jul 22, 2026
15fec48
feat(sampleflux): typed target/tensor ops — ToTensor + Encode/Decode/…
Gearlux Jul 22, 2026
25f4803
feat(sampleflux): typed detection target ops — CocoToTorchVisionDetec…
Gearlux Jul 23, 2026
ae15b70
feat(sampleflux)!: HuggingFaceSource yields TypedSample (non-additive)
Gearlux Jul 23, 2026
d22eddb
feat: runnable protocol + workflow/processing + run CLI + entrypoint …
Gearlux Jul 23, 2026
cdbe0f4
docs: add runnable-protocol / entrypoint / sampleflux-run mandate
Gearlux Jul 23, 2026
41be4bc
refactor(sampleflux)!: Stage 7 — TypedSample becomes THE Sample; purg…
Gearlux Jul 23, 2026
60cf785
fix(sampleflux): resolve generated-op annotations to real objects (to…
Gearlux Jul 23, 2026
8d355f5
docs: finish typed-bag purge — rewrite mandates/docs to typed-only, d…
Gearlux Jul 23, 2026
5f093ec
docs: *Op→* op-rename sweep (ops dropped the Op suffix in the typed m…
Gearlux Jul 24, 2026
08f0655
docs: point op docstrings at sampleflux.processing / sampleflux run (…
Gearlux Jul 24, 2026
159f980
docs: NormalizeToUint8Op class was purged — document the surviving no…
Gearlux Jul 24, 2026
88ed71f
feat!: the record data model — plain-dict records, type-dispatched op…
Gearlux Jul 25, 2026
575856d
feat: record-model review hardening — open op-family registry, live-t…
Gearlux Jul 26, 2026
8ac08f4
docs: project-owned backlog + current-state section
Gearlux Jul 26, 2026
854d98b
refactor!: rename sampleflux -> recordstream and Flux -> Stream
Gearlux Jul 27, 2026
7ad371b
refactor(enable)!: make the toggle a declared `enabled` parameter
Gearlux Jul 27, 2026
1f5ed2f
chore(ci): regenerate CI scaffolds for the PyPI-sourced loggair + con…
Gearlux Jul 28, 2026
565a7fe
chore(ci): regenerate — Jenkinsfile.local no longer reads project sou…
Gearlux Jul 28, 2026
55e1ead
chore(ci): regenerate scaffolds for the local-sourced confluid
Gearlux Jul 29, 2026
8410df5
feat: MultiLabel item, the collate read-back, and broadcast-correct `…
Gearlux Jul 29, 2026
919a97d
feat(batch): add multi_hot and a dtype parameter, both framework-neutral
Gearlux Jul 29, 2026
41e5b2e
feat(labels): LabelMap.encode wraps a source in one call
Gearlux Jul 29, 2026
ba53812
docs(tasks): file two traps found while wiring a consumer's config
Gearlux Jul 29, 2026
ccf4d20
feat(runnable): dispatch run() through the @entrypoint markers
Gearlux Jul 29, 2026
6484997
refactor(runnable)!: name the autograd flag for what it decides
Gearlux Jul 29, 2026
a64bd6a
feat: own the model boundary — prediction contracts, sinks, dataset n…
Gearlux Jul 29, 2026
39eca67
feat(labels): the class vocabulary rides the encoded data, and is nam…
Gearlux Jul 29, 2026
d74aa07
feat(projection): materialize a deferred source in project()
Gearlux Jul 29, 2026
41bcdbd
chore: link CLAUDE.md and GEMINI.md to AGENTS.md
Gearlux Jul 29, 2026
57d49ca
feat(core): ensure_record_dataset materializes a deferred source
Gearlux Jul 29, 2026
a42c0b5
refactor!: one execution model — the step graph; delete the lowering …
Gearlux Jul 30, 2026
617fb9b
chore: regenerate Jenkinsfile.local — guard on pyproject.toml, not th…
Gearlux Jul 30, 2026
d9d6270
feat(deps): make torch an optional extra; the core engine is numpy
Gearlux Jul 30, 2026
61f7f15
chore(tests): type-ignore the deliberately invalid class_names call
Gearlux Jul 30, 2026
8d71d3d
chore(ci): regenerate pipelines with the framework extras
Gearlux Jul 30, 2026
c4e3638
feat: recordstream.keras — the KERAS_BACKEND boundary and the RecordS…
Gearlux Jul 30, 2026
564ecac
fix: match torch 2.13's reworded int32 target error
Gearlux Jul 31, 2026
4693bc3
refactor: split core, flow and sources into packages
Gearlux Aug 1, 2026
5bf95b9
docs(sources): spell the canonical Stream path in DatasetSplit's YAML…
Gearlux Aug 1, 2026
b3bbade
docs(architecture): drop the deleted context modules from the overvie…
Gearlux Aug 1, 2026
d32f34c
docs: clarify the runnable-protocol mandate in AGENTS.md
Gearlux Aug 1, 2026
f884d23
feat(sources): a source can name the data it reads
Gearlux Aug 2, 2026
21c5e6f
feat(ops): ConvertToMask — an array to class-id Mask
Gearlux Aug 2, 2026
cac61d9
feat(projection): first_value — one peek at a column
Gearlux Aug 2, 2026
91ab642
fix(sources): close the two independent fork hazards on the DataLoade…
Gearlux Aug 3, 2026
c388e02
chore(tasks): drop two duplicate backlog entries
Gearlux Aug 3, 2026
42ff079
refactor: follow the marainer -> matrainer rename
Gearlux Aug 3, 2026
013239f
test(docs): check that documentation links resolve, and fix the one d…
Gearlux Aug 4, 2026
b9321b2
feat: selectable batch shape, the geometry-desync warning, and the re…
Gearlux Aug 6, 2026
dadf0a2
feat: trainer-base data helpers — per_record_predictions, prepare_rec…
Gearlux Aug 7, 2026
9d8426a
docs: use namespaced HuggingFace repo ids (ylecun/mnist) in the sourc…
Gearlux Aug 8, 2026
5ae6174
chore: gitignore runs/ — the one workspace-wide run-output root
Gearlux Aug 10, 2026
0dd6725
feat!: Regions is now Boxes — pixel-only, half-open xyxy
Gearlux Aug 10, 2026
225cb87
fix: view sources answer a still-deferred source: marker with Stream'…
Gearlux Aug 10, 2026
799ed1f
feat: resolve_entry/resolve_item — the one field-or-first record-key …
Gearlux Aug 10, 2026
117025b
feat: public read_record_group with partial payload slices
Gearlux Aug 10, 2026
75f5e33
refactor: the target ops adopt resolve_item where it genuinely applies
Gearlux Aug 10, 2026
aad40aa
fix: the deferred-source guidance no longer tells users to add parens
Gearlux Aug 11, 2026
ae609d4
refactor!: rename confluid's deprecated aliases to their canonical names
Gearlux Aug 12, 2026
621f805
docs: DatasetSplit views are selected with split=, not read by attrib…
Gearlux Aug 17, 2026
021a194
chore: migrate to confluid load(until=…) — materialize/resolve/flow= …
Gearlux Aug 18, 2026
36c7d52
chore(ci): install loggair from git now that its source is local
Gearlux Aug 22, 2026
0e81301
feat(loaders): let `loader_slots` take an explicit `persistent_worker…
Gearlux Aug 24, 2026
ded2bbb
chore: ignore prefixed junit reports (*test-report.xml)
Gearlux Aug 24, 2026
46131a4
feat: dataset_uri never builds a marker whose class cannot answer
Gearlux Aug 24, 2026
f2a77f2
feat: ModelPredict — inference as a pipeline op
Gearlux Aug 24, 2026
ea6561a
chore(ci): loggair resolves from PyPI — drop the GitHub pre-install
Gearlux Aug 24, 2026
ad590bb
chore(ci): confluid resolves from PyPI — drop the GitHub pre-install
Gearlux Aug 24, 2026
d37964f
chore(ci): liquifai resolves from PyPI — drop the GitHub pre-install
Gearlux Aug 24, 2026
c972a38
chore: prepare the 0.1.0a1 release — landing-page metadata, real floo…
Gearlux Aug 25, 2026
b216ca7
chore: tag-triggered PyPI release for 0.1.0a1
Gearlux Aug 25, 2026
d758a2b
fix(ci): recordstream's own mypy config was missing three optional im…
Gearlux Aug 25, 2026
fbe04d8
fix(ci): matplotlib joins the dev extra so the colormap path is tested
Gearlux Aug 25, 2026
fd344a6
fix(ci): DATA_ROOT is a cache preference, not a notebook requirement
Gearlux Aug 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .coveragerc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[run]
source = dataflux
source = recordstream
omit =
*/tests/*
*/examples/*
Expand Down
79 changes: 18 additions & 61 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# =========================================================================
# AUTO-GENERATED FILE — DO NOT EDIT BY HAND
# Generated by: aisland jenkins scaffold --project dataflux
# Generated by: aisland jenkins scaffold recordstream
# Source template: aisland/services/jenkins.py (JenkinsService.scaffold_pipelines)
# To regenerate: aisland jenkins scaffold --project dataflux --force
# To regenerate: aisland jenkins scaffold recordstream --force
# =========================================================================
name: Dataflux CI
name: Recordstream CI

on:
push:
branches: [ main, dev/main ]
branches: [ main ]
pull_request:
branches: [ main ]

Expand All @@ -18,15 +18,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Mint GitHub App token for private Gearlux deps
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.GEARLUX_APP_ID }}
private-key: ${{ secrets.GEARLUX_APP_PRIVATE_KEY }}
owner: Gearlux
- name: Configure git auth for Gearlux
run: git config --global url."https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/".insteadOf "https://github.com/"
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
Expand All @@ -36,11 +27,7 @@ jobs:
- name: Install dependencies
run: |

# Internal Gearlux dependencies — installed FIRST with --no-deps so
# `-e .[dev]` below finds them pre-satisfied instead of hitting PyPI.
uv pip install --system --no-deps git+https://github.com/Gearlux/log-flow.git@main
uv pip install --system --no-deps git+https://github.com/Gearlux/confluid.git@main
uv pip install --system -e ".[dev]"
uv pip install --system -e ".[dev,torch,keras]"
- name: Run Isort
run: isort --check-only .
- name: Run Black
Expand All @@ -56,15 +43,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Mint GitHub App token for private Gearlux deps
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.GEARLUX_APP_ID }}
private-key: ${{ secrets.GEARLUX_APP_PRIVATE_KEY }}
owner: Gearlux
- name: Configure git auth for Gearlux
run: git config --global url."https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/".insteadOf "https://github.com/"
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
Expand All @@ -74,15 +52,11 @@ jobs:
- name: Install dependencies
run: |

# Internal Gearlux dependencies — installed FIRST with --no-deps so
# `-e .[dev]` below finds them pre-satisfied instead of hitting PyPI.
uv pip install --system --no-deps git+https://github.com/Gearlux/log-flow.git@main
uv pip install --system --no-deps git+https://github.com/Gearlux/confluid.git@main
uv pip install --system -e ".[dev]"
uv pip install --system -e ".[dev,torch,keras]"
- name: Run Tests
run: |
if [ -d tests ] && find tests -name '*.py' | grep -q .; then
pytest tests --junitxml=test-report.xml --cov=dataflux --cov-report=xml --cov-report=term
pytest tests --junitxml=test-report.xml --cov=recordstream --cov-report=xml --cov-report=term
else
echo "No tests found. Skipping."
fi
Expand All @@ -99,15 +73,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Mint GitHub App token for private Gearlux deps
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.GEARLUX_APP_ID }}
private-key: ${{ secrets.GEARLUX_APP_PRIVATE_KEY }}
owner: Gearlux
- name: Configure git auth for Gearlux
run: git config --global url."https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/".insteadOf "https://github.com/"
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
Expand All @@ -117,11 +82,7 @@ jobs:
- name: Install dependencies
run: |

# Internal Gearlux dependencies — installed FIRST with --no-deps so
# `-e .[dev]` below finds them pre-satisfied instead of hitting PyPI.
uv pip install --system --no-deps git+https://github.com/Gearlux/log-flow.git@main
uv pip install --system --no-deps git+https://github.com/Gearlux/confluid.git@main
uv pip install --system -e ".[dev]"
uv pip install --system -e ".[dev,torch,keras]"
- name: Run Examples
run: |
for f in examples/*.py; do
Expand All @@ -130,22 +91,22 @@ jobs:
python3 "$f"
fi
done
# Directory examples opt in by shipping a run.py entry point;
# network-dependent / install-only example apps ship no run.py
# and are skipped by construction.
for f in examples/*/run.py; do
if [ -f "$f" ]; then
echo "Verifying $f..."
python3 "$f"
fi
done

verify-notebooks:
name: Verify Notebooks
needs: [unit-tests]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Mint GitHub App token for private Gearlux deps
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.GEARLUX_APP_ID }}
private-key: ${{ secrets.GEARLUX_APP_PRIVATE_KEY }}
owner: Gearlux
- name: Configure git auth for Gearlux
run: git config --global url."https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/".insteadOf "https://github.com/"
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
Expand All @@ -155,11 +116,7 @@ jobs:
- name: Install dependencies
run: |

# Internal Gearlux dependencies — installed FIRST with --no-deps so
# `-e .[dev]` below finds them pre-satisfied instead of hitting PyPI.
uv pip install --system --no-deps git+https://github.com/Gearlux/log-flow.git@main
uv pip install --system --no-deps git+https://github.com/Gearlux/confluid.git@main
uv pip install --system -e ".[dev]"
uv pip install --system -e ".[dev,torch,keras]"
# Notebook-only dependencies live in the optional `[notebook]` extra
# when a project ships notebooks; absence is not an error.
uv pip install --system -e ".[notebook]" 2>/dev/null || echo "No [notebook] extras declared; continuing with defaults."
Expand Down
101 changes: 101 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# =========================================================================
# HAND-WRITTEN workflow — NOT generated by `aisland jenkins scaffold`.
# (ci.yml / Jenkinsfile are generated; this release pipeline is separate so
# regeneration never clobbers it.)
#
# Publishes the `recordstream` distribution to PyPI when a version tag is pushed:
#
# git tag v0.1.0a1 && git push origin v0.1.0a1
#
# Uses PyPI Trusted Publishing (OIDC, no stored API token). One-time setup on
# https://pypi.org/manage/account/publishing/ — add a "pending publisher":
# PyPI project name: recordstream
# Owner: Gearlux
# Repository: recordstream
# Workflow name: release.yml
# Environment: pypi
#
# Publish ORDER: loggair -> confluid -> liquifai are all on PyPI already, and
# this package declares floors on all three, so it publishes after them. The
# visual-editor package declares `recordstream>=0.1.0a1`, so it publishes after
# THIS one.
# =========================================================================
name: Release to PyPI

on:
push:
tags: ["v*"]

jobs:
build:
name: Build & verify distribution
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install packaging toolchain
run: python -m pip install build twine
- name: Guard - tag matches pyproject version
run: |
PKG_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
TAG_VERSION="${GITHUB_REF_NAME#v}"
if [ "$PKG_VERSION" != "$TAG_VERSION" ]; then
echo "::error::Tag v$TAG_VERSION does not match pyproject version $PKG_VERSION"
exit 1
fi
- name: Build sdist + wheel
run: python -m build
- name: Check package metadata
run: python -m twine check --strict dist/*
- name: Smoke-test the built wheel in a clean venv
# Runs from /tmp: with the repo root as cwd, `import recordstream` would find
# the SOURCE tree (cwd shadows site-packages) and silently test the repo
# instead of the wheel. This is the package-shadowing trap the workspace
# mandates warn about — the repo directory and the package share a name.
run: |
python -m venv /tmp/smoke
/tmp/smoke/bin/pip install --quiet dist/*.whl
cd /tmp
/tmp/smoke/bin/python - <<'EOF'
from importlib.metadata import version

import numpy as np

from recordstream import Image, Label, Stream, as_transform

# A record is a plain dict of typed values; an op is type-dispatched. Running
# one record through a Stream exercises the engine, the item types and the
# op-family dispatch — the surfaces a broken wheel would take down.
records = [{"image": Image(np.zeros((4, 4, 3), dtype=np.float32)),
"class": Label("a", classes=["a", "b"])}]
stream = Stream(source=records, ops=[as_transform(lambda d: d + 1.0, handles=(Image,))])

out = list(stream)
assert len(out) == 1, out
assert float(out[0]["image"].max()) == 1.0
assert out[0]["class"].value == "a"
assert len(stream) == 1 and stream[0]["class"].value == "a" # map-style protocol
print("wheel smoke-test OK, version:", version("recordstream"))
EOF
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/

publish:
name: Publish to PyPI
needs: [build]
runs-on: ubuntu-latest
environment: pypi
permissions:
id-token: write # required for PyPI Trusted Publishing (OIDC)
steps:
- uses: actions/download-artifact@v4
with:
name: dist
path: dist/
- name: Publish
uses: pypa/gh-action-pypi-publish@release/v1
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,13 @@ dir_store/
flake8.txt
mypy.txt
coverage.xml
test-report.xml
*test-report.xml
coverage/
/pyrightconfig.json

# Run output — every run (training, evaluation, prediction, sweep cell) writes here.
# ONE ignored root per project: matrainer trackers default to `save_dir: ./runs`, and
# Lightning checkpoints follow the tracker's save_dir, so a whole run lands under one
# directory instead of scattering run-named trees into the repository root.
# See the workspace AGENTS.md mandate "Run Output Lands In A Gitignored `runs/`".
runs/
26 changes: 0 additions & 26 deletions .vscode/settings.json

This file was deleted.

Loading
Loading