Skip to content

Promote 0.12.0-dev to main - #64

Merged
marlon-costa-dc merged 47 commits into
mainfrom
0.12.0-dev
Aug 3, 2026
Merged

marlon-costa-dc merged 47 commits into
mainfrom
0.12.0-dev

Conversation

@marlon-costa-dc

@marlon-costa-dc marlon-costa-dc commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Promote generated standalone uv dependency exclusions to main.

Test plan

  • Generated pyproject diff checked for whitespace errors.

Made with Cursor


Summary by cubic

Promotes 0.12.0-dev to main with a faster parallel pipeline engine, runtime hardening, and refreshed CI/build artifacts from flext‑infra. Also fixes pyproject.toml for uv (and excludes the standalone uv cycle) and adopts the flext_core.m validation facade.

  • New Features

    • Run independent pipeline stages in parallel; keeps declared order and fail_fast behavior.
    • Lock stdout writes to avoid interleaved output during parallel runs.
    • Add multi-distro CI matrix and clean-machine Docker images; regenerate Makefile/workflows from flext‑infra.
  • Bug Fixes

    • Fail closed when a stage raises; harden process execution and Windows Job tracking.
    • Fix pyproject.toml so uv accepts it; exclude the standalone uv dependency cycle.
    • Switch validation/errors to flext_core.m; correct @computed_field usage, regenerate lazy init maps, and annotate the p facade alias to restore typed generics.

Written for commit 6c2a1c3. Summary will update on new commits.

Review in cubic

Marlon Costa and others added 30 commits July 27, 2026 23:18
…ection

The pyproject.toml had project metadata (dependencies, description,
keywords, license, name, etc.) placed inside [dependency-groups],
making it invalid for PEP 735/621 and causing uv to reject the file.
Move those fields under the canonical [project] table.
Process-group runner hardening (mro-1v5l, mro-2s0p): unwrap started
process result, fail loud when stdout pipe is unavailable, exhaustive
match in typed extract resolution.
Apply canonical conform output: managed pyproject sections, CI
workflows, docker matrix, Makefile, mise, gitignore and editor settings
regenerate from the flext-infra SSOT. Brings the ruff per-file-ignores
policy for examples/ into this member (was root-only).
Managed surfaces (.envrc, .mise.toml, CI matrix, docker images, Makefile,
pyproject) regenerated by the current flext-infra conform SSOT and
adopted as-is: the generated header moved from the retired 'workspace
sync' owner to 'flext-infra codegen conform'.
A concurrent merge reintroduced the retired 'github:gastownhall/beads'
1.1.2 pin, whose binary only knows Dolt schema v53 and fails every
conform preflight against the shared v61 mro ledger. Regenerated from
the flext-infra SSOT (toolchain.beads: go module commit 423afdcb,
reported_version 1.1.0) instead of hand-editing the projection.
…otocols]

The unannotated rebinding  (mro-j47u) made Mypy
treat the facade as the class itself, so downstream class-subscript
annotations such as  degraded to Any in consumers
(e.g. cosmos-docgen warn_return_any failures at every  access).
Rename the flext_core facade import to  to avoid the redefinition
error and keep the alias intentionally annotated.

Relates-to: bd-1uub.5
fix(pipeline): fail closed when a check stage raises
O bloco TYPE_CHECKING declarava `p: type[FlextCliProtocols]` (anotacao de
variavel) em vez do alias de classe usado canonicamente pelo flext-core
(`FlextProtocols as p`). Sob anotacao de variavel o Mypy nao aceita
`p.Result[str]` como tipo valido; com `valid-type` suprimido no perfil
FLEXT o resultado degrada silenciosamente para Any, e todo consumidor que
retorna `.value` quebra em warn_return_any.

Alinha s/c/m/p/t/u ao padrao do flext-core.

Relates-to: bd-1uub.5
fix(typing): usa alias de classe nos facades lazy do TYPE_CHECKING
The engine resolved dependencies with TopologicalSorter but then flattened
the graph with static_order() and ran one stage at a time, so stages that
share no dependency edge were still serialized. make check spends its wall
clock on 15 gates (ruff, pyrefly, mypy, pyright, bandit, markdown, loc-cap,
abstraction-boundary, canonical-alias, runtime-census, namespace, layout,
tier-whitelist, smells, silent-failure) that declare zero depends_on
between them -- measured 227-370s, essentially the SUM of every gate
instead of the slowest one.

Walk the graph with prepare()/get_ready()/done() and run each ready wave
concurrently. A stage still starts only after every dependency completed,
and a strictly linear pipeline yields waves of width one, so the four
linear_pipeline consumers (codegen, release, flext-ldif, flext-meltano)
are behaviour-identical by construction.

Preserved semantics:
- fail_fast is wave-granular: the in-flight wave finishes, no later wave
  starts, and the remainder is flushed SKIPPED with the existing message.
  In-flight subprocesses cannot be un-run, and killing them risks partial
  writes; this yields strictly FEWER skipped gates than before, never more.
- results are reported in DECLARED stage order, never completion order:
  consumers select "the" failure with next(...) over that sequence.
- a node named by an edge but never declared as a stage is retired via
  done() so the graph still advances, matching the old skip.

output.py: guard emit_raw with a lock. It writes multi-line blocks to
stdout unbuffered from inside stage handlers, which now run on worker
threads; unguarded, two gates interleave mid-block and the report becomes
unreadable. structlog/logging handlers already lock internally.

Evidence (cwd=/home/marlonsc/flext/flext-cli):
  RED  (serial engine restored from HEAD):
    pytest -k 'run_concurrently or declared_order'
    2 failed, 2 passed in 25.30s -- threading.BrokenBarrierError,
    barrier never fills because stages never overlap (10.00s timeout).
  GREEN (wavefront):
    4 passed in 3.38s -- barrier test 10.00s -> 0.04s.
  REGRESSION:
    pytest tests/unit/test_pipeline.py -> 28 passed in 4.23s,
    including fail_fast, diamond_dependency, dependency_order, retry.
Marlon Costa and others added 17 commits August 2, 2026 11:09
pydantic.computed_field has no zero-argument overload, so `@m.computed_field()`
failed no-matching-overload under static analysis. The bare decorator is the
documented form.
Formatting only, no behavior change. Pipeline suite: 28 passed.
Regenerated stale managed projections (ci workflows, Dockerfiles,
Makefile, .gitignore, pyproject managed sections) to match current
flext-infra templates/config via make gen WHAT=all APPLY=Y.
Refs mro-xf56.
Remove stray blank line after # [MANAGED] section markers so
deps-modernize and codegen-conform agree on a single fixed point.
Refs mro-xf56.
The managed pyproject projection was missing the blank line the
canonical generator emits after each '# [MANAGED]' marker, so
'make gen WHAT=check' reported drift from a clean clone.

Regenerated through the canonical generator, never hand-edited;
a second generator run is byte-identical (idempotent fixed point).

Refs: mro-wkii.17.39
flext c9832249/81cc760ad inserted a blank line after each '# [MANAGED]'
marker. That was a regression: the canonical emitter appends the marker
immediately before its section (deps/phases/inject_comments.py:173-182,
out.append(marker) then out.append(line)) and _collapse_blank_lines only
removes duplicates -- it never inserts one. So the generator's fixed
point has NO blank line, and the committed projection permanently
disagreed with it, keeping 'make gen WHAT=check' red on 32 pyproject
files with no tree state able to satisfy it.

Reverted by running the canonical modernizer.conform_source over each
projection, never by hand.

Refs: mro-shxw
Drop the direct pydantic Field import from layer-0 settings and absorb the Makefile custom-WHAT projection.

Co-authored-by: Cursor <cursoragent@cursor.com>
…cutover

fix(settings): route flext-cli Field through m facade
Updated config models and validation utilities to utilize the flext_core.m facade instead of direct pydantic imports. This change enhances consistency across the codebase and aligns with the new architecture. Adjusted exception handling to reference m.ValidationError in multiple utility files.
Co-authored-by: Cursor <cursoragent@cursor.com>
@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c1844e3b-22fe-42a4-bf3f-ddc0fbecd5a6

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@marlon-costa-dc
marlon-costa-dc merged commit 47fb036 into main Aug 3, 2026
3 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant