Skip to content

v3.13.1

Latest

Choose a tag to compare

@github-actions github-actions released this 04 Aug 17:43
· 2 commits to main since this release
0b74524

Changed

  • Adopted three retrospective improvement proposals (002fa6c6, d7662676, 4aa8d058): /implement
    Step 2 gains the dedicated-worktree fallback for an unavailable/dirty main checkout; CLAUDE.md's
    plugin-refresh instruction is replaced with the verified version-keyed-cache procedure (purge +
    lazy extraction + verification); /implement Step 1 and the workflow-orchestrator output style
    now apply the delegated trait at Delegated/Parallel classification so delegation-metadata
    notes are schema-visible.

Added

  • Mid-session config re-sync. The plugin now pushes a project's .taskorchestrator/config.yaml
    to the server's per-root config store as soon as the file changes, not just at session start — the
    session-start.mjs SessionStart hook now returns hookSpecificOutput.watchPaths for the
    discovered config file, and a new FileChanged hook entry re-runs config-sync.mjs when it's
    edited mid-session. Requires Claude Code ≥ 2.1.220.
  • New needs-test-author trait separates test authoring from implementation. Adds a
    test-author skill and a three-note gate (test-plan at queue, test-manifest at work,
    test-independence-audit at review) so scenarios and oracles are frozen before implementation
    exists rather than derived from it. /implement gains a dedicated test-author wave between the
    implementation wave and orchestrator verification; review-quality gains an independence
    verification check. Applied by default to bug-fix; opt-in for feature-task via the
    /implement Step 1 trigger rule. Direct tier uses a temporal-only degraded mode (single actor,
    ordering-only separation) instead of a second dispatch.

Changed

  • Plugin: /review-proposals dispositions now write back to the source trend item. Rejecting a
    proposal appends a do-not-re-graduate line to the trend that graduated it; accepting one whose
    change is applied/landed retires the trend (gate-free cancel); the maintainer tracked-only path
    leaves the trend active until a later retrospective verifies the change. Closes the loop the
    trend-memory MCP migration made possible — previously the skill could not touch file-based trends.

  • Plugin: retrospective trend memory moved from a per-project memory file into MCP work items.
    /session-retrospective previously read and rewrote a whole-file memory/retrospectives.md
    (~55k tokens at steady state, exceeding the 25k read cap on a single call) on every run; trend
    patterns now live as items under a process-global Retrospective Trends container, with one
    evidence note per recurrence. Active-trend reads are now a targeted query_items list-mode call
    (title + summary only) instead of a whole-file load — roughly an 80% reduction in token cost for a
    typical retrospective's trend read. Retirement is gate-free via advance_item(trigger="cancel"),
    with no start/complete ever used on trend items, so the lifecycle stays safe under any user's
    schema config. A one-time automatic migration ships in the skill: it runs at each project's next
    /session-retrospective invocation, migrating any existing memory/retrospectives.md entries into
    the new container and rewriting the file to a pointer stub.

  • Plugin: retrospective dispatch directives are now durable, not immediate. The retro-trigger
    hook's mode: dispatch directive previously said "dispatch now", so orchestrators launched (and
    later surfaced) the background retrospective mid-session while implementation subagents were still
    running — no Claude Code hook event signals "all background tasks finished", and the model is the
    only party that knows. The directive and the workflow-orchestrator output style now instruct
    dispatch at the next run boundary: hold while background tasks/subagents are in flight, merge any
    directives that accumulate while holding into one dispatch covering the union of their roots.
    Nudges gain a matching "background tasks still running" skip condition. The known trade-off — a
    held directive is lost if the session is killed or compacts first (recover with a manual
    /session-retrospective) — is documented in config-format.md §Retrospective.

  • Bumped plugin version to 3.6.0 (minor): adds a FileChanged hook for mid-session config re-sync,
    the pattern-driven schema advisor in manage-schemas with 12 workflow profiles, and the
    retrospective trend-memory migration to MCP items.

Fixed

  • Lease-interval history close comparisons now normalize timestamp shapes with datetime(): Exposed
    timestamp columns store fractional seconds while datetime('now') is second-precision, so a hold
    lapsing inside the current second could compare as unexpired in SQLite's lexicographic TEXT
    comparison — skipping the expiry clamp and recording released instead of expired. Sub-second
    window, audit view only (beta field report).
  • Plugin: skill-enforcement hook no longer nags in a loop. The hook's additionalContext
    previously told the model to "abort this call, invoke the skill, then retry" — the model obeyed,
    retried, and re-triggered the same warning forever, since the hook kept no state and its 200-char
    substantive floor was unreachable for concise-by-design notes bound to a small maxLength.
    Now: advisory-once semantics (a per-session/item/key marker suppresses a repeat warning for the
    same note), a maxLength-aware substantive floor (scales down when a key's configured
    maxLength is small), and honest wording that no longer claims the call is blocked and adds an
    "Unknown skill" escape hatch for invalid skill pointers. Also documented the skill-pointer
    exact-name rule (qualified vs. bare names, built-in name collisions like review) in
    config-format.md, and added a manage-schemas validate check that flags skill: values
    colliding with built-in skill names (review, plan, run, init).
  • advance_item gate-blocked results now name the blocked transition. The gate-block error JSON
    gains structured previousRole/targetRole fields alongside missingNotes, so a rejected
    transition identifies which phase's note set it failed instead of leaving the caller to infer it
    from the trigger. The tool description now also states that start's gate is scoped to the item's
    CURRENT phase — successive start calls gate different note sets as the role advances, which is
    deterministic and not timing-dependent — and that a transition can cascade a parent to terminal
    when the parent's downstream gates are already satisfied by prefilled notes. MCP surface only: the
    REST 422 gate_blocked payload already carried targetRole and does not yet carry previousRole.
  • manage_items(update) now honors the top-level traits parameter. It was previously accepted
    and silently ignored — the call returned {updated:1, failed:0} having merged nothing, with no
    error — because the update branch never read the parameter, while create always had. Precedence
    now matches create: a per-item traits field overrides the shared top-level default, and traits
    absent at both levels leave the item's existing traits untouched. Merge semantics are replace, not
    union. The per-item form (items: [{itemId, traits: "..."}]) was never affected and needs no
    migration.
    Behavior change: traits: "" on update now clears an item's traits, where it was
    previously a silent no-op. Because trait-derived note requirements merge into an item's resolved
    schema, clearing traits also drops their gates — a caller that passes an empty traits string on
    update (e.g. a template that always sets the field) will now strip both. Omit the field entirely
    to leave traits unchanged.

What's Changed

  • fix: normalize timestamp shapes in lease-history clamp comparisons by @jpicklyk in #267
  • feat: adopt Claude prompt-engineering guide recommendations across tool descriptions, skills, and plugin prompts by @jpicklyk in #268
  • docs(retro): point the trend file at MCP for proposal state instead of mirroring it by @jpicklyk in #269
  • docs(retro): add a one-time migration for legacy trend-memory files by @jpicklyk in #270
  • feat(plugin): add pattern-driven schema advisor to manage-schemas skill by @jpicklyk in #271
  • docs(plugin): route needs-security-review to the built-in security-review skill + expand trait library by @jpicklyk in #272
  • fix(plugin): defer retrospective dispatch to the run boundary by @jpicklyk in #274
  • feat(plugin): re-sync per-root config mid-session via watchPaths + FileChanged by @jpicklyk in #282
  • feat(plugin): two-path improvement-proposal handling (GitHub feedback + auto-apply) by @jpicklyk in #273
  • feat(plugin): move retrospective trend memory to MCP items with one-time migration by @jpicklyk in #283
  • feat(plugin): review-proposals dispositions write back to source trend items by @jpicklyk in #284
  • fix(plugin): skill-enforcement hook — advisory-once semantics, maxLength-aware floor, exact-name skill-pointer docs by @jpicklyk in #285
  • chore(skills): adopt proposals 002fa6c6/d7662676/4aa8d058 by @jpicklyk in #286
  • feat(skills): separate test authoring from implementation (needs-test-author trait + test-author role) by @jpicklyk in #287
  • fix(advance-item): name previousRole/targetRole on gate-blocked results by @jpicklyk in #288
  • fix(items): honor top-level traits on manage_items update by @jpicklyk in #289
  • docs(changelog): record #288 and #289 under Unreleased by @jpicklyk in #291
  • release: v3.13.1 — advance_item gate-block naming and manage_items traits fix by @jpicklyk in #292

Full Changelog: v3.13.0...v3.13.1