Skip to content

v0.3.0 — 2026-06-24

Choose a tag to compare

@github-actions github-actions released this 25 Jun 02:49

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-pdfscripts/blocks.lua renders fenced blocks during the PDF pipeline
    (d2 → embedded diagram, csv → table) with a glyph-fallback.tex for broad Unicode
    coverage; --no-render-fences opts out. _shared/sync.py gains a Python→Lua emitter
    that keeps blocks.lua mirrored from the canonical registry (DRIFT-CHECK edges enforce it).
  • yf-diagram-authoring — embed/lift/inline round-trip between a .d2 source file and an
    inline fenced block.
  • yf-research — new record-epic subcommand 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) and json_extract.py (defensive JSON extractor, region-vendored
    into plan_manager.py + research_manager.py; json-get gains list int-indexing). New
    DRIFT-CHECK edges and test_sync.py coverage. Zero yf Rust change for this epic.
  • yf-beads-initrepair() 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-output json.dumps invariant (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-approved CHANGE-VALIDATION.md manifest: 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), and check-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 seed CHANGE-VALIDATION.md template.
    • protocols/CHANGE-VALIDATION-TRIGGER.md — always-loaded companion rule binding the
      on-change trigger a description cannot fire (silent no-op unless the repo has an
      approved CHANGE-VALIDATION.md).
  • yf-plan — §6.1.5 layer (b) now delegates change-set validation to
    yf-change-validation when an approved manifest exists; the static validate-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/full tiers
    wiring the cargo + per-skill uv/pytest suites and _shared/sync.py --check, with the
    website build rows trimmed (deploy-only, not a validation gate) and yf-drift-check
    excluded (prose/LLM trigger, not a runnable command).
  • Docs (#25): added worktree-uv guidance to yf-plan's worktree address-space docs —
    prefix uv run … with env -u VIRTUAL_ENV inside a plan worktree so uv resolves the
    worktree's own environment, and do not follow uv's --active suggestion (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 the skills/ embed root, so yf never
    treats it as a skill) holding canonical Python helpers shared across skills. Ships zero
    yf Rust 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 the ACTIVE_*/PARENT_CHILD/OPEN/IN_PROGRESS/
      CLOSED_STATUSES/GATE_TYPE constants), delimited by BEGIN/END region markers.
    • _shared/sync.py — repo-time sync tool that regenerates the marker-fenced classifier
      region in-place
      in each consumer from canonical (no sibling import, no new file — each
      script stays self-contained); --check mode 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 both beads_hygiene.py and upstream.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-canonical re-pointed to
    _shared/active_set.py (fixed authority); the old pairwise e-classifier-copy replaced by two
    derived value-equal region 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,
    default coarse; fills the previously-unimplemented REQ-BUP-043) and a default-deny
    custom.upstream.auto_hoist_followons knob. Adds a hoist operation (per-granularity
    create-or-map via External:, dry-run-first, reversible bd close -r — never bd delete),
    narrow-vs-broad follow-on detection, an un-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). enumerate now uses the shared active-set definition.
    Companion rule UPSTREAM_TRACKING.md 1.0.2 → 1.1.0.
  • yf-beads-hygiene — new read-only-first reconcile pass: 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/--record delegates the hoist to
    yf-beads-upstream (the carve: hygiene proposes, upstream executes).
  • DRIFT-CHECK.md — new e-classifier-copy edge 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] residual bd setup codex --remove leaves behind,
    deleting .codex/config.toml only 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 | sh

Install prebuilt binaries via Homebrew

brew install dixson3/tap/yf

Download 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