v13.2.0
CF-phase typed primitives + sheet land, with infrastructure carries:
Python 3.14 across the board (CI install via astral-sh/setup-uv),
pyright 1.1.410, BX backlog #173 (Studio Session Start self-heals
missing base schema), and a release.yml waiter that no longer
self-foot-shoots when post-tag PLAN edits cancel CI on the tagged SHA.
Side-benefit from the CF.3 spike: the L2 fuzzer now exposes a public
FuzzPlan + random_l2_yaml_from_plan(plan) for purpose-built
high-density fixtures.
Headline impact:
- CF.X-infra typed primitives.
KPIValueThresholdBanding(amber_at, red_at)(3-band amber/red KPI states, construction-guarded
red_at > amber_at, 3-way mutex with the BK.2/BK.9 indicators);
CrossAppDrill(target_dashboard_id, target_sheet_id)(QS emit
returns None per the URL-param-no-control-sync defect — App2 wires
through normally). Both land incommon/tree/visuals.py/
common/tree/actions.pynext to their siblings. AWS QS amber-icon
enum quirk captured: onlyTRIANGLE/CHECKMARK/Xare accepted
byKPIVisualicon position (noEXCLAMATION_CIRCLE/WARNING/
ALERT— seedocs/reference/quicksight-quirks.md). - CF.0 — Studio plant picker robustness.
_pick_templatenow
scores templates by materializable-plant count instead of taking the
first alphabetical match; surfaces per-kind failure reasons in the
Apply danger banner so operators know WHY a kind didn't land
(previously: "0 plants applied", no context). - CF.1 — kv-sourced 3-state last-Apply banner. The Apply-result
banner persists across navigation (kv = source of truth, not
session state); reads green/amber/red from a single
__bv_last_apply__kv read. The 3-state pattern matches the
CF.X-infra KPI banding semantics. - CF.2 — Exec Program Health sheet. Single-row L1 violation
rollup driven byKPIValueThresholdBandingfrom the typed primitive;
inserted at Exec sheet index 1. Scope narrowed to L1-only after
design audit flagged that L1 + L2FT + Inv violation counts don't
cleanly sum (different denominator semantics). - CF.3 spike (preview) — heavy-density fuzz fixture lands at
tests/l2/heavy_density_v1.yaml(seed 42 / 100 rails / 30 transfer
templates / 12 chains) + measurement harness at
tests/l2/cf3_spike.py+ the iteration-state audit at
docs/audits/cf_3_diagram_spike.md. The harness drives the CF.3
diagram-density work; the docs audit is the operator-facing
cold-read loop's persistent state. Heavy L3 hits 139 990 crossings
vs 1 086 baseline at 116 ms layout — the legibility apocalypse is
measured, ready for CF.3.a→.f to land against. - Fuzzer API enhancement.
tests/l2/fuzz.pypromotes_FuzzPlan
→ publicFuzzPlan+ addsrandom_l2_yaml_from_plan(plan)as
companion torandom_l2_yaml(seed). The default-ranged
random_l2_yamldogfood-pool entry stays byte-stable; the new
function lets callers drive_build_instanceoutside the default
knob ranges — heavy-density stress fixtures, surgical reproductions,
deliberate edge-density configurations._build_instancesurvives
heavy density unmodified (no caps tripped at 100 rails / 30
templates / 12 chains). - Python 3.14 across the board.
requires-python = ">=3.14",
.python-versionpinned to 3.14, CI swapped fromactions/setup- python→astral-sh/setup-uv@v6(which pulls python-build-
standalone 3.14 even on self-hosted runners that ship 3.12). PEP 768
(sys.remote_exec), asyncio.timeout() overhead reductions, and
free-threaded mode now available. - Release pipeline rescue path (BX #251). The
wait-for-cigate
used to refuse-to-publish if a post-tag PLAN.md push cancelled CI
on the tag SHA (cancel-in-progress concurrency). New behavior: when
CI on tag SHA iscancelled, the waiter checks if a descendant on
main has green CI AND the descendant's diff vs tag touches ONLY
doc/plan paths (PLAN.md, PLAN_ARCHIVE.md, RELEASE_NOTES.md,
README.md, CHANGELOG.md, LICENSE*, SPEC.md, docs/*.{md,rst,txt,
svg,png,jpg,jpeg,gif,webp,css}) — then the descendant's green CI
provably validates the tag's code surface, accept. All other
cancelled cases still refuse. Adversarially reviewed; tight regex
anchors prevent path-traversal-shape bypasses
(LICENSE[._-][^/]*notLICENSE.*). - BX #173 — Studio Session Start self-heal. When operator hits
Session Start on a virgin DuckDB (no base schema yet), step_2_wipe
now probes viaSELECT * FROM <prefix>_transactions WHERE 1=0,
catches the catalog error, and emits the base schema before
proceeding. Previously: silent no-op + Studio crash on next page. - pyright 1.1.410 (was 1.1.409); mkdocs 1.6.3 via uv pin.
- 5 small CF audit wins from v13.1.1 design review (3e0c1e1):
L2FT Multi-Leg Flow Sankey items_limit=30; bv-families pb-24 fix
for Apply-bar overlap; Investigation "trust the data" copy dropped;
audit text typo fixes.
Migration
- Python 3.14 is now required. Operators on 3.13 will see
pip install recon-gen==13.2.0refuse.uv(recommended) pulls the
python-build-standalone 3.14 on-demand;pyenvuserspyenv install 3.14first. - No API breaking changes on the production surface. The four
bundled dashboards + CLI shape (schema apply/data apply/
json apply/audit apply/studio/dashboards) are
unchanged. - Test API enhancement (non-breaking).
tests.l2.fuzznow exports
FuzzPlan(was_FuzzPlan) + newrandom_l2_yaml_from_plan(plan).
Existingrandom_l2_yaml(seed)callers unchanged.
CI / pipeline
actions/setup-python@v6removed fromci.yml/pages.yml/
release.yml; replaced byastral-sh/setup-uv@v6with
python-version: "3.14". Pulls python-build-standalone on first
invocation; cached thereafter viaenable-cache: true.release.yml::docs-portable-installnow usesuv build --wheel
(wasuv pip install --system build && python -m build— the
--systemflag tried to write to the runner's nonexistent 3.14
system install).release.yml::wait-for-ciadds the rescue path described above
plus pagination ceiling checks (refuse if compare truncated >250
commits or ≥300 files — can't fully verify).