flow-next v1.11.0
·
41 commits
to main
since this release
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 carryevent: nulland never satisfy an event-specific check. Every receipt call site in the tracker-sync skill is tagged via the caller'sevent: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 reportingOK:<event>/MISSING:<event>per triggered touchpoint. MISSING iff the event triggered this run AND itstracker.perEventleaf is enabled AND the bridge is active AND no receipt with a matchingeventtag andtimestamp ≥ --sinceexists. 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:primeseeds GLOSSARY.md from the repo (fn-57 Package B, R10). When the glossary is absent or a husk (glossary list --jsontotal_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 viaflowctl glossary addonly after read-back approval (--fix-alldoes not bypass it). A populated glossary gets a coverage report line and is never rewritten — pruning stays with/flow-next:audit./flow-next:capturejoins 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 viaflowctl 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-scoutgain 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 ontotal_terms > 0. Every gate istotal_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-prend every run with a tracker-sync check + bounded retro-fire (R2). Each skill runssync checkindependently of the touchpoints (so a wholesale-skipped dispatch block is still caught), using an on-disk--sinceanchor (work → earliestclaimed_atthis run; capture → the spec'screated_at; make-pr → the PR'screatedAt) and a triggered-set--eventscontract (configured-but-not-triggered events are never MISSING). AnyMISSING:<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-stateTracker sync:slot —OK|MISSING:<event> → retro-fired → OK|MISSING:<event> (retro-fire failed: <reason>)|n/a (bridge inactive). An explicitn/aproves 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 singlePR_URL=line; work's stdout stays clean for harness parsing). Manual recovery guidance (read the receipt note, re-fire via/flow-next:tracker-synconce transport returns) documented intracker-sync.md./flow-next:make-pr§4.6b — deterministic post-create PR↔issue ref verify/repair (R4). §4.6a appends the non-closingRef <identifier>line to the local body file before create — but an agent that hand-rollsgh 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-linegrep -qixFmatcher as §4.6a, and repairs append-only viagh 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.mdUUID 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 forsync 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.shnow 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--eventcoverage intests/test_tracker_receipts.py; both wired into CI as explicit steps. Bothflowctl.pycopies (canonicalscripts/+ dogfood.flow/bin/) updated in lockstep (byte-identical invariant held). Docs:tracker-sync.md(observable+forcing lifecycle, MISSING-recovery),flowctl.md(sync check,--event), setupusage.mdexamples.