Skip to content

tenx 0.27.0 — proactive delegation routing, configured Herdr/tmux projection, live-dispatch fixes

Choose a tag to compare

@sivakoneti sivakoneti released this 27 Sep 16:17
· 5 commits to main since this release

Delegation is now reachable, and live Herdr dispatch actually works.

What was wrong. Nothing in the loop ever proposed an isolated worker, and
even an explicit tenx dispatch --visual failed closed. Dogfooding a real
dispatch against a live Herdr session surfaced three defects on top of that.

Added

  • tenx next emits a delegate ready ticket ... action naming the runnable
    tenx dispatch / tenx swarm command for every spec with ready tickets.
  • tenx exec <SPEC> prints the same commands when a spec has more than one
    open ticket.
  • The bundled tenx-dispatch skill routes proactively on ticket-shaped
    intent instead of suppressing itself, and carries the Herdr supervision
    commands inline so a projected worker never depends on another skill being
    routed.
  • dispatch: section in .tenx/config.yaml (agent, visual) with
    TENX_DISPATCH_VISUAL and a new --no-visual override. Default stays
    headless, so nothing changes for projects that do not opt in.

Fixed

  • herdr agent start --timeout is a readiness wait capped at 300000ms, not a
    work budget. tenx passed the ticket timeout there, so every visual
    dispatch failed with invalid_agent_timeout.
  • The dry-run plan advertised a Herdr agent name with underscores while the
    live launch used dashes, so following the plan returned agent_not_found.
  • --visual with no active multiplexer silently ran an invisible headless
    worker and reported success.
  • A failed visual launch left .tenx/worktrees/<TICKET-ID> and the
    tenx/<TICKET-ID> branch behind.
  • PyYAML wrapped long frontmatter titles at ~80 columns, and the built-in
    fallback parser dropped the continuation lines, so artifacts written on a
    PyYAML machine failed tenx validate on every install without it.

Resolution order for projection is CLI flag > TENX_DISPATCH_VISUAL >
dispatch config > headless. Unattended runs stay explicit:
tenx swarm <SPEC> --auto-reconcile from CI or cron.

Verified

Both smoke modes pass (module + clean install) on 3.10/3.12/3.13 in CI.
This release was itself dogfooded end to end: a ticket was dispatched to a
live Herdr workspace, the worker implemented it in an isolated worktree, and
the change was reviewed and landed through tenx reconcile.


Added

  • Added proactive delegation routing: tenx next now names the runnable isolated-worker command for every spec with ready tickets, the tenx exec brief prints the same commands, and the bundled tenx-dispatch skill routes on ticket-shaped intent instead of suppressing itself. Added a dispatch section to .tenx/config.yaml (agent, visual) with TENX_DISPATCH_VISUAL override and --no-visual, defaulting to headless. (SPC-036)

Changed

  • Teach capability catalog about configured projection and delegation trigger (dispatch and swarm flags, dispatch config section, --no-visual) (SPC-037)

Fixed

  • tenx dispatch --visual with no active multiplexer now exits non-zero with the cause instead of silently running an invisible headless worker, and a launch that fails after worktree creation leaves no worktree or branch behind. (SPC-036)
  • Fixed frontmatter portability: PyYAML wrapped long titles at ~80 columns, producing continuation lines the fallback parser could not read, so artifacts written on a PyYAML machine failed tenx validate on every install without it. The writer now emits unwrapped scalars and the round-trip is pinned by tests. (SPC-036)
  • Fixed a second live-dispatch defect found by dogfooding: the dry-run plan advertised a Herdr agent name with underscores while the live launch used dashes, so following the plan with herdr agent get <name> returned agent_not_found. Plan and launch now share one herdr_agent_name() helper and the agreement is pinned by tests. (SPC-036)
  • Fixed live Herdr dispatch, found by dogfooding: herdr agent start --timeout is a readiness wait capped at 300000ms, not a work budget, so passing the ticket timeout there made every visual dispatch fail closed with invalid_agent_timeout. The readiness budget is now bounded independently and the dry-run plan reports it truthfully. (SPC-036)