Promote 0.12.0-dev to main - #64
Conversation
…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.
# Conflicts: # pyproject.toml
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.
…rts, workspace-member Makefile profile
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.
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.
…e-commit, make, docker)
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>
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
Summary
Test plan
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.tomlforuv(and excludes the standaloneuvcycle) and adopts theflext_core.mvalidation facade.New Features
Bug Fixes
pyproject.tomlsouvaccepts it; exclude the standaloneuvdependency cycle.flext_core.m; correct@computed_fieldusage, regenerate lazy init maps, and annotate thepfacade alias to restore typed generics.Written for commit 6c2a1c3. Summary will update on new commits.