v0.3.0 — 2026-06-24
Release Notes
Adds a renderable-fenced-block pipeline (d2/csv compile-checked in lint and rendered in
PDF), a per-repo change-set validation engine, consolidates shared Python helpers into a
_shared/ package, and extends yf-beads-init repair with native runtime/hook/remote
cleanup.
Renderable fenced blocks: d2 + csv (plan-017, #33 + #34 + #37)
_shared/renderable_fences.py— new canonical registry of renderable fenced-block
kinds (d2, csv) shared across the lint, PDF, and diagram skills.- yf-markdown-lint — new ML009 rule: d2 fenced blocks are compile-checked (caught
malformed diagram source at authoring time, not render time). - yf-markdown-pdf —
scripts/blocks.luarenders fenced blocks during the PDF pipeline
(d2 → embedded diagram, csv → table) with aglyph-fallback.texfor broad Unicode
coverage;--no-render-fencesopts out._shared/sync.pygains a Python→Lua emitter
that keepsblocks.luamirrored from the canonical registry (DRIFT-CHECK edges enforce it). - yf-diagram-authoring — embed/lift/inline round-trip between a
.d2source file and an
inline fenced block. - yf-research — new
record-epicsubcommand and the CLI-spec realignment that goes with it.
Helper consolidation + yf-beads-init native cleanup (plan-016, #15 + #39 + #36)
_shared/— two-helper vendoring sweep:manifest_update.py(whole-file, byte-identical
copies across five skills) andjson_extract.py(defensive JSON extractor, region-vendored
intoplan_manager.py+research_manager.py;json-getgains list int-indexing). New
DRIFT-CHECK edges andtest_sync.pycoverage. ZeroyfRust change for this epic.- yf-beads-init —
repair()native cleanup: untrack-runtime, content-guarded
remove-hook-shims, and a confirm-gated remove-remote (--remove-remote), wired into
preflight-converge (the read-only invariant is preserved). Rust tests + SKILL/SPEC docs. - audit — regression test pinning the
audit --json-outputjson.dumpsinvariant (bug
already absent; no production change).
New: yf-change-validation — per-repo change-set validation engine (plan-015, #27 + #25)
yf-change-validation— new skill that validates a change set against a per-repo,
operator-approvedCHANGE-VALIDATION.mdmanifest: declared check tiers (fast/full),
a changed-path → check-id trigger scope, and a signal fingerprint that detects when the
manifest itself has gone stale relative to the repo's real test/build surface.scripts/change_validation.py— the engine:infer(bootstrap a manifest by scanning
CI workflows,Cargo.toml,test_*.py, build configs),run(execute the tier or
the trigger-scoped affected subset for a changed path; fail-closed), andcheck-drift
(re-propose the manifest
when the signal fingerprint diverges). Self-maintaining: a stale manifest re-proposes
itself rather than silently passing.spec/{schema,engine,inference}.md+SPEC.md— the manifest schema, the
validate/trigger-scope engine, and the inference/bootstrap heuristics.templates/manifest.md— the seedCHANGE-VALIDATION.mdtemplate.protocols/CHANGE-VALIDATION-TRIGGER.md— always-loaded companion rule binding the
on-change trigger adescriptioncannot fire (silent no-op unless the repo has an
approvedCHANGE-VALIDATION.md).
- yf-plan — §6.1.5 layer (b) now delegates change-set validation to
yf-change-validationwhen an approved manifest exists; the staticvalidate-cmd
becomes the thin middle fallback and the not-checked notice the floor (3-tier
precedence, output schema + exit-3 contract preserved). - CHANGE-VALIDATION.md — dogfood manifest for this repo (approved):
fast/fulltiers
wiring the cargo + per-skilluv/pytest suites and_shared/sync.py --check, with the
websitebuild rows trimmed (deploy-only, not a validation gate) andyf-drift-check
excluded (prose/LLM trigger, not a runnable command). - Docs (#25): added worktree-uv guidance to yf-plan's worktree address-space docs —
prefixuv run …withenv -u VIRTUAL_ENVinside a plan worktree so uv resolves the
worktree's own environment, and do not follow uv's--activesuggestion (it targets the
primary venv, the wrong address space).
_shared/ package — retire the duplicated active-set classifier (plan-014, #15)
_shared/— new top-level package (outside theskills/embed root, soyfnever
treats it as a skill) holding canonical Python helpers shared across skills. Ships zero
yfRust changes: the vendored copies live inside each consuming script and install copies
them verbatim._shared/active_set.py— the single canonical active-set classifier (classify_active+
Edge,ActiveSetReport, helpers, and theACTIVE_*/PARENT_CHILD/OPEN/IN_PROGRESS/
CLOSED_STATUSES/GATE_TYPEconstants), delimited byBEGIN/ENDregion markers._shared/sync.py— repo-time sync tool that regenerates the marker-fenced classifier
region in-place in each consumer from canonical (no siblingimport, no new file — each
script stays self-contained);--checkmode exits non-zero on divergence (CI/manual backstop)._shared/README.md— documents the regenerate-the-fenced-region (vendoring shape (b)) pattern
and the enforcement point.
- yf-beads-hygiene / yf-beads-upstream — the active-set classifier is now a generated,
marker-fenced region in bothbeads_hygiene.pyandupstream.py, regenerated from
_shared/active_set.py. The plan-013 "do NOT edit one without the other" hand-maintenance
banner is gone; both test suites stay green and the single-file test loaders are untouched. - DRIFT-CHECK.md — migrated the classifier edges:
classifier-canonicalre-pointed to
_shared/active_set.py(fixed authority); the old pairwisee-classifier-copyreplaced by two
derivedvalue-equalregion edges (e-active-set-copy-hygiene,e-active-set-copy-upstream).
A tampered region now FAILs the copy, never the canonical.
Reconcile policy: local beads = active work only (plan-013, #38 + #17)
- yf-beads-upstream — implements
custom.upstream.granularity(coarse|granular,
defaultcoarse; fills the previously-unimplemented REQ-BUP-043) and a default-deny
custom.upstream.auto_hoist_followonsknob. Adds ahoistoperation (per-granularity
create-or-map viaExternal:, dry-run-first, reversiblebd close -r— neverbd delete),
narrow-vs-broad follow-on detection, anun-hoist/restore path, and a land-the-plane flow
that proposes follow-on hoists with a single confirm by default (no-prompt only under
the opt-in key, narrow signal only).enumeratenow uses the shared active-set definition.
Companion ruleUPSTREAM_TRACKING.md1.0.2 → 1.1.0. - yf-beads-hygiene — new read-only-first
reconcilepass: classifies the active set
(in_progress / claimed-open / open ancestors) and lists non-active local beads as hoist
candidates plus obsolete upstream issues (mechanical delivered signal; flag-for-review
fallback, never auto-close). Gated--apply/--yes/--recorddelegates the hoist to
yf-beads-upstream (the carve: hygiene proposes, upstream executes). - DRIFT-CHECK.md — new
e-classifier-copyedge asserting the active-set classifier
(authored once in yf-beads-hygiene, copied verbatim into yf-beads-upstream for install
independence) stays identical across both.
yf-beads-init — prune empty .codex/config.toml residual (dqo)
- Repair now removes the bare
[features]residualbd setup codex --removeleaves behind,
deleting.codex/config.tomlonly when effectively empty (then pruning an empty.codex/).
Install yf 0.3.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/dixson3/yoshiko-flow/releases/download/v0.3.0/yf-installer.sh | shInstall prebuilt binaries via Homebrew
brew install dixson3/tap/yfDownload yf 0.3.0
| File | Platform | Checksum |
|---|---|---|
| yf-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| yf-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| yf-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| yf-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |