Skip to content

flow-next v1.11.0

Choose a tag to compare

@github-actions github-actions released this 10 Jun 07:46
· 41 commits to main since this release
d7c988e

Added

  • Tracker-sync lifecycle hooks are now observable and forcing (fn-57 / FLOW-10). The bridge's lifecycle touchpoints (claim → In-Progress, done → comment, PR → issue link) were prose obligations an agent could silently skip — reproduced on two hosts (a Claude session and a Codex session in another project): PRs landed unlinked, issues never moved, and nothing failed. The hardening lives in the shared receipt/lifecycle layer, so it applies uniformly to every adapter (Linear, GitHub, future trackers) — and flowctl gains no tracker-mutation code: all mutations stay agent-driven through the tracker-sync skill; the deterministic additions are read-only.
    • flowctl sync receipt --event <perEvent-key> — every lifecycle dispatch's receipt now records which touchpoint it served (work.firstClaim, work.done, capture, makePr, …). Free-form (the perEvent key set is an open extension point); pre-flag receipts carry event: null and never satisfy an event-specific check. Every receipt call site in the tracker-sync skill is tagged via the caller's event: token (parsed in steps.md Phase 0); manual runs stay legitimately untagged.
    • flowctl sync check <spec-id> --events <csv> --since <iso> [--json] — the first reader of .flow/sync-runs/: a read-only, local-only audit reporting OK:<event> / MISSING:<event> per triggered touchpoint. MISSING iff the event triggered this run AND its tracker.perEvent leaf is enabled AND the bridge is active AND no receipt with a matching event tag and timestamp ≥ --since exists. Any receipt status clears (the check asserts the touchpoint ran); linkage is NOT a precondition (a never-linked spec that should have create-if-unlinked'd is exactly the miss it catches). Zero overhead for non-tracker repos: bridge inactive → silent constant-time exit 0 before any IO. Exit 0 always — output drives agent action, not the exit code.
  • /flow-next:prime seeds GLOSSARY.md from the repo (fn-57 Package B, R10). When the glossary is absent or a husk (glossary list --json total_terms == 0 — never a file-presence check), a new Phase 5.5 scans the repo for load-bearing vocabulary, proposes ~10-20 evidence-backed terms (file refs mandatory, _Avoid_ aliases on visible naming drift), and writes via flowctl glossary add only after read-back approval (--fix-all does not bypass it). A populated glossary gets a coverage report line and is never rewritten — pruning stays with /flow-next:audit.
  • /flow-next:capture joins interview as a glossary writer (R11). Capture's synthesis now runs a husk-aware new-vocabulary scan (workflow §2.7), offers genuinely-new project terms at read-back with a consent question, and writes approved terms via flowctl glossary add (§5.8) — autofix prints suggestions, never writes.
  • The glossary read path widens to where wrong-concept errors get built (R12): repo-scout / context-scout gain a Step 0.5 that surfaces only request-matched glossary entries (max 5, budget-capped — never the whole file), the work worker's re-anchor reads task-relevant terms, and impl-review (RP) + plan-review prompts add a Vocabulary criterion conditional on total_terms > 0. Every gate is total_terms == 0 → silent skip — zero behavior change without a populated glossary.
  • New docs page: docs/self-improving.md (R13) — the surfaces that compound through normal use (memory, glossary, decision records, strategy drift surfacing), with the flow-next.dev counterpart at /strategy/self-improving.

Changed

  • /flow-next:work, /flow-next:capture, and /flow-next:make-pr end every run with a tracker-sync check + bounded retro-fire (R2). Each skill runs sync check independently of the touchpoints (so a wholesale-skipped dispatch block is still caught), using an on-disk --since anchor (work → earliest claimed_at this run; capture → the spec's created_at; make-pr → the PR's createdAt) and a triggered-set --events contract (configured-but-not-triggered events are never MISSING). Any MISSING:<event> is retro-fired exactly once via the tracker-sync skill, re-checked against a fresh --since, and the final summary carries a mandatory four-state Tracker sync: slotOK | MISSING:<event> → retro-fired → OK | MISSING:<event> (retro-fire failed: <reason>) | n/a (bridge inactive). An explicit n/a proves the check ran; still-MISSING after one cycle is a recorded, visible outcome — never a block (best-effort discipline unchanged). Under Ralph, check + summary lines route to stderr (make-pr's stdout stays the single PR_URL= line; work's stdout stays clean for harness parsing). Manual recovery guidance (read the receipt note, re-fire via /flow-next:tracker-sync once transport returns) documented in tracker-sync.md.
  • /flow-next:make-pr §4.6b — deterministic post-create PR↔issue ref verify/repair (R4). §4.6a appends the non-closing Ref <identifier> line to the local body file before create — but an agent that hand-rolls gh pr create (the observed execution-fidelity gap) bypasses it. make-pr now verifies against the LIVE PR body (gh pr view --json body, never $BODY_FILE) with the same whole-line grep -qixF matcher as §4.6a, and repairs append-only via gh pr edit --body-file - when absent (65,536-char cap re-checked). Idempotent and fully non-fatal — the PR is already open.
  • flow-next.dev hero pillar grid redesigned to six pillars including the new "Self-improving / Compounds as you work." (R15) — an extensible 3-column auto-wrapping capability index, plus STRATEGY.md's new "Self-improving through normal work" track (R14).

Fixed

  • linear-mcp.md UUID correction (R9): the claude.ai Linear MCP returns identifiers (WOR-17), never UUIDs — on create AND fetch (verified live 2026-06-09) — so first-link requires the GraphQL rung (LINEAR_API_KEY) to obtain the UUID for sync set-tracker-id. The previous prose implied the MCP rung could complete a first link on its own.

Notes

  • Codex mirror regenerated (the work-phases §3c splice in sync-codex.sh now also carries the worker's glossary re-anchor line). New regression suites: tests/test_sync_check.py (19 tests — R8 silent inactive exit, MISSING predicate, any-status-clears, null-event back-compat, exit-0-always) and --event coverage in tests/test_tracker_receipts.py; both wired into CI as explicit steps. Both flowctl.py copies (canonical scripts/ + dogfood .flow/bin/) updated in lockstep (byte-identical invariant held). Docs: tracker-sync.md (observable+forcing lifecycle, MISSING-recovery), flowctl.md (sync check, --event), setup usage.md examples.