Changelog
Release notes for the Stride application.
All notable changes to the Kanban Board application will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[3.0.0] - 2026-10-25
Stride now has Organizations: a paid plan for teams, with shared workspaces, org-admins, an Organization audit log, single sign-on, SCIM provisioning and security policies. Boards outside an Organization are on the new Free plan. This is a major version because the Free plan's limits change what a board can do once they are switched on, and because several API requests that used to succeed are now refused (see Changed below).
The Free plan's limits are off until launch day.
Plans are enforced only when the operator sets
STRIDE_PLANS_ENFORCED to exactly true and
restarts Stride. Until then, and on any self-hosted instance that
does not set it, every board keeps every feature and has no member
limit. Organizations, workspaces, roles, invitations, board moves,
the audit log and account deletion work the same either way. The
Organizations launch runbook
(docs/organizations-launch-runbook.md) is the
operator's checklist for turning enforcement on. Launch day was
1 November 2026: the hosted service at stridelikeaboss.com enforces
plans from then on.
Added
Organizations and workspaces
-
Organizations. A Stride site admin creates an
Organization from the new
/admin/organizationsscreens and appoints its first org-admin by email. An address with no account gets a new one and an email with instructions to set a password. A person belongs to at most one Organization. -
The Organization console. Org-admins open
/orgfrom Organization in the side navigation. It shows the Organization's details and members, and lets org-admins create, rename and archive workspaces and remove members. - Workspaces. Every account has a hidden personal workspace, and existing boards were moved into their owners' personal workspaces. An Organization can have several workspaces. Its people get a workspace switcher in the side navigation and a Workspace settings page, with Members and Boards for everyone, and Invitations, Tokens and Export for org-admins.
- Invitations. Org-admins invite people to a workspace by email, as a Member or a Guest, optionally with access to one board. Links work once and expire after 7 days. On a free board, the owner can invite someone to that one board from its members screen.
- Moving a board into a workspace. An org-admin moves a board they own into an Organization workspace from Move a board here. Everyone on the board must already belong to the Organization, and the move cannot be undone. Once moved, the board is a paid board.
- Workspace tokens. One API token for every AI Optimized board in a workspace, instead of one per board. Each request names its board. Tokens expire after 90 days and stop working when revoked or when the org-admin who created them leaves.
-
Workspace export. Org-admins download a
workspace as a zip of JSON files, built in the background and
kept for 7 days. A self-hosted instance restores one with
mix kanban.import_workspace(orKanban.Release.import_workspace/3in a release). The archive never contains passwords, tokens or webhook secrets. -
The Organization audit log at
/org/auditlists the Organization's security events, 50 to a page, filtered by action and date, with CSV and JSON export.
Organizations and Workspaces
(docs/organizations.md) covers all of this, and the
Resources section has new guides for org-admins.
Single sign-on, SCIM and security policies
-
Single sign-on with OpenID Connect or SAML
2.0, one identity provider per Organization. Org-admins verify
their email domains with a DNS TXT record, and people on those
domains use Sign in with SSO. Their first
sign-in creates their account and makes them a member.
Verified domains are re-checked daily, and a domain whose
record is missing three days in a row stops being verified.
See Single Sign-On (
docs/single-sign-on.md). -
SCIM 2.0 provisioning at
/scim/v2. An identity provider creates, updates and deprovisions members and keeps workspace membership in step with its groups, using Organization-scoped tokens created on/org/scim. See SCIM Provisioning (docs/scim-provisioning.md). -
Security policies on
/org/security: require two-factor authentication for every member, with a grace period of 1 to 30 days (7 by default) that each person gets once, and set how long the Organization's audit events are kept (90 to 3,650 days, or forever). See Organization Security Policies (docs/organization-security-policies.md).
The Free and Organization plans
When plans are enforced:
- A free board holds at most 3 people. AI agents never count. A board already over the limit keeps everyone, but nobody new can be added until there is room. Public read-only boards can still be read by any signed-in user; readers do not count.
-
Notifications, bulk actions, integrations, the task
telemetry fields and MCP access are
Organization-only. On a free board each shows its
name with "Available to organizations" and links to the
pricing page. Webhook, Slack and Discord endpoints are paused
rather than deleted, and send again once the board moves into
an Organization. MCP requests for a free board get a JSON-RPC
-32001error. The REST API and client-side hooks stay available on free boards; the REST API accepts the telemetry fields but does not store them, and says so in awarningslist. - People without paid access stop getting notification emails. Tasks waiting for them are still listed in the Review queue and My Work.
Operators get a read-only report of boards over the member limit
(mix kanban.over_cap_boards, or
Kanban.Release.report_over_cap_boards/0), a release
function that creates Stride's own internal Organization, and a
one-time launch announcement email.
Account deletion
- Anyone with a password can delete their own account from Delete account in account settings. Deletion is refused while they own a board other people use, or while they are the last org-admin of an Organization that has other members. Their claimed tasks go back to Ready, and their tasks and comments are kept without their name.
- A site admin can delete an account that an Organization's identity provider deprovisioned, on its owner's request.
-
Every account deletion, and every refused one, from
/admin/usersis recorded in the audit log.
Public pages
-
/pricing,/termsand/privacyare rewritten for the Free plan and the sales-led Organization plan. -
/productand/workflowsare redesigned around Stride's features, with current screenshots, and/workflowsshows how Stride plugs into your coding agent. - Stride is published under the MIT license that the pricing page and terms refer to.
Documentation
-
Every doc under
docs/and the README was checked against the code and corrected, anddocs/README.mdindexes every doc by audience. A test keeps the index complete. - The in-app Resources guides were refreshed against the current app, with new screenshots and new guides for account settings, board settings, labels, search and filters, bulk actions, the archive, task details, comments and mentions, the Agents page, My Work, Targets, notifications, integrations, MCP, free and paid boards, workspaces, invitations, and the org-admin pages. Guides are now grouped into Getting started, For developers, For non-developers and Best practices.
- The onboarding endpoint and the skills and setup templates it serves to agents were corrected to match the payloads the server accepts.
Changed
These requests used to succeed and are now refused:
-
A
security_considerationsentry shaped like a real credential is refused with a422on task create, batch create and update, and nothing is stored. The error names the entry's position and never echoes the value.Kanban.Release.scan_credential_considerations/0finds entries stored before this change. - A dependency that names no task on the task's board is refused, in the API and the board form.
-
A repeated or conflicting
board_id(in the query string twice, or different in the query and the body) gets a400. -
A board token whose user has lost access to the
board is refused on reads as well as writes, with the
documented
403. - Boards in an Organization workspace accept only members of that Organization. Read-only members are no longer offered as assignees.
- Names made only of invisible characters, and text with NUL bytes or invalid UTF-8, are refused as form errors instead of being stored or crashing.
And these responses changed:
-
A
column_idthat is not on the board answers404"Column not found" instead of "Task not found". -
mark_doneandmark_reviewedfor a token without write access answer the documented403instead of a500or422. -
A goal's
child_tasksin a create response now include each child'scolumn_id.
Security
-
Site audit events are purged after 90 days, as
/privacysays. An Organization's own audit events follow its retention setting. - Single sign-on and SCIM refuse site-admin accounts, so an Organization's identity provider can never sign in a site admin.
- SSO and SCIM hardening: SAML responses with a repeated attribute are refused, sign-in cannot be started from another site, provider requests are bounded in time and size, a SCIM-deprovisioned member stays out of single sign-on until SCIM re-activates them, and single sign-on asks for the two-factor code before it first links an existing account that has two-factor turned on.
-
API tokens in a request path are kept out of the request
log and the error tracker, and
security_considerationsis filtered from logged request parameters. - Losing access ends access everywhere: removing someone from a board, a workspace or an Organization revokes their tokens and stale invitations there, returns their claimed tasks to Ready, and switches off webhook endpoints they added. A disabled account's endpoints send nothing until it is enabled again, and the Integrations tab shows who added each endpoint.
- Workspace export downloads refuse symbolic links, and the export directory gets a random, exclusive name.
-
plug_cryptois upgraded to 2.2.1 for EEF-CVE-2026-105963. HTTP/2 stays off on the web server.
Fixed
- Form fields have a 3:1 border in light mode, so inputs are easy to see.
- The Agents page roster and feed stay reachable when a long list of at-risk targets is shown.
- The language you choose before signing in is kept after sign-in and stored on your account.
- The language switcher opens on the home, pricing, terms and privacy pages.
- Background jobs left running when a server stops are retried after an hour instead of being stuck.
- Task history entries with the same time are always shown in the same order.
[2.21.0] - 2026-10-14
Boards can now tell other systems what happens to their tasks: board owners send task events to a signed webhook, a Slack channel or a Discord channel from a new Integrations tab. Stride also sends a monitoring event for most things people and agents do, charts every one of them on the admin Metrics page, documents them in a new reference, and keeps stored metrics for 90 days.
Added
Webhooks and Slack notifications
Board owners have a new Integrations tab next to Settings. Each endpoint receives the task events ticked when it was added: created, updated, moved, claimed, unclaimed, completed, moved to review, reviewed and deleted.
-
A generic webhook receives a signed JSON
POST. Its signing secret is shown once, when the endpoint is added or its secret is rotated. Copy says whether the secret reached the clipboard, and asks you to copy it by hand if it did not. - A Slack endpoint posts a short message to a channel through a Slack incoming webhook.
- A Discord endpoint posts a short message to a channel through a Discord channel webhook.
- Each endpoint has Send test, an on/off switch and a log of its 20 most recent deliveries.
- Edit changes which events an endpoint gets or where they go. Leave the URL blank to keep the current one; a new URL gets the same checks as a new endpoint. The kind cannot be changed. The endpoint keeps its delivery log, and a webhook keeps its signing secret, so use Rotate secret if the new address belongs to a different receiver. Deliveries already waiting to be retried go to the new address.
-
Failed deliveries are retried for about an hour, up to 8
attempts. A
4xxother than408or429is not retried. - Stride never sends to a private or internal network address.
Webhooks and Slack (docs/webhooks.md) explains how
to set up each kind, what a delivery contains and how to verify
its signature.
Monitoring events across the app
Stride now sends a monitoring event for:
- board settings, members and columns, including the API tokens revoked when a member is removed or made read only;
- task edits, moves, deletes, claims, released and expired claims, review decisions and comments, whether they come from the board, the API or MCP;
- goals: the last task finished, tasks unblocked, Backlog tasks promoted, after_goal hooks succeeding or failing, and goal reassignments and reprioritizations;
- sign-out, password and email changes, account confirmation, display names and user administration;
- notifications, notification email (sent, skipped or failed), weekly digests, delivery targets and broadcast messages;
- downloads, rate limiting, MCP messages, API requests with no token and GitHub issue reports.
Events carry ids, counts, types and the names of changed fields. They never carry email or IP addresses, names, titles, descriptions, comment or message text, tokens or hook output.
Stored metrics retention
A daily job removes stored metrics older than 90 days. The
period is set with retention_days under
Kanban.Metrics.RetentionWorker; an invalid value
removes nothing. The admin users page counts activity within the
same period. The audit log is not affected.
Telemetry reference
Telemetry Events (docs/telemetry.md) lists every
event with its measurements, labels and meaning, and explains
how to receive the events, what they never contain and how long
stored metrics are kept. A test fails whenever the list and the
app disagree.
Security
- Monitoring events no longer carry personal data from security events. Email and IP addresses, and the free-text reason an agent gives when it releases a task, are no longer sent. The audit log still records the email and IP address.
-
API metrics can no longer be flooded with made-up
paths. API request metrics are labelled by the route a
request matched, such as
/api/tasks/:id/complete, or byunmatched, never by the path the caller typed. - The new-task form checks the parent goal and assignee. A crafted save can no longer put a task under a goal on another board, or assign it to someone without access to the board. A parent goal, column, assignee or label that is not a valid id is refused instead of crashing the form.
- HTTP/2 is turned off on the web server. Bandit 1.4.0 through 1.12.5 let an HTTP/2 client keep server processes busy indefinitely (EEF-CVE-2026-105659), and no fixed release is out yet. The app is served over HTTP/1.1 behind Fly's proxy, so nothing changes for visitors.
Fixed
- Column changes reach open boards. Adding, renaming, reordering or deleting a column updates every open copy of the board without a reload.
- Removing a member unassigns their tasks. Their open tasks on the board show under Unassigned; archived tasks keep their assignee.
- Board settings show why a save was refused. A name longer than 50 characters, a blank name or a description longer than 255 characters now shows its error under the field. Before, Save did nothing and said nothing.
- The Archive page no longer calls every archived task Completed. A task archived without a reason shows Archived unless it was finished, and the Completed filter, the counts and the CSV export follow the same rule.
- Dragging a card while someone else moves cards no longer crashes the board. A drag that raced a bulk move or another drag could deadlock. If the card keeps moving while you drop it, the board refreshes and asks you to try again.
- Claiming or finishing a task no longer clashes with a drag in its goal's column. Moving the goal now waits for the drag. If the goal's tasks keep moving, the goal stays where it is and the claim or completion still succeeds.
- An agent claiming, finishing or releasing a task no longer crashes a drag in the same column. An agent can also no longer claim a card that a person has just dragged out of Ready; the card stays where it was dragged.
- A goal waits for its after_goal hook. When its last task is finished, a goal now waits up to 5 minutes for the agent's after_goal report, instead of half a second, before it moves to Done on its own.
- A goal that moves to another column no longer leaves a gap. The cards below it in the column it left move up.
- An open task form keeps up with label changes. Deleted, renamed and new labels show up, and anything already typed is kept.
- Tasks created through the API appear on open boards with their labels.
- Task history no longer crashes the task form when an assignment names a deleted user; the user shows as "Unknown". Reassigning or reprioritizing a goal's tasks no longer records changes such as "medium to medium".
- Keyboard focus stays on the board after Move to Ready, moving to the nearest Backlog card's arrow.
- The GOAL badge and the Promote children to Ready button meet the contrast minimum in light and dark mode.
- Turning email off stops notification emails that were already queued.
-
Metrics count what really happened:
- the sign-in count no longer counts quiet session renewals;
- approving a task counts a completion only once the approval is saved;
-
kanban.api.after_goal_delivered.countcounts only API responses that carry the after_goal hook; - the review report metrics count each time a report is shown, not each re-render;
- live connection times are no longer stored for every page load.
- The unclaim guide describes the monitoring events a release really sends.
[2.20.0] - 2026-10-09
Busy boards are faster to work with. A board can be searched and
filtered, and the filtered view lives in the URL so it can be
shared. Boards have coloured labels, shown on task cards and
settable by agents through the API. A new My Work
page lists everything assigned to you across your boards. Several
tasks can be moved, assigned, labelled or archived at once, and
/ and ? are keyboard shortcuts on the
board.
Added
Board search and filters
A filter bar above the columns searches a board by text and filters it by type, priority, assignee and label.
- Search matches a task's title or identifier, ignoring case.
- The assignee filter offers every board member, plus Unassigned.
- Filters combine, and Clear filters removes them all.
- A goal stays on the board when one of its child tasks that is not archived matches, so a matching task is never shown without its goal.
- Drag reordering is off while a filter is active, and the bar says so.
The filters are part of the page address (?q=,
?type=, ?priority=,
?assignee=, ?label=), so a filtered
view can be bookmarked or shared. Opening a link with a value
the board does not recognise shows the board without that filter
instead of failing. If the label or member a filter names is
deleted or removed while the board is open, the filter is dropped
and the address updated. Read-only members can search and filter
like everyone else.
Board labels
Owners and members with modify access manage a board's labels in the new Labels section of the board settings. They can add, rename, recolour and delete labels, and each change saves straight away.
- Each label has a name of up to 40 characters and one of nine colours. Names are unique on a board, ignoring case.
- Deleting a label removes it from its tasks; the tasks themselves are kept.
- Read-only members see the board's labels but cannot change them.
The task form has a label picker. Task cards show up to three
label chips, then a +N count for the rest; goal
cards show none. When a label is created, renamed, recoloured or
deleted, every open copy of the board updates its cards and its
label filter without a reload. A member added to or removed from
the board appears in, or leaves, the assignee filter the same
way.
My Work
A new My Work page (/my-work),
linked from the sidebar, lists every open task assigned to you
across the boards you belong to. Tasks are grouped by board and
ordered by priority within each board, and each one links to the
task on its board.
Archived and completed tasks are left out, and so are tasks sitting in a board's Done column. Tasks on a board you have been removed from are no longer listed.
Bulk actions
Select in the board header turns on selection mode for owners and members with modify access. Each card gets a checkbox, and each column gets a Select all button. A bar that stays at the top of the board shows how many tasks are selected and acts on all of them at once:
- Move them to another column;
- Assign them to a board member, or unassign them;
- Add or Remove a label;
- Archive them, after a confirmation.
Each action succeeds or fails as a whole. A move that would take a column past its WIP limit changes nothing. Move, assign and archive skip goals, because doing any of them to a goal also affects its child tasks; the board says how many goals were skipped. Labels can be added to and removed from goals.
A card that is filtered out, deleted, archived or moved off the board leaves the selection. So does a card that moves to another column, for example when someone else drags it, so a bulk action cannot quietly undo that move; the board says when this happens. Clear selection, Done selecting or Escape clears the selection.
Keyboard shortcuts
On a board, / puts the cursor in the search box and
? opens a list of the shortcuts. Escape closes the
list, or clears the selected tasks. The shortcuts are ignored
while typing in a field or while another dialog is open. Closing
the list puts focus back where it was. On wider screens, a
/ ? hint in the filter bar opens the list too.
Labels in the API and MCP server
Agents work with labels by name. The API never exposes label ids and never creates labels.
-
POST /api/tasksandPOST /api/tasks/batchattach existing labels with alabelslist of names.PATCH /api/tasks/:idreplaces a task's labels, and"labels": []removes them all. - Names are matched against the token's board, ignoring case and surrounding spaces. An unknown name returns 422 naming every unknown label, and nothing is written.
-
Task responses include
labelsas{name, color}objects. -
GET /api/taskstakes?label=<name>, which filters the same way as the board's label filter. The MCP server'sstride_list_taskstool takes the samelabelargument.
Move a Backlog task to Ready from its card
Task cards in the Backlog column have a Move to Ready arrow, shown on hover or keyboard focus (and always on touch screens). It moves the task to the bottom of the Ready column. It appears for owners and members with modify access on boards that have a Ready column, and never on goal cards.
Fixed
-
The 2.19.0 metrics clean-up migration no longer fails on
production data. Some stored metrics events hold their
paramsorconnect_infoas a list rather than an object, and the migration that removes session tokens from metrics stopped with an error on those rows. It now leaves list values alone and still removes the tokens.
[2.19.0] - 2026-10-08
Accounts can now be protected with two-factor authentication: a
6-digit code from an authenticator app, plus single-use recovery
codes. People who have not turned it on are reminded after they sign
in, and a new Resources guide walks them through it. Production now
needs an ENCRYPTION_KEY secret before it will boot.
Added
Two-factor authentication
A new Two-factor tab under Settings turns on two-factor authentication. Stride shows a QR code and the same key as text; two-factor is on only once a code from the authenticator app is accepted with Verify and turn on. Stride then shows ten recovery codes, once. Leaving or cancelling before the code is accepted leaves two-factor off. Like the rest of Settings, the tab needs a recent sign-in.
From the same tab, New recovery codes replaces all ten codes after a current code from the app, and Turn off two-factor accepts a current code or an unused recovery code, which is then used up. Turning it off deletes the stored key and recovery codes. Recovery codes ignore spaces, dashes and capital letters when typed.
A code is accepted for its own 30-second window and one window either side, to allow for a phone clock that is slightly off, and each code works only once. API tokens are not affected: agents keep authenticating with their bearer token.
A second step at sign-in
With two-factor on, a correct email and password no longer signs
a person in by itself. Stride sends them to a new
Two-factor authentication page
(/users/two-factor) for the code from their app, or a
recovery code through
Use a recovery code instead. The session token
is issued only once a code is accepted. Until then the session
holds only a pending-sign-in marker, which expires after five
minutes.
- Keep me signed in on this device is honoured once the code is accepted, and someone sent to sign in from another page is returned to it.
- Signing in with a recovery code uses it up, and Stride suggests creating new codes.
- If the account is disabled or two-factor is turned off while a sign-in is pending, the code is refused and the person starts again.
- Re-authenticating to reach Settings asks for the second factor too. Changing the password from Settings, which already needed a recent sign-in, does not ask again.
A reminder for people without two-factor
When someone without two-factor signs in with their password, the page they land on shows a card above its content. That includes a page they were sent back to after signing in. The card links to Settings → Two-factor and to the setup guide. Not now hides it straight away and snoozes it for 10 days. The snooze is stored on the account, so it holds on every device, and once 10 days have passed the next sign-in shows it again.
The card belongs to that sign-in: it goes away when the person moves to another page or reloads, and it never shows once two-factor is on. Starting set-up without finishing it does not count as on. Re-entering the password to open Settings counts as a sign-in for someone without two-factor, so the card can appear on the Settings page then. Pages outside the signed-in app (the Resources pages, About and Changelog) do not show it.
A guide to setting up two-factor
Resources → Setting Up Two-Factor Authentication covers:
- turning two-factor on and saving the recovery codes;
- signing in, including with a recovery code;
- getting new codes and moving to a new phone;
- what to do if the authenticator is lost or a code is refused.
docs/TWO-FACTOR-AUTHENTICATION.md is the technical
reference behind it.
Two-factor audit events
Each change is recorded in the audit log against the user:
two_factor_enabledrecovery_codes_regeneratedtwo_factor_disabledlogin_succeeded_two_factortwo_factor_recovery_code_usedtwo_factor_challenge_failed
No code, key or recovery code is written to the audit log.
Security
- Secrets are encrypted at rest. The authenticator key is stored encrypted with AES-256-GCM. Recovery codes are stored only as keyed HMAC-SHA256 digests bound to the user, and are compared in constant time. A database dump alone can neither generate codes nor be searched for recovery codes.
- Codes cannot be replayed. Accepting a code and recording its time step is one conditional database write, so two requests racing with the same code cannot both succeed.
-
Code attempts are throttled. Each check counts,
right or wrong, before the code is looked at, so requests sent at
once cannot slip past the limits:
- 10 attempts per user in 5 minutes;
- 30 wrong sign-in codes per IP address in 5 minutes;
- 30 wrong sign-in codes per account in 24 hours.
- Session tokens are no longer stored in metrics. Phoenix socket telemetry carried the connecting user's session, including the raw session token, along with CSRF and socket tokens, and the metrics store saved all of it. Credential-shaped keys are now dropped at any depth before an event is stored, and a migration removes the same data from existing rows. That migration cannot be reversed.
Fixed
-
Settings tabs and sign-in pages work better with screen readers.
- Only the selected settings tab points at its panel.
- The profile, password and two-factor cards are tab panels labelled by their tab.
- These pages now have a main landmark: sign-in, two-factor, registration, confirmation, password reset and unsubscribe.
-
Accessibility fixes across the app:
- The top bar is a banner landmark, and the sidebar's two navigation regions are named.
- Dialogs are named by their title; they previously pointed at elements that did not exist.
- Section headings no longer skip levels.
- Definition lists hold only term and description pairs.
- Labels sit only on elements that allow them.
- The agent activity list can be reached and scrolled with the keyboard.
- The Resources search box has a label.
- Contrast fixes: board badges, chart axis labels and the Workflows page text and links now meet the contrast floor in light and dark mode.
[2.18.0] - 2026-10-08
Task comments are now a conversation between people and agents. Every comment shows who wrote it, authors can edit and delete their own comments, board members can be @mentioned and are notified, threads update live, and agents can read and post comments through the API and MCP.
Added
Comment authorship, editing and deleting
Every comment now records who wrote it and, when it came through the API or MCP, the agent that wrote it. The thread shows the author's avatar and name, or the agent's name with the person whose token it ran under ("via Ada Lovelace"). Comments written before this release have no recorded author and show as "Unknown", rather than having one invented. Deleting a user keeps their comments and drops only the attribution.
Authors can edit their own comments, and an edited comment is
marked as edited with the time of the edit on hover. Authors can
delete their own comments, and board owners can delete any
comment on their board. An owner deleting someone else's comment
is recorded in the audit log as
comment_deleted_by_owner. Any board member can
comment, read-only members included, because commenting is
discussion rather than a change to the task. These rights are
checked live, so someone removed from a board loses them at
once. The board UI, the REST API and the MCP tool share one
permission check, so they cannot drift apart.
One live comment thread
The task view and the edit form now share one comment thread, in light and dark mode. New, edited and deleted comments appear for everyone viewing the task without a reload. Posting a comment scrolls it into view inside the thread; comments arriving from other people do not move your place. Posting a comment from the edit form keeps any unsaved changes to the task.
@mentions with suggestions as you type
Typing @ in a comment suggests board members,
matched by name or email. The list works with the arrow keys,
Enter or Tab to pick and Escape to close, and is announced to
screen readers as a combobox. A mention is stored as an
@[Name](user:ID) token and shown as a chip with the
member's current name. Mentions are checked on the server: only
current members of the task's board whose accounts are not
disabled count, at most 20 per comment, and anything else stays
plain text.
Each newly mentioned member gets a Mentioned notification in the app and, by default, by email. The author is never notified of their own mention, and editing a comment notifies only the people the edit newly mentions. The notification links to the task's edit form and scrolls to the comment, which is outlined so it is easy to find. It never copies the comment's text, so someone who later leaves the board keeps no copy. When an agent wrote the comment, the notification names the agent and the person whose token it ran under, for example "Claude (Ada Lovelace)", and never shows an email address. Mention emails can be turned off under Settings like any other notification.
Task comments in the API and MCP
-
GET /api/tasks/:id/commentslists a task's comments oldest first.limit(1 to 200, default 50) returns the most recent comments, andmeta.has_moresays whether there are older ones. -
POST /api/tasks/:id/commentsadds a comment as the token's user.contentis 1 to 10,000 characters and may carry mentions. The agent name shown on the comment is resolved in the same order as a created task'screated_by_agent: the token's agent model, then theagent_namesent, then the agent name the token last sent. -
GET /api/tasks/:idand the MCPstride_get_tasktool now include acomment_count, so an agent can tell when a thread is worth fetching. -
The MCP
stride_add_commenttool now acceptsagent_name, runs the same action as the REST endpoint and returns the comment in the REST shape, so a comment is attributed the same way over both.
Both endpoints are documented in docs/api/,
described in the OpenAPI specification, and listed in the agent
onboarding response.
Changed
- Only info flashes now hide on their own, after 5 seconds. Error flashes stay until dismissed, so an error is not missed.
Fixed
- Avatar initials skip punctuation, so a name such as "Bob [Bracket]" shows "BB" rather than "B[".
- Form error messages and input placeholder text now meet the contrast floor in both light and dark mode.
[2.17.0] - 2026-10-06
MCP clients such as Claude Code can now work Stride tasks through typed tools. Security audit events are now stored in the database, site admins can browse and export them, and the stored log can be moved out of the application's reach: a separate owner role owns the table and its functions, retention runs through one owner-owned purge function, and an operator command finishes the job in production.
Added
An MCP server at /api/mcp
Stride now serves a Model Context Protocol server at
POST /api/mcp, so MCP clients such as Claude Code
can use Stride through schema-checked tools instead of
hand-built curl commands. It offers six tools:
stride_next_task, stride_claim_task,
stride_complete_task,
stride_get_task, stride_list_tasks
and stride_add_comment. Each tool's arguments
match the REST API's OpenAPI specification. Claims and
completions run through the same code as the REST endpoints,
so hook results, reviewer_result and the
completion gate are checked exactly as before. Hooks still run
on the agent's machine; the server never runs one.
stride_list_tasks always returns one page of slim
summaries unless asked for whole tasks, so a large board cannot
flood an agent's context.
The server speaks JSON-RPC 2.0 over Streamable HTTP and answers
with JSON only. It opens no event stream and keeps no session,
so GET and DELETE /api/mcp return
405. It supports MCP protocol versions
2024-11-05 through 2025-11-25. It
uses the same API token as the REST API, acts as the token's
user on the token's board, and counts failed authentication
attempts toward the same rate limit. A request whose
Origin header names any other site is refused with
403, so a web page cannot drive the endpoint
through a visitor's browser. A REST refusal comes back as a
tool error carrying the same body plus
error_code and http_status.
docs/MCP.md covers setup in Claude Code and the
full tool reference, and the API docs and OpenAPI specification
now list the endpoint. REST responses are unchanged.
A persisted, append-only audit trail
Every security audit event is now also stored as a row in a new
audit_events table, alongside the structured log
line and telemetry event it already produced, so events can be
queried, exported and kept. Each row records the action, the
acting user, the IP address and the event's metadata. Values
that look like credentials (passwords, raw tokens, secrets) are
dropped before anything is logged or stored, and long values
are cut to 2,000 characters.
The table is append-only. A database trigger rejects every
change to a stored row, every TRUNCATE, and every
delete outside the retention purge. The one exception: deleting
a user clears the actor link on their events but keeps the
events, and the user's id stays in the metadata.
Storing an event can never break the action being audited. If the insert fails, the failure is logged by action and error type only, never the values, and the caller carries on. Inside a transaction the insert runs under a savepoint, so a failed audit insert cannot roll back the caller's work. An event whose user no longer exists is stored without the actor link rather than lost.
An audit log viewer and export for site admins
Site admins have a new /admin/audit-log page, linked from the admin menu on desktop and mobile. It lists events newest first, 50 to a page, and filters by action, actor email, and a from and to date (whole UTC days, both inclusive). The filters live in the URL, so a filtered view can be bookmarked or shared with another admin. Filter values are checked strictly, and an invalid one is ignored rather than causing an error.
The same filters drive a download as CSV or JSON from
/admin/audit-log/export. Large exports stream from
the database in batches instead of loading at once. CSV cells
are guarded against spreadsheet formula injection, using the
same encoder as the board archive export. Every export is
itself recorded as an audit_log_exported event,
with its format and filters, before the first byte is sent, so
even an aborted download leaves a record. Only site admins can
reach the page or the export.
A separate owner role for the audit table
The audit_events table, its id sequence, its
append-only trigger function and their schema can now belong to
kanban_audit_owner, a role that cannot log in and
that the application can never assume. The application keeps
only the right to insert and read events. Until now the
application's own role owned the table, so it could disable or
drop the trigger that protects it. A migration hardens the
table when it runs as a superuser and otherwise logs why and
carries on, so a deploy never fails for lack of privilege.
docs/audit-log-hardening.md describes the
statements and every reason a database can be reported as
degraded.
An owner-owned retention purge
Old events are now removed only through the
audit_events_purge database function. It refuses
any cutoff newer than 90 days in the function body itself, so
even a compromised application cannot erase recent history. In
a hardened database it runs with the owner's rights and is the
only way the application can delete a row; the old session flag
that let a delete through is ignored there.
[2.16.0] - 2026-10-05
Agents and integrations can now page through a board's tasks and filter them on the server, and can discover the whole API from a machine-readable specification.
Added
Cursor pagination and filters for GET /api/tasks
GET /api/tasks now accepts limit
(1 to 200, default 50) and an opaque cursor. It
also accepts filters on status,
type, priority,
assigned_to_id, parent (a goal
identifier such as G12) and
updated_since (an ISO 8601 timestamp), and they
combine with the existing column_id. Archived
tasks are left out. Each page is ordered by task id and
carries a meta block with
next_cursor and limit. Pass
next_cursor back as cursor to get
the next page, and stop when it is null.
Following the pages with updated_since gives an
incremental sync.
Pagination is opt-in. A request with none of the new
parameters gets the same unpaginated response as before,
byte for byte, so existing clients are unaffected. Once any
new parameter is present, a blank or malformed value returns
a 400 with the reason, never a silent fall back to the full
list. Every doc that describes the endpoint, and the
onboarding api_reference, now cover the new
parameters.
An OpenAPI 3.1 specification at /api/openapi.json
The API is now described by a hand-written OpenAPI 3.1
specification, served without authentication at
GET /api/openapi.json with a one-hour cache. It
defines the bearer-token security scheme and shared
Task, TaskSummary,
Error and PageMeta schemas. The
agent onboarding response links to it as
api_reference.openapi_url, and
docs/api/get_openapi_json.md documents it.
A contract test keeps the specification honest. It fails when
a route exists in the router but not in the spec, or in the
spec but not in the router, when an operation's
authentication does not match its pipeline, or when the
Task schema's keys and enum values drift from
what the API actually renders.
[2.15.0] - 2026-10-03
Stride now tells people when something needs their attention, in the app and by email, instead of waiting for them to go and look.
Added
An inbox and a notification bell
Every page in the app shell now has a bell with a live unread count, linking to a new /notifications inbox. The inbox lists your notifications newest first, filters to unread, marks one or all as read, and opens a notification's page when you click it. New notifications and read-state changes arrive live, without a reload. A notification tied to a board is hidden once you leave that board; account-level notices, such as being removed from a board, stay visible.
Notification wording is rendered when it is shown, not when it is stored, so each person reads it in their own language. Agent free text that does reach a notification (review notes, an unclaim reason) is trimmed, capped at 500 characters and always shown escaped.
What you are notified about
- Review requested: when an agent completes a task that needs review, every board member with owner or edit access is told, with a link to the review queue.
- Review results: approving a task or requesting changes tells the person whose agent did the work, with the reviewer's notes on a change request, unless they reviewed it themselves.
- Task assigned: assigning a task to someone else tells them. Assigning one to yourself does not.
- Task unclaimed: an agent releasing a task back to Ready tells the user it was working for and the task's creator, with the reason when one was given.
- Claim expired: an agent claim that lapses before the task is finished tells the assigned user once. A sweeper checks every five minutes.
- Goal completed: a goal reaching Done tells its creator and assignee once per completion.
- After-goal hook failed: a failing after_goal hook tells the goal's creator and assignee once per run of failures, with the exit code and duration but never the hook's output.
- Board access changed: being added to a board, having your access changed or being removed tells you what changed. When the change revoked your API tokens for that board, it says how many, so failing agents are no longer a mystery.
- Delivery target at risk or missed: an hourly check tells a target's owner when the target becomes at risk of missing its date or misses it. The status matches the badge on the boards strip, and a target that recovers and slips again notifies again.
Email delivery with one-click unsubscribe
Notifications can also arrive by email. Emails are sent in the background, never on the request that caused them, so a slow mail server never slows the app down and a failed email never undoes the action that triggered it. Every kind of notification emails by default except completed goals.
Every notification email carries a signed unsubscribe link,
plus the List-Unsubscribe and
List-Unsubscribe-Post headers mail providers
use for one-click unsubscribe. A link turns off that one
kind of email without logging in, expires after 90 days, and
shows the same response for any invalid link, so it never
reveals whether an account exists.
Notification preferences
A new /users/notifications page lets each person turn in-app and email delivery on or off for every kind of notification, and turn the weekly digest on or off.
A weekly digest
On Mondays at 13:00 UTC, everyone who has opted in, confirmed their email and still has an active account gets a digest of the previous week. It covers what was finished on their boards, completed goals and what is waiting in their review queue. It only mentions boards they belong to, and quiet weeks send nothing.
[2.13.0] - 2026-07-28
Agent-authored findings now reach a human, and a delivery target tells you it is going to be late before the date arrives.
Added
Completion notes are persisted and shown on the Review queue
completion_notes had been documented as the place an
agent records findings a human needs to read — exploratory-testing
results, a refused behaviour-matrix row — but it was never a field
on the task. The completion endpoint accepted it, the changeset
silently discarded it, and the agent got a success response with no
signal that its report had vanished. It is now a real column, cast
on the completion path, returned by the API, and rendered on the
Review queue beside the completion summary. It stays optional:
omitting it leaves any stored value untouched.
Because the field is agent-authored free text now shown to humans, the completion path also scans it for credential shapes — token formats, key blocks, opaque secret assignments — and raises a security audit event without ever logging the matched text. The scan deliberately detects rather than blocks or rewrites: a legitimate refusal narrative is about credentials, so rejecting on that vocabulary would break the workflow the field exists to serve.
A target warns you when its own estimate slips past its date
A delivery target now derives at_risk from its
estimated completion date rather than waiting for the target date
to pass. When the estimate — projected from median lead time across
the target's member goals — lands after the target date, the badge
reads at risk, and the reason is surfaced wherever the status is
explained rather than left as an unexplained colour change.
Fixed
Matrix row text is confirmed escaped, and the rule that says so is now true
Behaviour-matrix row text is attacker-controlled at the API boundary — anyone posting directly to the API never sees the authoring guidance. Every render surface was read and confirmed to interpolate row values through auto-escaped templates with no raw-HTML helper anywhere on the path, and the seven category strings and four row statuses were confirmed to be hard-rejected server-side rather than merely documented as such. Escaping tests were added for the surfaces that lacked them, including attribute context and an unrecognized category. The agent-facing guidance was reworded to cite the real render-side control instead of implying the "don't type raw HTML" convention was the defense.
The matrix secret rule no longer contradicts itself
The implementation-driver guidance mandated recording a row's status advance by PATCHing the matrix, and in the same breath forbade letting a credential reach the PATCH body. On a task whose matrix carried a credential-bearing row those were unsatisfiable together: the PATCH replaces the whole array, and a partial matrix is rejected for not covering every category, so advancing any row re-sends them all. The guidance now states that re-sending already-stored row text back onto its own record is not a new copy, and names one correct action — scoped narrowly enough that it is not a general licence to put credential material in a request body.
[2.12.0] - 2026-07-25
Tasks gained a behaviour/test matrix, and the workspace gained a navigation spine.
Added
Behaviour/test matrix on tasks
A task can now carry a behaviour/test matrix: a list of rows pairing a behaviour the change must satisfy with the real test that covers it, or an explicit reason the row is waived. Each row carries a category drawn from seven fixed values (happy path, boundary, error/exception, null/empty, concurrency, lifecycle/wiring, contract/serialization), a status (planned, passing, failing, not applicable), and an optional test name and type.
The field is optional, but a non-empty matrix must cover all seven categories — a partial matrix is rejected naming the ones missing. It is editable from the task create/edit form, accepted and serialized through the JSON API, rendered on the task detail view, and echoed by the reviewer into a verdict shown on the Review queue.
A workspace navigation spine
The boards index gained a header showing aggregated workspace stats and an avatar stack of active agents, plus a nav strip linking the Agents page, Review queue, and Metrics from every page — so the workspace-level views are reachable without going through a board first.
Per-consideration security mitigation breakdown
When a task lists security considerations, the Review queue now shows an always-visible per-consideration breakdown of whether each one was actually mitigated, rather than a single rolled-up verdict.
Changed
Admin pages became tabbed, with an agent view
The admin user administration page was converted into an in-page tabbed view, and gained an Agents tab showing completed-task counts per agent. A "hide users with zero boards" filter was added to the user list.
Fixed
The dark-mode contrast checker had blind spots
The contrast tooling missed the pairs that hid a status-chip delineation defect, so a real visual problem passed the automated gate. The checked pair set was widened to close those gaps.
[2.11.0] - 2026-07-19
Workspace metrics gained exports, better charts, and a large speed-up.
Added
Export workspace metrics to PDF and Excel
The workspace metrics page gained an export dropdown that carries the page's active filters and the viewer's timezone into the generated file. Both a PDF report and an Excel workbook are produced, fully translated across all locales, behind a scope-authorized route. The existing board-level metrics export was translated to match.
Lead time charting and an exclude-weekends filter
A daily median (p50) lead-time series was added and rendered as its own chart below the cycle-time chart. Both charts gained a trend line and an auto-fitting rounded y-axis that picks readable tick values instead of arbitrary ones. A filter to exclude weekends was added, and the KPI strip's lead-time figure moved from p75 to p50 so it agrees with the chart.
Targets show an estimated completion date
A delivery target's pill now shows an estimated completion date derived from the median lead time of its member goals, so the target communicates a projection rather than only a deadline.
Plugin install picker during onboarding
The confirmation onboarding page gained a tabbed picker for installing the agent plugin matching the user's coding agent, backed by a registry of the supported runtimes.
Changed
Workspace metrics load once, and read far less
The metrics pages were reading more than they rendered. Reads were consolidated into a single narrow fetch of completed tasks, the cumulative-flow view's full-table load was replaced with a bounded projection, the Agents page fetch was projected down to the fields it derives from and reused across both time windows, and a composite index was added for the board-scoped fetch. Metrics now load once per visit on the connected mount rather than on every mount.
Fixed
Wait Time metrics reported zero for every summary value
The Wait Time page's summary figures were all zero regardless of data. They now reflect real measurements.
A goal's column no longer goes stale when its children change
Adding an existing task to a goal, or creating a child under a goal already in Done, left the parent goal in the wrong column. The parent's column is now recalculated in both cases.
Auth pages showed a stale top nav
The registration, login, and confirmation pages rendered the old root-layout navigation instead of the homepage nav.
[2.10.0] - 2026-07-16
Operators gained the ability to act on the Agents page, administer users, and a large security-remediation wave landed.
Added
Reassign and reprioritize a goal without leaving the Agents page
The Agents page gained in-page interventions: Reassign moves an unstarted goal to a different agent, and Reprioritize changes its priority, each behind a confirmation dialog and an undo window. Both operations are concurrency-safe and only apply to unstarted work, and both are gated on being the target owner or the board owner. Agent claim order was verified and regression-tested to respect priority, so a reprioritization actually changes what gets picked up next.
User administration
A new admin-only User Administration page lists every user with per-user actions: disable, enable, resend confirmation, and delete. Disabled accounts are blocked from logging in and have their existing sessions invalidated. The page shows per-user activity metrics and a Created column, and the older LiveDashboard user-activity report was removed in favour of it.
Archive a delivery target
Delivery targets can now be archived once complete, with a dedicated Archived Targets page and an Unarchive action, both owner-gated.
Changed
Authentication surfaces are rate limited and audited
Rate limiting was added to the authentication surfaces, and security audit logging now records authentication and authorization events. A systematic authorization sweep went through every LiveView event handler, and a host allow-list was added for task diff URLs. A scheduled dependency-audit CI run was added.
Fixed
A large security-remediation wave
Roughly two dozen findings from the security review were
remediated. The most significant: sudo re-authentication was
restored on account settings and password/email
change — it had been defined but silently dropped from the router by
an unrelated earlier change, so a borrowed session or stolen
remember-me cookie could change a password or email with no
re-auth. Beyond that: authentication emails are delivered
asynchronously to close a timing-based user-enumeration channel;
active LiveView sessions are disconnected on password reset; the
session cookie is marked Secure in production; the audit-log
sensitive-key filter became substring-based so credential-shaped
keys it never anticipated are redacted; the numeric API task lookup
is board-scoped, closing a 403-vs-404 existence oracle; and API
token authentication returns a uniform error rather than distinct
state strings. Dependency bumps cleared three CVEs in
mint, including an HTTP response-smuggling issue.
Review diffs showed the wrong task's files
A hook-uploaded changed_files payload could surface
another task's diffs in review. Alongside that fix, a review-bound
task completing with an empty changed_files is now
detected and flagged, the review UI renders an explicit
diff-unavailable state with a re-fetch action instead of a blank
panel, and a supported backfill path with alerting was added.
Confirmation emails never arrived
New users were not receiving the confirmation email after registration. The delivery failure is now surfaced rather than swallowed, and SMTP TLS hostname verification was corrected.
[2.9.0] - 2026-07-09
Delivery Targets arrived: a way to group goals under a dated commitment and see whether it is going to be met.
Added
Delivery Targets
A delivery target is a named, dated commitment owned by a user, to which goals are assigned. Targets are board-scoped with full CRUD, a strip on the boards page showing each target's status at a glance, a create/edit page for managing goal assignment, and a detail page with a progress hero — aggregate percentage, segmented progress bar, status badge — above a table of member goals showing per-goal progress, count, priority, and owner. On-track status is derived from the member goals rather than entered by hand.
The Agents page was restructured around delivery
The Agents page was reframed delivery-first: a delivery-health band at the top, an explainer for why a target is at risk, and a roster annotated with the targets each agent is working toward and ordered risk-first. A delivery rollup derives the agent-to-target bridge that makes this possible.
Fixed
A second security-remediation wave
API tokens gained expiration — a nullable expiry with a 90-day
default on new tokens, enforced at authentication, with existing
tokens unaffected. Password-reset tokens were shortened to a
dedicated one-day window. The email-confirmation gate is now
enforced in admin and sudo authorization paths. Live board-write
authorization was added to the API unclaim, create, update, and
after-goal endpoints, and modify-access is enforced on the task
create/edit save path. Path traversal in changed_files
paths is rejected, the content-security policy was tightened with
base-uri, form-action, and
object-src, production database connections are
guarded against cleartext to a public host, and the development
secret-key placeholder now fails closed for a running server.
The Agents page was slow, reloaded continuously, and could crash
The Agents page suffered an unbounded fetch, a global refresh, and an N+1 — together producing slow loads, continuous re-loading, and a crash loop in production, plus a SQL error in the delivery rollup's task fetch. It also attributed tasks to the wrong goal for agents working across several goals. All were fixed.
Target status disagreed with itself
The boards page and the Agents delivery band reported different statuses for the same target, archived goals were not counted as complete in the progress view, and target goal rows showed unassigned instead of the agent who worked the goal.
Flash messages were unreadable
Flash messages rendered with a near-transparent, low-contrast background.
[2.8.0] - 2026-07-03
A full security review of the application, a large internal refactor, and a responsive-layout sweep across every page.
Added
A returning-user resend journey
An unconfirmed account attempting to log in is now redirected to a confirmation-pending page where the confirmation email can be resent, with an email-entry fallback and a link from the login page, so a user whose confirmation email went missing has a way back in.
Changed
Ten-part security review
The application was reviewed end to end against a documented scope inventory: authentication and session management, API token authentication and capability authorization, IDOR and cross-board access scoping, injection and data-access safety, cross-site scripting and output encoding, input validation and file-path handling, secrets and deployment configuration, dependencies and supply-chain risk, and server-side request forgery in the hook and file transports. Findings were triaged and prioritized; remediation ran through the following releases.
The first remediation batch landed here: live board-access
enforcement on agent claim and complete, a scheme allow-list on
review diff URLs, metric-parameter validation in the PDF and Excel
exports, changed_files write authorization scoped to
the assignee or reviewer, an owner gate on board member search, a
hardcoded audit credential moved to environment variables, and
mass-assignment blocks on the column and message changesets. Base
images in the Dockerfiles were digest-pinned and the Chrome install
hardened.
Responsive layout audit across every page
Every surface was audited for responsive layout at the project's breakpoints — global navigation and the sidebar drawer, authentication pages, the boards index and board form, the kanban board view and its column scrolling, board modals, the task form and detail view, goal detail, the metrics landing and chart pages, agents and the review queue, and the archive, resources, issue, and admin pages — followed by a cross-page regression sweep.
Internal: large modules split along their seams
Several oversized modules were broken up: metrics queries moved out
of LiveViews into a Kanban.Metrics.TaskQueries context
and workspace functions into Kanban.Metrics.Workspace;
the API TaskController shed its changed-files transport
decoding, param filtering, and batch goal creation;
Kanban.Tasks.Task's validation helpers were split into
focused modules; BoardLive.Show shed task-card
presentation, goals-strip computation, and API token management;
and ReviewLive's inline render moved to a co-located
template with its acceptance-criteria and verdict helpers
extracted. credo --strict was added to the precommit
alias.
Elixir 1.20 and Erlang 28.5
The project was upgraded to Elixir 1.20 on Erlang 28.5, with the compiler warnings the new version surfaced fixed.
Fixed
Over-length field values crashed instead of returning a validation error
A value exceeding a length-bounded column raised a Postgrex error rather than a validation failure. Over-length values are now translated into a 422 at the task API boundary, and a regression guard ensures every length-bounded column has a matching changeset validator.
Agents throughput cards followed the wrong control
The Agents page throughput cards were driven by the page time-range selector when they should not have been. Board and time-range filter placement was also standardized across the Agents and Metrics views.
[2.7.0] - 2026-06-26
The board Archive page
(/boards/:id/archive) was reorganized around goals and
gained real filtering, search, and a working CSV export.
Added
Filter the archive by assignee, date range, and name
The archive filter row gained three working filters that compose with each other and with the existing reason filter. An Assignee chip opens a dropdown of the board's archived assignees — each with an avatar and name, plus an "Unassigned" option and an "All assignees" reset — and narrows the list to the chosen person. A Date range chip opens a popover with From/To date inputs and Apply/Clear buttons that limit the list to tasks archived within an inclusive range. And a live name search box filters by task title as you type (debounced), with a clear (×) affordance and a search-aware empty state that names the term you searched. All four dimensions — reason, assignee, date range, and search — apply together and survive live updates.
Export the archive to CSV
The footer's "Export CSV" button was a "coming soon" placeholder; it now downloads a real CSV of the board's archived tasks (Identifier, Title, Type, Goal, Assignee, Archive Reason, Archived At, Archived By). The export is an authenticated, board-scoped download that mirrors the existing metrics-export pattern, and the generated file is RFC-4180 quoted/escaped and neutralized against spreadsheet formula injection.
Expand or collapse every goal group at once
A control in the archive header collapses every goal group — including the "Tasks Without Goals" group — so you can scan the list of goals, or expands them all to see every archived task. It reuses the per-group chevron state, so it composes with collapsing or expanding individual groups, and hides itself when there are no collapsible groups.
Changed
Archived tasks are grouped and collapsible by goal
The archive was reorganized around goals. Archived rows are grouped by their goal, the goal's own archived row carries a collapsible chevron (no more duplicated header line), and the "Tasks Without Goals" group sits at the top. Goal rows are tinted with the same soft violet as the board's goal cards for visual continuity. The earlier month-section grouping was removed in favor of this flat, goal-grouped list.
The filter row now shows only filters that work
The archive previously offered Cancelled, Won't do, Duplicate, and Deferred reason filters that nothing in the UI could ever populate, so they sat permanently empty; those were removed, leaving All and Completed. The decorative Goal placeholder chip was removed, and the Date range placeholder became the real filter described above. Tasks archived with any of the removed reasons still appear under "All" — no data is hidden.
Internal: the archive filter pipeline moved into its own module
As the filtering grew to four composed dimensions, the
reason/assignee/date-range/search filters and their input coercion
were extracted from the LiveView into a dedicated
KanbanWeb.ArchiveLive.Filters module, keeping the
LiveView under the size cap and making the pure filter logic
unit-testable on its own.
Fixed
The footer no longer claims a read-only rule the system doesn't enforce
The archive footer stated that items become "read-only after 180 days," but no such rule exists — archived tasks remain restorable and deletable by anyone with edit access regardless of age. The copy was corrected to describe the actual behavior.
[2.6.0] - 2026-06-22
A two-week push reworked the Agents and Metrics pages from read-only summaries into usable operational consoles, and put every date they show on the viewer's local clock.
Added
The Agents page is now a fleet console
/agents was redesigned around actually operating a
fleet rather than glancing at a list. The roster now attributes
each agent to its human owner (derived from the
task's created_by/completed_by), so two
agents that share a model name are no longer indistinguishable,
and it is sorted by most recent activity instead
of alphabetically. Roster cards are clickable with a selected
state, and selecting an agent filters the activity feed; the kind
filter and the per-agent filter compose, and a clear/deselect
affordance resets either dimension.
A fleet-health rollup summarizes the fleet at a glance — working, idle, and stuck counts, with stuck surfaced as an explicit overlay — and a collapsible Dormant agents group classifies agents that have gone quiet, with their last-active time. The Delivery-trends band at the top was rebuilt to remove dead whitespace: a taller bar chart, enlarged stat values and labels, a prior-period trend indicator on the Completed-throughput figures, and the duplicated "Cycle time · avg" stat removed.
Selecting an agent opens a per-agent detail panel with collapsible category sections, a daily-activity sparkline, and a success-rate donut. The activity feed shows each row's avatar and owner, renders times in the user's timezone, and groups rows by date. The page is now mobile-friendly with a corrected scroll and a responsive layout.
The Workspace Metrics dashboard gained working controls and readable charts
/metrics picked up the controls its toolbar had only
mocked. A session-only board selector scopes the
workspace view to chosen boards (backed by a new
board_ids filter on
Kanban.Metrics.scoped_board_ids/1), and the
"Last 14 days" button is now a real time-range
selector driven by a configurable
:window_days option threaded through the workspace
metrics reads. The non-functional Filter
placeholder button was removed.
The charts became legible: the Throughput chart now plots per-day values with x-axis date labels and a y-axis scale, the Cumulative flow chart gained a y-axis scale, and the workspace cycle-time chart was simplified to a single cycle-time series.
Changed
Agents and Metrics compute every date on the viewer's local clock
Both pages previously bucketed by UTC / SQL
DATE(completed_at), so "today" and the day columns
could be off by a day for anyone west or east of UTC. The browser
timezone is now captured and threaded through the Agents and
Metrics LiveViews and their context reads, and day-bucketing —
throughput buckets, the dashboard's day grouping, the metrics
window boundaries, and completion grouping — was converted to
local time. The shared local-timezone helpers were extracted from
/agents into reusable modules so both pages share one
implementation. On /agents, the two "Completed today"
figures that could disagree were reconciled to a single
local-timezone computation, and the header today-counters were
made timezone-aware (with cycle time scoped to today). A
cross-timezone regression suite was added and every metrics
calculation audited for correctness.
Internal: Agents and Metrics contexts refactored
Kanban.Agents was split into focused modules —
Roster, Events, Detail, and
Metrics — as the page's derivations grew. The
per-metric LiveViews were deduplicated behind a shared
load_data flow and a shared legend_swatch
component, a shared board-scope query helper was extracted across
the agents, archives, and reviews contexts, and the
minutes-to-duration formatters were consolidated behind one shared
helper with per-site variants.
Fixed
-
Agents view didn't update live on task completion
— a missing
agents-topic PubSub broadcast meant the roster and feed went stale until a manual refresh. - The Throughput chart over-counted "today" — a timezone bug bucketed completions into the wrong day at the day boundary.
- The roster mislabeled review-stage agents as actively working on the wrong task, and sorted alphabetically instead of by recent activity.
- The agent avatar was missing from the All and Claims rows of the activity feed.
-
/agentsloaded slowly on large production datasets — the page's queries were profiled and fixed.
[2.5.0] - 2026-06-12
Added
Email confirmation is now required to sign in
Registration no longer logs the user in. Creating an account sends a confirmation email and lands the browser on a new public confirmation-pending page that shows the destination address, explains that the account has no access until the emailed link is clicked, and offers a resend button — throttled against abuse and deliberately neutral about whether an address has an account, so the endpoint cannot be used to enumerate emails or bomb arbitrary inboxes. The gate is enforced at every entry point: signing in with correct credentials is denied while the account is unconfirmed (with an explanatory message, and without issuing a session or remember-me cookie), and a pre-existing session for an unconfirmed account is turned away from authenticated pages by both the router plug and the LiveView mount hook, so neither full-page requests nor live navigation can slip past. The denial message appears only after the password has verified, keeping the login form enumeration-safe.
Accounts created before the gate shipped never needed to confirm,
so a data migration grandfathers them in as confirmed — existing
users sign in exactly as before, while every account registered
after the deploy goes through the email step. An end-to-end
integration test locks the whole journey together (register,
pending page, blocked login, confirmation link, onboarding,
successful sign-in), and docs/AUTHENTICATION.md now
documents the flow.
The post-confirmation page is a getting-started onboarding experience
Clicking a valid confirmation link no longer dead-ends on a bare
"account confirmed" message. The page now walks a new user through
getting productive as ordered steps: a copy-paste prompt for their
coding agent that points at the /api/agent/onboarding
endpoint to scaffold the .stride_auth.md and
.stride.md configuration files (with a one-click Copy
button), signing in, creating a first board, generating an API
token — with navigation copy matching the real UI (the Tokens tab
on an AI-optimized board) and a reminder that the token value is
shown only once — and inviting team members. The board-creation,
API-authentication, and team-member steps each link to their
resources guide, opening in a new tab so the user keeps their
place. Invalid and already-used confirmation links still redirect
to the login page with their existing messages, and the single-use
confirmation token never appears in the page or its URLs.
Fixed
Auth pages now display their status messages
The sign-in, registration, forgot/reset-password, confirmation, and confirmation-pending pages render inside a custom auth frame that never displayed flash messages — even the long-standing "Invalid email or password" denial was invisible, leaving every failed attempt looking like a silent bounce back to a blank form. The frame now renders error and info banners using the theme's contrast-checked status tokens, so denial reasons, confirmation notices, and resend feedback are actually visible in both light and dark mode.
All new user-facing copy across these flows is translated in the six non-English locales (de, es, fr, ja, pt, zh).
[2.4.0] - 2026-06-11
Added
Terms of Service and Acceptable Use Policy pages
The registration form's consent checkbox ("I agree to the Terms of
Service and Acceptable Use Policy — including the agent-action
attribution clause") previously pointed both policy links at the
Privacy Policy page, and the clause it names was not written down
anywhere. Two new public pages now back that checkbox:
/terms and /acceptable-use, both rendered
under the marketing layout alongside /privacy and
covered by controller tests.
The Terms of Service carries the standard sections — the service, accounts, content ownership (with an explicit commitment that workspace content is never used to train AI models), acceptable use (incorporating the AUP by reference), fees, termination, disclaimers, and limitation of liability — plus the binding definition of the agent-action attribution clause: every action an AI agent takes with an API token issued from an account (claiming a task, completing work, running a hook, posting a comment) is attributed to that account, and the holder accepts responsibility for it as if they had performed it themselves. The Acceptable Use Policy enumerates prohibited uses (illegal activity, security compromise, harming others, spam and malware, IP infringement, impersonation) and restates the attribution rule from the enforcement side — an agent acting outside the policy is a violation by the token-issuing account, even when the behavior was unintended — alongside API fair-use limits and the enforcement and reporting process.
Both registration checkbox links now navigate to the real pages, and all visible copy on both pages is fully translated in the six non-English locales (de, es, fr, ja, pt, zh).
Changed
Review queue: server-enforced review reports, richer detail pane, and reliable diffs
A series of changes since 2.3.0 hardened the review queue end to
end. The "fully populated review report" guarantee moved off the
agent plugins and onto the server: the completion endpoint now
rejects a dispatched review whose structured report is incomplete
or inconsistent with the task it describes — including project
checks that don't cover the full CODE-REVIEW.md
checklist — and the queue renders explicit warnings for any
remaining gap. This closed the recurring defects where project
checks arrived truncated and security considerations came back
"not assessed" on tasks that had supplied them.
The detail pane became richer and more truthful: new Security considerations and Review checks sections render alongside acceptance criteria, the code-review panel shows every project-check row, review status is derived from the reviewer's structured verdict instead of inferred from legacy issue counts, approved reviews no longer repeat their summary and report body, and raw JSON payloads are no longer rendered.
Per-file diffs are now delivered reliably and read cleanly: an optional base64 transport envelope on the changed-files endpoint lets code-bearing diffs through the production edge filter that was silently rejecting them, and the diff panel's highlighting and line spacing were tightened so patches read like blocks of source.
[2.3.0] - 2026-05-30
Changed
Strict completion validation is now the production default
The /complete endpoint's hard gate on
explorer_result and reviewer_result — the
API-level enforcement that rejects completions lacking evidence that
exploration and review happened — now runs in strict
mode by default in production. Through the grace-period soak the
:strict_completion_validation flag defaulted to
false, so validation failures were logged but the
request still proceeded; with the soak complete,
config/runtime.exs now defaults the flag to
true whenever the app boots in the :prod
environment. Development and test environments are unaffected and
continue to run in grace mode.
The STRIDE_STRICT_COMPLETION_VALIDATION environment
variable remains an explicit override in both directions: setting it
to false is the emergency rollback (production drops back
to grace mode on restart, with no schema migration to reverse), and
setting it to true forces strict mode in any
environment. The rollout record and rollback plan are documented in
docs/stride-plugin-enforcement-recommendations.md, where
"API-Level Enforcement" has moved from Remaining Recommendations to
the Implemented section.
[2.2.0] - 2026-05-30
Added
Stride plugin code-review results now display on the review queue
When the stride plugin's task-reviewer agent reviews a
task before completion, the verdict it produces — submitted as the
reviewer_result field on
PATCH /api/tasks/:id/complete — is now rendered in the
app instead of living only inside the API payload. A new shared
component surfaces it on the Review Queue for the selected task, and
the same panel is embedded in the task-detail review section and the
agent-handoff completion view, so a reviewer sees the same report
wherever a task is inspected.
The panel chooses one of three render branches from the task's review fields:
-
Structured — when
reviewer_resultcarries a structured payload, it renders the reviewer's findings grouped by severity (Critical / Important / Minor), each issue showing its category (correctness, security, testing, …) and description, so a human can scan what the automated review flagged at a glance. -
Fallback — when only the legacy
review_reportmarkdown is present, it renders that report as formatted HTML (via Earmark). - Empty — when a task has neither field, the panel renders nothing, so callers can embed it unconditionally.
[2.1.0] - 2026-05-24
Added
after_goal hook gates goal completion on agent confirmation
Stride goals now stay out of the Done column until the agent that
completed the goal's last child task reports back that its
after_goal hook ran successfully. When a child completion
(via PATCH /api/tasks/:id/complete or
PATCH /api/tasks/:id/mark_reviewed) is detected as the
goal's last open child, the parent goal flips into a new
:pending after_goal state inside the same transaction as
the child update — the goal is no longer auto-promoted to Done the
instant its last child closes. The completion response includes an
after_goal hook envelope so the agent knows to execute
the project's after_goal script (e.g. release notes,
deploy, post-goal cleanup) and POST the result back. A successful
report (exit_code: 0) promotes the goal to Done and
records the agent-reported result; a failure leaves the goal
pending so a human can intervene.
Concurrent sibling completions are serialized by a row-level lock
on the parent goal in Kanban.Tasks.GoalCompletion, so
exactly one sibling sees :last_child even when many
close simultaneously — duplicate after_goal envelopes
are not possible.
For backwards compatibility with agent plugins that don't yet
speak the after_goal protocol, an Oban-scheduled
grace worker (Kanban.AfterGoal.GraceWorker,
configurable via :after_goal_grace_window_seconds,
default 5 minutes) promotes any still-pending goal to Done with a
synthetic success result. This is a back-compat fallback, not the
happy path — the latest agent plugin (stride-marketplace
≥ 1.7.0) is required to participate in the hook proper and avoid
the grace-window delay on goal closure.
The workspace metrics dashboard gains two tiles for tracking the
rollout: after_goal adoption over the trailing 7
days (distinct boards with at least one non-grace-worker report)
and goal-to-Done latency percentiles (p50 / p95) over 14 days.
Both queries structurally exclude the grace-worker synthetic
attempt so adoption isn't inflated by the fallback path. A new
[:kanban, :api, :after_goal_delivered] telemetry
event fires from the single chokepoint reached by both completion
endpoints; the grace worker bypasses it.
Database: new after_goal_* tracking columns on
tasks (added by
20260522015833_add_after_goal_tracking_to_tasks) and
the standard Oban jobs table
(20260522015418_add_oban_jobs_table).
[2.0.3] - 2026-05-20
Changed
Review queue diff panel now renders patch content
The per-file diff area on /review
(KanbanWeb.ReviewDiffPanel.diff_content)
now renders unified-patch text with terminal-style row spacing
(line-height: 1.1) and theme-aware add/del highlighting.
Added rows render against the existing green --st-done-soft
token; deleted rows continue to use --st-blocked-soft.
Both classes consume CSS custom properties
(--stride-diff-add-bg, --stride-diff-del-bg)
so the highlight reads strongly in light mode and switches to a
higher-chroma overlay (oklch(30% 0.09 155 / 0.55) /
oklch(32% 0.10 25 / 0.55)) under
[data-theme="dark"] where the previous soft tokens were too
desaturated to read against the dark sunken surface.
Diff-header lines (---, +++) now classify as
del and add instead of a separate
file class, so the file-pair header band itself shows the
same red/green tinting as its hunk body — the eye picks up which side
of the diff each line belongs to at a glance.
[2.0.2] - 2026-05-19
Added
Blocked indicator on task cards
Task cards in any column now show a small red 🚫 icon next to the priority dot in the top row when
Task.status is :blocked. The other Task.status
values (:open, :in_progress, :completed) render nothing.
The icon uses the existing --st-blocked accent token so it shares the visual language of WIP-limit-exceeded and changes-requested cues, sized to 10×10px so the top row stays compact. A "Blocked" tooltip and matching
aria-label provide hover and screen-reader context.
No new fields or context calls — :status
already rides on the card via Map.from_struct(task) in
task_card_data/4. Three new tests cover the rendering (positive case,
:in_progress negative, status-absent negative).
Changed
Goal show page groups children by column instead of status
The per-section grouping on /boards/:id/goals/:goal_id
now buckets each child by the workflow column it currently lives in
(Backlog / Ready / Doing / Review / Done) rather than by Task.status.
The dedicated "Blocked" section introduced in 2.0.1 is gone — blocked children now appear inside whichever column section they sit in (Backlog, Doing, etc.) with the new per-card "Blocked" pill flagging their state. This collapses two related but separate axes (workflow stage vs. blocked-ness) into the single visual layout the rest of the app already uses.
Implementation: Tasks.Queries.list_children_for_goal/2
now preloads :column alongside :assigned_to and :parent.
KanbanWeb.GoalLive.Show
replaced group_by_status/1's Task.status
reducer with a new bucket_for/1
helper that maps task.column.name
to the section atom. The :blocked
plumbing added to @status_order, status_label/1,
status_dot/1, and flow_key/1
in 2.0.1 has been reverted since blocked tasks no longer need a separate bucket.
build_flow/1 simplified back to Map.new/2
(the multi-status-to-one-key collision the 2.0.1 reduce guarded against can't happen with the column-keyed groups).
[2.0.1] - 2026-05-19
Fixed
Goal show page hid blocked child tasks
Children of a goal whose Task.status was :blocked
never rendered on /boards/:id/goals/:goal_id. The page's
@status_order
enumeration in KanbanWeb.GoalLive.Show
included [:backlog, :ready, :in_progress, :review, :completed]
but omitted :blocked — status_sections/1
only emits a section for statuses in the order list, so any blocked child fell off the page silently even though the underlying
Tasks.list_children_for_goal/2
query returned it correctly.
:blocked
is now in @status_order
and renders as its own "Blocked" section using the existing
--st-blocked accent token. flow_key(:blocked)
rolls blocked work into the :backlog
segment of the progress bar so the existing
GoalProgressHeader
flow-key contract (backlog / ready / doing / review / done) is preserved.
build_flow/1 was rewritten with Enum.reduce + Map.update
so multiple statuses mapping to the same flow key now sum their counts instead of clobbering each other — without this, routing
:blocked
to :backlog
would have silently overwritten the real backlog count.
No data, API, or storage changes — the database always had blocked children, the goal page just wasn't rendering them.
[2.0.0] - 2026-05-19
The 2.0.0 release is a UI-tier overhaul. Two new workspace-level pages —
/agents and /review
— surface dimensions of the kanban data that previously required a board-by-board hunt, and the marketing and auth surfaces have been rebuilt against a shared design system with full theme-token and dark-mode support across all seven locales. The data, API, and workflow contracts are unchanged; clients that hit the JSON API see no behavior difference. The version bump reflects the surface-area shift, not a breaking API.
Added
New Agents view at /agents
Workspace-level page that surfaces every AI agent active across the user's workspace in one place. Composes three new presentational components —
KanbanWeb.AgentsHeader, KanbanWeb.AgentRosterCard, and
KanbanWeb.AgentActivityFeed
— into a two-column layout: the agent roster on the left (status, current task, recent throughput, capabilities) and a chronological activity feed on the right (claims, completions, hook results) windowed to the last 24 hours.
KanbanWeb.AgentsLive is a thin LiveView binding the Kanban.Agents
context output to the components — no Ecto queries in the LiveView module per the project's separation rule. Real-time updates flow over the
"agents"
PubSub topic; a debounced refresh (@refresh_debounce_ms
= 250ms) coalesces bursts of {:agent_event, _}
broadcasts so a flurry of completions does not redrive the agent queries on every message.
KanbanWeb.AgentsPresence
powers a "live · N connected" indicator showing how many agent sessions are currently online.
The page supports filter tabs (:all, :online, plus per-capability filters) routed through
handle_event/3 and persisted in the URL via push_patch. Auth lives in the
:require_authenticated_user
live_session — workspace data is never served to anonymous visitors.
New Review queue at /review
Workspace-level review queue replacing the per-board "tasks in Review" scrolling list. A two-pane layout: the queue list on the left (one
KanbanWeb.ReviewQueueItem
per pending task with a stats strip showing acceptance-criteria coverage, issue count, and reviewer dispatch state), the selected task's full detail on the right (KanbanWeb.ReviewDetailHeader,
KanbanWeb.ReviewStatsStrip, KanbanWeb.ReviewDiffPanel, the existing
KanbanWeb.AcceptanceChecklist).
KanbanWeb.ReviewLive
is a thin binding layer — all reads route through
Kanban.Reviews.list_pending_reviews/1 and Kanban.Reviews.queue_stats/1; approve and request-changes mutations route through
Kanban.Reviews.approve_review/3 and Kanban.Reviews.request_changes_review/3. No Ecto queries live in the LiveView module.
The Review page renders structured
reviewer_result
payloads (see the structured review-report contract below) when present, falling back to the legacy markdown
review_report
regex extraction for tasks completed before the rollout. Tasks completed via the no-subagent skip-form render via the existing summary-and-skip-reason layout. The render branch is detected via
if reviewer_result["issues"] is a list → structured; elsif review_report is non-empty → markdown fallback; else → empty
so old archived tasks keep displaying acceptably indefinitely.
Approve and request-changes are both single-click; request-changes opens an inline form (no modal navigation) that posts back into the same LiveView.
Marketing and auth surface refresh
Six marketing-site pages — landing, about, resources index, resources show, product, workflows, security, privacy — rebuilt against a shared editorial design language. New
KanbanWeb.AuthFrame
component standardizes the four auth surfaces (sign in, sign up, forgot password, reset password) on the same card-based layout.
KanbanWeb.UserLive.Settings
redesigned to use the same auth-card pattern. Every screen now passes dark-mode contrast verification: light text (oklch ~0.97) on dark backgrounds (oklch ~0.30) in dark mode, dark text (oklch ~0.21) on light backgrounds (oklch ~0.98) in light mode. The dark-mode color map (theme-aware daisyUI tokens —
text-base-content, bg-base-100, border-base-300) replaces hard-coded greys across every converted template.
The login screen is now fully responsive (mobile-first layout, breakpoint-aware spacing). Avatars across the board view display the owner's name on hover. Drag-and-drop on the board has been substantially improved — fewer jitter cases on column boundary crossing, smoother re-flow of remaining cards.
Structured review-report contract (G143 server-side)
Kanban.Tasks.CompletionValidation now optionally accepts a structured
reviewer_result payload alongside the legacy summary
+ integer-counts shape. New fields: schema_version
(semver string), status, issue_counts, issues[] (with
severity ∈ critical|important|minor and category ∈
acceptance_criteria|pitfall|pattern|testing|code_quality),
acceptance_criteria[] (with status ∈ met|not_met
— underscore form), and three section verdicts
testing_strategy / patterns / pitfalls
(each {status, notes?} with status ∈
passed|failed|not_assessed). All fields are optional — legacy payloads continue to validate unchanged. Unknown fields per entry are tolerated for forward compatibility. The
reviewer_result jsonb column persists the full payload verbatim;
KanbanWeb.API.TaskJSON round-trips it without filtering or allowlisting.
Full schema documented in
docs/api/patch_tasks_id_complete.md and via GET /api/agent/onboarding →
api_schema.reviewer_result_format. Plugin variants are tracked under G144 — the server accepts payloads from any client emitting the new shape, and the UI degrades to the markdown fallback for tasks completed by older clients.
Compatibility
No breaking API or schema changes. All JSON contracts, all column transitions, all hook timings, and all plugin-side payloads remain byte-for-byte compatible with 1.29.x clients. The 2.0.0 bump reflects the UI surface-area shift (two new workspace-level pages, a marketing-site rebuild, an auth-card overhaul, a theme-token migration) rather than any backwards-incompatible change at the API layer. Clients on older plugin versions continue to work unchanged; the
/review page renders their markdown review_report
via the legacy regex fallback.
[1.29.0] - 2026-05-08
Added
Goal-Driven Assignment Workflow (G88, G89, G90)
Three coordinated changes that make a goal's assigned_to_id
a meaningful boundary across the goal's full lifecycle. Previously, assigning a goal to a person was a no-op for the children — they stayed unassigned, were claimable by any agent, and a freshly added child created a new assignment hole. With this release, "the goal owner owns the goal's work" is a real invariant maintained automatically.
Cascading goal assignment to existing children (G88)
When a goal's assigned_to_id
is changed via the UI or API, the new assignment cascades atomically to every non-completed child task whose
assigned_to_id
differs from the new value. The cascade is performed inside an Ecto.Multi: goal update, all child updates, and per-task
assignment_history
rows commit together or roll back together. Each affected child broadcasts a
task_updated
event over PubSub so connected board LiveViews refresh in real time. Completed children are intentionally not touched. Unassigning a goal (setting
assigned_to_id
to nil) also propagates nil
to children — the goal-mirrors-children model holds in both directions.
The form_component LiveView now shows a flash after a goal save indicating how many children were also re-assigned:
"Task updated successfully. 3 child tasks were also updated."
Translated via ngettext
for all 7 supported locales. Suppressed when zero children were affected.
Restricting task claiming to the assigned user (G89)
Tasks with a non-nil assigned_to_id
are now visible and claimable ONLY by the named user.
GET /api/tasks/next
automatically filters out assigned-to-others tasks for each agent.
POST /api/tasks/claim
against an explicit identifier assigned to another user returns
403 Forbidden
with {"error": "This task is assigned to a different user"}. The gate is enforced atomically inside the SQL
update_query
of perform_claim/4, so two concurrent agents cannot race past it. Unassigned tasks (assigned_to_id IS NULL) remain claimable by anyone — fully backwards compatible.
A new error variant :assigned_to_other_user
is documented in the agent onboarding catalog (agent_json.ex
common_mistakes_agents_make) with a corresponding
ErrorDocs
clause linking to the AI workflow guide. Recommended remediation: skip the task and call
GET /api/tasks/next
again — the queue endpoint automatically excludes assigned-to-others tasks.
Inheriting goal's assignment when a new child is added (G90)
When Tasks.create_task/2
is called with a parent_id
referencing an assigned goal AND attrs do NOT explicitly set assigned_to_id, the new task inherits the goal's
assigned_to_id
at creation time. The same rule applies to children created inside Tasks.create_goal_with_tasks/3. Explicit
assigned_to_id
values in attrs always win — including explicit nil
— so the inheritance only fills the gap when the caller did not specify an assignee. Defensive against missing parent rows and non-goal parents: both are silent no-ops.
Changed
-
Kanban.Tasks.AgentQueries.get_next_task/3andget_specific_task_for_claim/4accept an optionaluser_idparameter (defaults tonil). When supplied, the query filters out tasks assigned to other users. Passingnilpreserves the legacy unfiltered behavior — existing callers are unaffected. -
Kanban.Tasks.Lifecycle.update_task/2now branches ontask.type == :goal AND assigned_to_id changedto dispatch to a new atomic-Multipath. Non-goal updates retain the originalRepo.update-then-side-effects flow exactly. Return shape ({:ok, %Task{}} | {:error, %Ecto.Changeset{}}) is unchanged so all existing callers (form_component.ex,task_controller.ex,positioning.ex) work without modification. -
Kanban.Tasks.Creation.create_task/2now callsmaybe_inherit_assignment_from_parent/1beforeinsert_task_with_history. Tasks withoutparent_idare unaffected.
[1.28.1] - 2026-04-14
Security
Prevent Agents from Bypassing Workflow via Column Reassignment
Agents were able to move tasks from Backlog directly to Ready by sending
PATCH /api/tasks/:id
with a new column_id, then claiming the task — bypassing the human review gate that gates which tasks are available for AI work. Two production incidents of this behavior were observed.
The API update
endpoint now rejects any request that attempts to change a task's column_id, returning
403 Forbidden
with a message directing callers to the proper workflow endpoints (claim, complete, mark_reviewed, mark_done). Echoed matching values are silently stripped so honest round-trip clients are unaffected. A new
[:kanban, :api, :task_update_column_change_forbidden]
telemetry event fires on every rejected attempt for monitoring.
Column transitions for agents are now strictly limited to:
-
POST /tasks/claim— Ready → Doing (still verifies the task is in Ready) -
PATCH /tasks/:id/complete— Doing → Review -
PATCH /tasks/:id/mark_reviewed— review approval -
PATCH /tasks/:id/mark_done— → Done
Human users dragging tasks in the LiveView UI are unaffected — that flow uses a separate code path and is not subject to the restriction.
[1.28.0] - 2026-04-13
Added
Stride Workflow Orchestrator and Enforcement Gates (All Plugins)
-
New
stride-workfloworchestrator skill — A single skill that replaces the pattern of remembering to invoke 6+ separate skills at specific moments. Agents invoke it once and follow the complete lifecycle: claim → explore → implement → review → hooks → complete → loop. Includes a decision matrix for when to explore, plan, and review based on task complexity and key_files count. Platform-adaptive with dual paths for Claude Code (subagent dispatch) and other environments (manual exploration/review). -
Claiming gate
— All claiming skills now include a non-negotiable "YOUR NEXT STEP" section demanding
stride-workflowinvocation after claiming. Catches agents that skip the orchestrator. - Completion verification checklist — All completing skills now include a 4-item checklist before the completion endpoint: (1) Did you activate stride-workflow? (2) Did you explore the codebase? (3) Did you review changes against acceptance criteria? (4) Are you ready for the after_doing hook?
-
Reframed automation notices
— All
AUTOMATION NOTICEsections rewritten from "work continuously without stopping" to "the workflow IS the automation — every step exists because skipping it caused failures."
Three layers of defense-in-depth: orchestrator guides every step → claiming gate catches orchestrator skippers → completion checklist catches everyone else.
Plugin Releases
| Plugin | Version | Changes |
|---|---|---|
| stride (Claude Code) | 1.7.0 | Orchestrator, reframed notices, claiming gate, verification checklist |
| stride-copilot | 2.3.0 |
Same changes, adapted for Copilot's activate syntax
|
| stride-gemini | 1.3.0 | Same changes, with tool.execute hook integration |
| stride-codex | 1.2.0 | Same changes, with graceful fallback for agents |
| stride-opencode | 1.2.0 | Same changes, with tool.execute hook integration |
Generic Skills for File-Based Platforms (Cursor, Windsurf, Continue.dev, Kimi Code)
Cursor, Windsurf, Continue.dev, and Kimi Code do not support dedicated plugin repos — they use file-based skill discovery. Previously, these platforms were told to install 4 generic Claude Code skills with no stride-workflow, no enforcement gates, and no enriching/subagent-workflow skills.
-
7 generic SKILL.md files
hosted at
docs/multi-agent-instructions/skills/— tool-agnostic versions of all Stride skills adapted from the v1.7.0 plugin, including stride-workflow orchestrator with all enforcement enhancements. Each file hascompatibility: cursor, windsurf, continue, kimifrontmatter and dual-path design (Claude Code subagent dispatch vs. manual exploration/review). -
Onboarding endpoint enhanced
— The
GET /api/agent/onboardingresponse now provides platform-specific download instructions:-
Cursor:
skills_providedwith all 7 skills, curl download commands for.cursor/skills/, PowerShell Windows commands -
Windsurf: Same pattern with
.windsurf/skills/paths -
Continue.dev: Same pattern with
.continue/skills/paths (Continue.dev added SKILL.md support in Jan 2026), existingconfig.jsonpreserved as supplemental - Kimi Code: Enhanced AGENTS.md with condensed orchestrator steps, 4-item verification checklist, and process-over-speed messaging
-
Cursor:
-
claude_code_skills.skills_includedupdated from 4 to 7 skills. Allusage_notesandmemory_strategyentries updated. All "4 skills" references replaced throughout.
Changed
- All documentation updated to reference stride-workflow as the primary entry point: AI-WORKFLOW.md, GETTING-STARTED-WITH-AI.md, MULTI-AGENT-INSTRUCTIONS.md, REVIEW-WORKFLOW.md, AGENT-HOOK-EXECUTION-GUIDE.md, STRIDE-SKILLS-PLAN.md, onboarding endpoint docs
-
Enforcement recommendations document (
docs/stride-plugin-enforcement-recommendations.md) updated to mark items 1-5 as completed across all plugins
[1.27.0] - 2026-03-26
Added
Stride OpenCode Plugin (stride-opencode)
Full Stride plugin for OpenCode, providing 6 skills, 4 agents, and a native TypeScript plugin for automatic hook execution. Published at cheezy/stride-opencode.
-
TypeScript plugin
— Native hook execution engine using OpenCode's
tool.execute.beforeandtool.execute.afterevents. Automatically detects Stride API calls, routes to the correct.stride.mdsection, and executes commands sequentially. Blocks completion onafter_doingfailure. -
.stride.mdparser — Dedicated parser module handling CRLF/LF line endings, empty code blocks, comments, adjacent sections, and files without trailing newlines. - Environment variable caching — Automatically extracts task metadata from claim API responses and makes them available in subsequent hooks within the same session.
-
6 OpenCode-adapted skills
— All Stride workflow skills ported with OpenCode frontmatter, tool names, and
tool.execute.before/tool.execute.afterhook event references. - 4 custom agents — Task explorer, reviewer, decomposer, and hook diagnostician with OpenCode agent frontmatter.
-
npm distribution
— Installable via
opencode.jsonplugin array or locally via install script. -
49 passing tests
— Comprehensive test suite using
bun:testcovering parser, hook routing, command filtering, and environment extraction.
Stride Codex CLI Plugin (stride-codex)
Full Stride plugin for OpenAI Codex CLI, providing 6 skills and 4 subagents with manual hook execution. Published at cheezy/stride-codex.
-
6 Codex-adapted skills
— All automatic hook sections removed — manual hook execution is the only path. Skills instruct the agent to read
.stride.mdand execute each command directly via shell. - 4 subagents — Task explorer, reviewer, decomposer, and hook diagnostician with Codex agent frontmatter.
-
Install script
— One-liner installation supporting global (
~/.agents/) and project-local (.agents/) modes. - AGENTS.md — Codex configuration bridge with skill activation rules, tool name mapping, and manual hook execution instructions.
Stride Copilot Plugin Updates (stride-copilot v2.0.0 → v2.1.0)
Restructured the Copilot plugin for copilot plugin install
support and added automatic hook execution.
-
Automatic hook execution
— Added
hooks/hooks.jsonandhooks/stride-hook.shthat intercept Stride API calls and execute.stride.mdsections automatically. -
PowerShell support
— Added
hooks/stride-hook.ps1companion script for native Windows. Platform detection auto-delegates from bash to PowerShell. -
Test suites
—
test-stride-hook.sh(67 tests) andtest-stride-hook.ps1(70 assertions) covering JSON extraction, parsing, integration, and edge cases. -
Repository restructured
— Skills and agents moved from
.github/to root-level directories forcopilot plugin installsupport.
Stride Gemini Extension Updates (stride-gemini v1.1.0)
Added automatic hook execution to the Gemini CLI extension.
-
Automatic hook execution
— Added
hooks/hooks.jsonregisteringBeforeTool/AfterToolhooks onrun_shell_command. All non-JSON output goes to stderr (Gemini requires JSON-only stdout). -
PowerShell support
— Added
hooks/stride-hook.ps1for Windows compatibility with PowerShell 5.1+ and 7+. -
Test suites
—
test-stride-hook.sh(67 tests) andtest-stride-hook.ps1(70 assertions). - GEMINI.md updated — Hook execution section now documents automatic hooks vs manual fallback.
Changed
-
Onboarding endpoint updated
—
GET /api/agent/onboardingnow includes dedicated entries for OpenCode and Codex CLI with plugin repos, skills/agents lists, and platform-specific installation instructions. - Getting started guide updated — Added OpenCode and Codex CLI installation sections.
- Hook execution guide updated — Documented OpenCode's TypeScript plugin automatic hook execution and Codex CLI's manual hook execution approach.
- API documentation updated — Onboarding endpoint docs reflect OpenCode and Codex formats in the response.
[1.26.0] - 2026-03-24
Added
Automatic Stride Hook Execution via Claude Code Hooks (Stride Plugin v1.5.0)
Stride .stride.md
hooks now execute automatically through Claude Code's hook system, eliminating all permission prompts. Previously, every hook command (git pull, mix test, mix credo, git commit, etc.) triggered a CLI permission dialog because commands ran through Claude's Bash tool. The new system runs hooks as shell processes on the harness, bypassing the tool permission layer entirely.
-
hooks/stride-hook.sh— Generic bridge script that parses any user's.stride.mdfile, detects Stride API calls in Bash tool commands, routes to the correct hook section, and executes each uncommented command sequentially. Exits 2 on failure to block tool calls in PreToolUse context. -
hooks/hooks.json— Plugin hook configuration that activates automatically when the Stride plugin is enabled. No user settings changes needed. -
Environment variable caching
— Task metadata (
$TASK_IDENTIFIER,$TASK_TITLE,$TASK_ID, etc.) is extracted from the claim API response and cached for use by all subsequent hooks in the lifecycle. Cache is cleaned up after theafter_reviewhook. -
Structured JSON diagnostics
— On both success and failure, the hook script emits structured JSON with hook name, command sequence, exit codes, and stdout/stderr. On failure, includes
commands_completed,commands_remaining, and the specificfailed_commandfor precise diagnosis. -
Hook-diagnostician update
— The
stride:hook-diagnosticianagent now accepts both structured JSON from Claude Code hooks and raw text from the legacy agent-executed flow, with command sequence context (PASSED/FAILED/SKIPPED) in its fix plans.
| Claude Code Event | API Pattern | Stride Hook |
|---|---|---|
| PostToolUse (Bash) |
/api/tasks/claim
|
before_doing
|
| PreToolUse (Bash) |
/api/tasks/:id/complete
|
after_doing (blocks on failure)
|
| PostToolUse (Bash) |
/api/tasks/:id/complete
|
before_review
|
| PostToolUse (Bash) |
/api/tasks/:id/mark_reviewed
|
after_review
|
Stride Copilot Extension (GitHub Copilot)
Stride skills have been ported to GitHub Copilot's agent mode, distributed as a
.github/copilot-instructions.md
configuration with prompt files. This enables Copilot-powered agents to follow the full Stride workflow (claim → implement → complete) with proper hook execution and API field formats.
-
6 Prompt Files
— All six Stride workflow skills adapted for Copilot's prompt file system:
stride-claiming-tasks,stride-completing-tasks,stride-creating-tasks,stride-creating-goals,stride-enriching-tasks, andstride-subagent-workflow. -
Copilot instructions file
—
.github/copilot-instructions.mdbridge file with mandatory skill activation rules, workflow sequence, API authorization, and hook execution guidelines.
Stride Gemini Extension (Google Gemini CLI)
Stride skills and custom agents have been ported to Google Gemini CLI's extension format, distributed as a standalone repository installable via gemini extensions install. This brings full Stride workflow support — including custom agents for codebase exploration, code review, goal decomposition, and hook failure diagnosis — to Gemini CLI users.
-
6 Skills
— All six Stride workflow skills adapted for Gemini CLI conventions:
stride-claiming-tasks,stride-completing-tasks,stride-creating-tasks,stride-creating-goals,stride-enriching-tasks, andstride-subagent-workflow. -
4 Custom Agents
— Specialized Gemini CLI agents for task lifecycle support:
task-explorer,task-reviewer,task-decomposer, andhook-diagnostician. -
GEMINI.mdbridge file — Always-on context with skill activation rules, custom agent references, workflow sequence, API authorization, and tool name mapping table. -
Extension repository
— Published at
cheezy/stride-geminiwith README, LICENSE (MIT), and CHANGELOG.
Changed
-
Multi-agent instructions updated
—
docs/MULTI-AGENT-INSTRUCTIONS.mdupdated with Google Gemini CLI extension installation instructions, 6 skills and 4 custom agents listing, and format-specific adaptation notes for the Gemini extension. -
Getting started guide updated
—
docs/GETTING-STARTED-WITH-AI.mdupdated with a new "Install the Stride Extension (Gemini CLI)" subsection includinggemini extensions installcommand and verification instructions.
[1.25.0] - 2026-03-17
Added
Review Report Field for Task-Reviewer Agent Traceability
-
Review Report database field
- Added
review_reporttext column to the tasks table via Ecto migration, enabling structured review findings from the task-reviewer agent to be persisted on task records. -
Task schema and changeset
- Added
field :review_report, :stringto the Task schema near existing review fields (review_notes,review_status). Included in both the general changeset cast list intask.exand thecomplete_taskcast list inagent_workflow.exas an optional field (not invalidate_required). -
API JSON serializer
- Added
review_reportto the task JSON response intask_json.ex, placed betweenreview_notesandreviewed_atfor consistent grouping with other review fields. The field is returned in all task API responses (GET /api/tasks,GET /api/tasks/:id,GET /api/tasks/next,PATCH /api/tasks/:id/complete, etc.). -
Complete endpoint accepts review_report
- The
PATCH /api/tasks/:id/completeendpoint now accepts an optionalreview_reportparameter, allowing agents to submit structured review findings at task completion time. Backward compatible — existing completions withoutreview_reportcontinue to work. -
Task detail UI display
- Added a conditional review report section to the task detail
ViewComponent, rendered between the Review Status and Completion sections.
[1.24.0] - 2026-03-12
Added
Human Task Field
-
Human Task database field
- Added
human_taskboolean column to the tasks table (default:false), allowing tasks to be explicitly marked as requiring human workers rather than AI agents. -
Agent query filtering
- AI agent task discovery (
GET /api/tasks/next) now automatically excludes tasks marked ashuman_task: true, ensuring agents only claim work appropriate for automated processing. Bothget_next_taskandget_specific_task_for_claimqueries enforce this filter.
Stride Plugin (Claude Code Marketplace)
Stride's Claude Code skills have been extracted from the project's
.claude/skills/
directory into a standalone plugin distributed via the Claude Code marketplace (cheezy/stride-marketplace).
This enables any project using Stride to install the skills with two commands instead of manually copying files.
-
6 Skills
— The plugin ships with six mandatory workflow skills:
-
stride-claiming-tasks— Task discovery and claiming withbefore_doinghook execution andbefore_doing_resultcapture -
stride-completing-tasks— Dual-hook completion workflow (after_doing+before_review) with all required API fields -
stride-creating-tasks— Comprehensive task creation with validated field formats (verification_steps as objects, key_files as objects, testing_strategy with arrays) -
stride-creating-goals— Goal and batch creation with correct"goals"root key and dependency management -
stride-enriching-tasks— 4-phase codebase exploration that transforms minimal task specs into full implementation-ready specifications -
stride-subagent-workflow— Decision matrix for dispatching exploration, planning, review, and decomposition agents based on task complexity
-
-
4 Custom Agents
(Claude Code only) — Specialized subagents that handle focused tasks autonomously:
-
stride:task-explorer— Reads key_files, finds related tests, searches for patterns, returns structured codebase context before implementation -
stride:task-reviewer— Reviews git diff against acceptance criteria, pitfalls, and patterns; categorizes issues as Critical/Important/Minor -
stride:task-decomposer— Breaks goals and large tasks into dependency-ordered child tasks with full specifications -
stride:hook-diagnostician— Parses hook failure output across 6 failure categories and returns a prioritized fix plan
-
-
Mandatory skill chain
— Skills enforce a strict invocation order:
claiming → subagent-workflow → [implementation] → completing. Each skill documents the exact API fields and hook results required at that lifecycle point. Skipping a skill results in API rejections or hours of rework. -
Skills version tracking
— All claim and complete API requests now include a
skills_versionfield. The API returnsskills_update_requiredwhen the agent's skills are outdated, prompting automatic plugin updates. -
All hooks now blocking
—
before_reviewandafter_reviewhooks are now blocking (previously non-blocking). All four hooks must succeed before their associated API calls proceed.
Changed
-
Onboarding endpoint updated
—
GET /api/agent/onboardingnow reflects the current skill requirements:identifierfield (nottask_id) for claims,outputfield (notstdout/stderr) for hook results, and all required completion fields (completion_summary,actual_complexity,actual_files_changed,after_doing_result,before_review_result). -
Multi-agent instruction files updated
— All 7 flat instruction files in
docs/multi-agent-instructions/(SKILL.md, AGENTS.md, copilot-instructions.md, GEMINI.md, cursorrules.txt, windsurfrules.txt, continue-config.json) synced with the current skill definitions: blocking hooks, correct claim/complete request formats, and all required fields.
[1.23.0] - 2026-02-25
Added
- Promote Goal to Ready - Goals in the Backlog column that have child tasks also in the Backlog now display a right-pointing arrow icon next to the priority badge. Clicking the arrow moves the goal and all of its backlog children to the Ready column in a single action, with proper status updates and move history tracking.
[1.22.0] - 2026-02-08
Added
Lean Metrics Dashboard System
-
Comprehensive Metrics Dashboard
- AI-optimized boards now feature a complete lean metrics tracking system for measuring and optimizing workflow performance:
-
Metrics Dashboard
(
/boards/:id/metrics) - Centralized overview displaying all key performance indicators with real-time data - Summary Cards - Four metric categories with at-a-glance statistics (average, median, P90)
- Quick Navigation - Jump to detailed views for each metric category
- Board Navigation - Easy return to kanban board from metrics views
-
Metrics Dashboard
(
-
Throughput Metrics
- Track task completion velocity over time:
- Daily Completion Count - Number of tasks completed each day
- Completion Trend Visualization - Line chart showing throughput patterns
- Day-by-Day Breakdown - Expandable list of completed tasks grouped by date
- Task Details - View identifier, title, complexity, agent, and completion time
- Statistics - Average, median, and 90th percentile throughput calculations
- Empty State Handling - Informative message when no completions exist
-
Cycle Time Metrics
- Measure time from work start to completion:
- Doing → Done Duration - Track how long tasks spend in active development
- Distribution Analysis - Understand typical cycle time patterns
- Task-Level Details - View claimed time, completed time, and total duration
- Agent Attribution - See which agent worked on each task
- Statistics - Average, median, and P90 cycle time in hours/days
- Grouped Display - Tasks organized by completion date
-
Lead Time Metrics
- Track total time from creation to completion:
- Created → Done Duration - Full lifecycle tracking from backlog to done
- End-to-End Visibility - Understand complete workflow efficiency
- Task Timeline - View creation time, completion time, and total duration
- Agent Tracking - Identify which agent completed each task
- Statistics - Average, median, and P90 lead time calculations
- Date Grouping - Tasks organized by completion date
-
Wait Time Metrics
- Identify human bottlenecks in the workflow:
- Review Wait Time - Time tasks spend waiting for human review after completion
- Backlog Wait Time - Time tasks spend in backlog before being claimed
- Bottleneck Identification - Pinpoint where tasks wait for human intervention
- Dual Wait Type Tracking - Separate views for review delays vs backlog delays
- Task Details - View timestamps, durations, and responsible agents
- Statistics - Average, median, and P90 wait times for each category
-
Advanced Filtering System
- Flexible data analysis across all metrics:
- Time Range Filter - Today, last 7 days, last 30 days, last 90 days, or all time
- Agent Filter - Filter metrics by specific AI agent (e.g., "Claude Sonnet 4.5")
- Weekend Exclusion - Toggle to exclude weekends from calculations
- Persistent Filters - Filter selections maintained across metric views
- Agent Dropdown - Auto-populated with agents who have completed or created tasks
PDF Export for Metrics
-
Print-Optimized PDF Export
- Export all metrics to professionally formatted PDF documents:
- Data Tables - Structured tables with all task details and metrics
- Statistics Summary - Summary statistics prominently displayed in reports
- Filter Preservation - Applied filters reflected in exported data
- One-Click Export - Simple export button on each metrics page
[1.21.2] - 2026-02-03
Added
GitHub Copilot, Cursor, Windsurf, Gemini, OpenCode, and Kimi Code CLI AI Assistant Support
Multi-Agent Integration Expansion - Added comprehensive support for GitHub Copilot agent skills, Cursor agent skills, Windsurf agent skills, Gemini Code Assist skills, OpenCode, and Kimi Code CLI (k2.5):
GitHub Copilot (Claude Code Skills Compatible):
-
Uses Claude Code Skills: GitHub Copilot now automatically discovers skills in
.claude/skills/directories, eliminating the need for separate Copilot-specific content - 4 Stride Skills: Reuses the same skills as Claude Code (stride-claiming-tasks, stride-completing-tasks, stride-creating-tasks, stride-creating-goals)
- On-Demand Loading: Skills are loaded when invoked, reducing token usage compared to always-active instructions
-
Automatic Discovery: GitHub Copilot discovers skills in
.claude/skills/directories - Zero Duplication: One set of skills works for Claude Code, GitHub Copilot, Cursor, Windsurf, Gemini, and OpenCode users
- Agent Skills Feature: Leverages GitHub Copilot's new agent skills capability announced December 2024
Cursor (Claude Code Skills Compatible):
-
Uses Claude Code Skills: Cursor now automatically discovers skills in
.claude/skills/directories, eliminating the need for separate Cursor-specific content - 4 Stride Skills: Reuses the same skills as Claude Code (stride-claiming-tasks, stride-completing-tasks, stride-creating-tasks, stride-creating-goals)
- On-Demand Loading: Skills are loaded when invoked, reducing token usage compared to always-active instructions
-
Automatic Discovery: Cursor discovers skills in
.claude/skills/(and.cursor/skills/or.codex/skills/) directories - Zero Duplication: One set of skills works for Claude Code, GitHub Copilot, Cursor, Windsurf, Gemini, and OpenCode users
- Agent Skills Feature: Leverages Cursor's agent skills capability
Windsurf (Claude Code Skills Compatible):
-
Uses Claude Code Skills: Windsurf now automatically discovers skills in
.windsurf/skills/directories, eliminating the need for separate Windsurf-specific content - 4 Stride Skills: Reuses the same skills as Claude Code (stride-claiming-tasks, stride-completing-tasks, stride-creating-tasks, stride-creating-goals)
- On-Demand Loading: Skills are loaded when invoked, reducing token usage compared to always-active instructions
-
Automatic Discovery: Windsurf discovers skills in
.windsurf/skills/directories - Zero Duplication: One set of skills works for Claude Code, GitHub Copilot, Cursor, Windsurf, Gemini, and OpenCode users
- Agent Skills Feature: Leverages Windsurf's agent skills capability
Gemini Code Assist (Claude Code Skills Compatible):
-
Uses Claude Code Skills: Gemini Code Assist now automatically discovers skills in
.gemini/skills/directories, eliminating the need for separate Gemini-specific content - 4 Stride Skills: Reuses the same skills as Claude Code (stride-claiming-tasks, stride-completing-tasks, stride-creating-tasks, stride-creating-goals)
- On-Demand Loading: Skills are loaded when invoked, reducing token usage compared to always-active instructions
-
Automatic Discovery: Gemini discovers skills in
.gemini/skills/directories with three-tier discovery (workspace, user, extension) - Zero Duplication: One set of skills works for Claude Code, GitHub Copilot, Cursor, Windsurf, Gemini, and OpenCode users
- Agent Skills Feature: Leverages Gemini's agent skills capability following the Agent Skills standard
OpenCode (Claude Code Skills Compatible):
-
Uses Claude Code Skills: OpenCode automatically discovers skills in
.claude/skills/directories, eliminating the need for separate OpenCode-specific content - 4 Stride Skills: Reuses the same skills as Claude Code (stride-claiming-tasks, stride-completing-tasks, stride-creating-tasks, stride-creating-goals)
- On-Demand Loading: Skills are loaded when invoked, reducing token usage compared to always-active instructions
-
Automatic Discovery: OpenCode searches
.claude/skills/,.opencode/skills/, and~/.config/opencode/skills/directories - Zero Duplication: One set of skills works for Claude Code, GitHub Copilot, Cursor, Windsurf, Gemini, and OpenCode users
Kimi Code CLI (k2.5):
- AGENTS.md Instruction File: Uses existing AGENTS.md file (~15KB, ~400 lines) with complete Stride integration guidelines
- Always-Active Loading: Instructions are loaded automatically when Kimi starts
- Append-Mode Installation: Can append Stride instructions to existing AGENTS.md content
-
Project-Local: Installed in project root
./AGENTS.md
Onboarding Endpoint Integration: Updated GitHub Copilot, Cursor, and Windsurf formats, and added OpenCode and Kimi formats to
/api/agent/onboarding
multi_agent_instructions section with appropriate installation commands
Supported AI Assistants (8 Total):
-
Claude Code (Skills -
claude_code_skillssection) -
GitHub Copilot
(
.claude/skills/<skill-name>/SKILL.md- uses Claude Code skills) -
Cursor
(
.claude/skills/<skill-name>/SKILL.md- uses Claude Code skills) -
Windsurf
(
.windsurf/skills/<skill-name>/SKILL.md- uses Claude Code skills) -
Gemini Code Assist
(
.gemini/skills/<skill-name>/SKILL.md- uses Claude Code skills) -
OpenCode
(
.claude/skills/<skill-name>/SKILL.md- uses Claude Code skills) - Continue.dev (
.continue/config.json) - Kimi Code CLI (k2.5) (
AGENTS.md)
Note: Claude Code has its own dedicated claude_code_skills
section in the onboarding endpoint. The multi_agent_instructions
section provides 7 formats for the other assistants. Claude Code, GitHub Copilot, Cursor, Windsurf, Gemini, and OpenCode share the same skill-based system with on-demand loading. Continue.dev and Kimi use traditional always-active instruction files.
[1.21.1] - 2026-01-26
Fixed
Automatic Task Status Synchronization
Task Status Now Syncs Automatically When Moving Between Columns - Fixed data inconsistency issue where task status could be out of sync with column position:
-
Ready/Backlog Columns: Automatically sets
status: :openand clearscompleted_at -
Doing/Review Columns: Automatically sets
status: :in_progressand clearscompleted_at -
Done Column: Automatically sets
status: :completedand setscompleted_attimestamp -
Preserves Timestamps: When task already has
completed_atset, preserves the original timestamp - Impact: Eliminates the inconsistency where agents sometimes failed to update status when completing tasks, ensuring column position and status always match
[1.21.0] - 2026-01-23
Added
Read-Only Board Sharing
Public Board Sharing - Board owners can now share boards publicly for read-only access:
- Read-Only Checkbox: Added "Make board publicly readable" checkbox to board edit form
- Public Access: Any signed-in user can view boards marked as read-only
[1.20.0] - 2026-01-19
Added
Google Gemini Code Assist Support
Multi-Agent Integration Expansion - Added comprehensive support for Google Gemini Code Assist as the fifth supported AI coding assistant:
- GEMINI.md Instruction File: Created Markdown-formatted instruction file with complete Stride integration guidelines
-
Hierarchical Context Support: Supports project-scoped, global (
~/.gemini/GEMINI.md), and component-level context files - Impact: Gemini Code Assist users can now leverage Stride's workflow enforcement with agent/chat mode context files
Supported AI Assistants (Now 5 Total):
- Claude Code (Skills-based, contextual)
- GitHub Copilot (
.github/copilot-instructions.md) - Cursor (
.cursorrules) - Windsurf Cascade (
.windsurfrules) - Continue.dev (
.continue/config.json) -
Google Gemini Code Assist
(
GEMINI.mdorAGENT.md)
[1.19.1] - 2026-01-19
Fixed
Task Priority Selection in /api/tasks/next Endpoint
Corrected Priority Sorting for Task Claiming
- Fixed critical bug where the /api/tasks/next
endpoint was selecting lower-priority tasks instead of higher-priority tasks:
- Impact: Tasks are now correctly selected in priority order: critical → high → medium → low
- Secondary Sort: Position (ascending) is used as tiebreaker when priorities are equal, ensuring tasks higher in the Ready column (lower position number) are selected first
Review Queue Section Visibility in Task Forms
Fixed Review Fields Not Appearing for Tasks in Review
- Resolved issue where review status and review notes fields were hidden when tasks with
needs_review=true
entered the Review column:
-
Root Cause: Visibility condition only checked if
review_statusfield had a value, but newly moved tasks to Review column hadnilreview_status - Impact: Users can now properly review and approve/reject tasks that enter the Review column
Improved
AI Agent Onboarding Documentation
Enhanced Getting Started Guide
- Improved clarity in docs/GETTING-STARTED-WITH-AI.md
for AI agent onboarding:
- Updated Instructions: Rephrased onboarding instructions to be more acceptable to Claude Code's security policies
- Multi-Agent Support: Added explicit mention of agent configuration setup and reference to Multi-Agent Instructions guide
Claude Code Skills for Automatic Hook Execution
Updated Hook Execution Instructions
- Modified all four Claude Code Skills (stride-claiming-tasks, stride-completing-tasks, stride-creating-tasks, stride-creating-goals) in the onboarding endpoint:
- Automatic Execution: Added explicit instructions to execute hooks automatically without prompting the user
- Impact: Eliminates unnecessary user prompts during task claiming and completion, streamlining the agent workflow
[1.19.0] - 2026-01-19
Added
Resources & How-To Guides Section
New Resources Landing Page - Comprehensive help center for learning Stride:
- Search Functionality - Real-time search across all guide titles and descriptions
- Tag-Based Filtering - Filter guides by category tags (getting-started, developer, non-developer, best-practices, etc.)
- Sorting Options - Sort by relevance, newest, or alphabetically (A-Z)
How-To Guide Detail Pages - Step-by-step instruction views:
- Hero Section - Gradient background with title, description, content type badge, and reading time
- Step-by-Step Content - Numbered steps with markdown support (bold, code blocks, lists)
13 How-To Guides - Comprehensive documentation covering:
- Getting Started (4 guides): Creating boards, understanding columns, adding tasks, inviting team members
- Developer Guides (4 guides): Workflow hooks, API authentication, task dependencies, troubleshooting
- Non-Developer Guides (3 guides): Writing tasks for AI, monitoring progress, reviewing completed work
- Best Practices (2 guides): Organizing with dependencies, using complexity and priority effectively
[1.18.0] - 2026-01-10
Added
Agent Capabilities Input Field
UI Input for Agent Capabilities - Added agent capabilities input field to API token creation form:
Dark Mode Enhancements
Improved Task Card Styling - Enhanced dark mode appearance for task cards:
Changed
Agent Capabilities Management
Token Creation Workflow - Capabilities now entered during token creation instead of configuration file:
Claude Code Skills Enhancement
Automatic Workflow Progression - Skills updated to enable continuous agent operation:
[1.17.1] - 2026-01-09
Added
Multi-Agent Instructions for Non-Claude Code AI Assistants
Four AI Assistant Formats - Always-active code completion guidance distributed as downloadable files:
-
GitHub Copilot
(
.github/copilot-instructions.md) - Repository-scoped instructions optimized for 4000 token limit -
Cursor
(
.cursorrules) - Project-scoped rules with expanded examples for 8000 token limit -
Windsurf Cascade
(
.windsurfrules) - Hierarchical rules that cascade from parent directories -
Continue.dev
(
.continue/config.json) - JSON configuration with custom context providers and slash commands
Onboarding Endpoint Enhancement
- GET /api/agent/onboarding
now includes multi_agent_instructions
section:
- Download URLs for all four instruction formats
- Platform-specific installation commands (Unix/Linux/macOS and Windows)
- Token limit information for each format
- Usage notes explaining complementary relationship with Claude Code Skills
- Safe installation guidance (backup, append, manual merge options)
Documentation Directory
- All instruction files stored in docs/multi-agent-instructions/:
-
copilot-instructions.md(9KB) - Markdown format with code examples cursorrules.txt(15KB) - Plain text with detailed patternswindsurfrules.txt(15KB) - Plain text with cascading rules-
continue-config.json(4KB) - JSON with custom commands and context providers
Core Content Coverage - All formats include essential Stride integration guidance:
- Hook execution mandate (all four hooks and their requirements)
- Top 5 critical mistakes agents make
- Essential task field requirements
- Code patterns for claiming, completing, and creating tasks
- Batch creation examples
- Documentation links
Changed
Onboarding Endpoint Optimization
Multi-Agent Instructions Architecture - Complementary approach to Claude Code Skills:
- Claude Code Skills: Contextual workflow enforcement (1000+ lines per skill, embedded content)
- Multi-Agent Instructions: Always-active code completion (200-400 lines, downloadable files)
[1.17.0] - 2026-01-08
Added
Claude Code Skills for AI Agent Workflow Enforcement
Four Workflow Enforcement Skills - Complete set of Claude Code skills distributed via the onboarding endpoint to enforce Stride workflow discipline:
- stride-claiming-tasks - Enforces proper task claiming workflow with hook execution before claiming
- stride-completing-tasks - Ensures both after_doing and before_review hooks are executed before marking tasks complete
- stride-creating-tasks - Requires comprehensive task specifications to prevent 3+ hour exploration failures
- stride-creating-goals - Enforces proper goal structure with nested tasks and correct batch format
Onboarding Endpoint Distribution
- Skills automatically provided through GET /api/agent/onboarding:
- Complete skill content embedded in JSON response
- Step-by-step installation instructions with exact commands
- Usage guidance explaining when to invoke each skill
- Automatic discovery by Claude Code when installed
[1.16.0] - 2026-01-08
Added
Task Archive System
Archive Functionality - Tasks can now be archived and later restored or permanently deleted:
- Archive Tasks - Archive button added to task card menus on board view
-
Archived Tasks Page
- Dedicated page (
/boards/:id/archive) to view all archived tasks for a board - Unarchive Tasks - Restore archived tasks back to their original column
- Permanent Delete - Delete archived tasks permanently from the database
- Archive Navigation - "Archived Tasks" link added to board header for easy access
- Empty State - Friendly empty state when no archived tasks exist
[1.15.0] - 2026-01-07
Changed
⚠️ BREAKING CHANGE: All Four Hooks Now Blocking with Mandatory API Validation
All hooks (before_doing, after_doing, before_review, after_review) are now
blocking
and require mandatory validation
at the API level. Agents must execute hooks before calling endpoints and include execution results in their requests.
-
before_reviewhook: Changed from non-blocking to blocking (60s timeout) -
after_reviewhook: Changed from non-blocking to blocking (60s timeout) - API validation enforced: All endpoints now reject requests (422 error) if required hook results are missing or hooks failed
-
PATCH /api/tasks/:id/complete- Now requires BOTH hook results:-
Required parameters:
after_doing_resultANDbefore_review_result -
Execution order: Execute
after_doinghook FIRST, thenbefore_reviewhook SECOND, then call endpoint - Validation: Both hooks must succeed (exit_code 0) or request is rejected
- Error response: 422 if either hook result is missing or hook failed
-
Required parameters:
-
PATCH /api/tasks/:id/mark_reviewed- Now requires hook result:-
Required parameter:
after_review_result -
Execution order: Execute
after_reviewhook FIRST, then call endpoint - Validation: Hook must succeed (exit_code 0) or request is rejected
- Error response: 422 if hook result is missing or hook failed
-
Required parameter:
1. Execute before_doing hook (blocking, 60s) → Capture result
2. POST /api/tasks/claim WITH before_doing_result
3. [Do work]
4. Execute after_doing hook (blocking, 120s) → Capture result
5. Execute before_review hook (blocking, 60s) → Capture result
6. PATCH /api/tasks/:id/complete WITH after_doing_result AND before_review_result
7. IF needs_review=true: Wait for human approval
8. Execute after_review hook (blocking, 60s) → Capture result
9. PATCH /api/tasks/:id/mark_reviewed WITH after_review_result
- Quality Enforcement: Prevents tasks from entering review with failing PR creation or missing documentation
- Consistency: All four hooks now have identical blocking behavior - simpler mental model
- Early Validation: Catches issues (failing tests, PR creation failures, deployment failures) before state transitions
- Audit Trail: Complete record of all hook execution results in the database
-
docs/AI-WORKFLOW.md- Updated workflow steps and hook execution order -
docs/api/README.md- Updated endpoint requirements and examples -
docs/api/patch_tasks_id_complete.md- Addedbefore_review_resultrequirement -
docs/api/patch_tasks_id_mark_reviewed.md- Addedafter_review_resultrequirement -
docs/REVIEW-WORKFLOW.md- Updated review workflow with new hook execution order -
docs/GETTING-STARTED-WITH-AI.md- Updated hook descriptions and examples -
docs/AGENT-HOOK-EXECUTION-GUIDE.md- Updated execution patterns -
docs/STRIDE-SKILLS-PLAN.md- Updated completion process -
lib/kanban_web/controllers/api/agent_json.ex- Updated onboarding endpoint
[1.14.1] - 2026-01-06
Fixed
WIP Limit Calculation - Goals Exclusion
- Goals No Longer Count Toward WIP Limits - Work In Progress (WIP) limits now correctly exclude goal tasks and only count work and defect tasks
Goal Positioning During Drag Operations
- Fixed Goal Display Order in LiveView - Goals now consistently appear above their child tasks during live drag-and-drop operations
Dependency Blocking Status in Bulk Upload
- Dependencies Now Properly Block Tasks in Bulk Upload - Tasks with dependencies are now correctly marked as blocked when created via bulk upload API endpoint (POST /api/tasks/batch)
[1.14.0] - 2026-01-05
Added
API Enhancements - Agent Onboarding Endpoint
-
Comprehensive Agent Memory System
- The /api/agent/onboarding endpoint has been significantly enhanced to help AI agents remember how to work with Stride across sessions and platforms:
- memory_strategy section - Platform-agnostic and platform-specific instructions for maintaining context across sessions
- session_initialization section - Step-by-step checklist for starting new sessions
- first_session_vs_returning section - Different workflows for experience levels
- common_mistakes_agents_make section - Learning from collective experience
- quick_reference_card section - Ultra-condensed essentials for experienced agents
-
Enhanced Documentation:
-
docs/AGENT-MEMORY-SOLUTION.md- Detailed explanation of the multi-layered memory strategy
-
Why This Matters
This release solves the "agent memory problem" - where AI agents would forget how to work with Stride between sessions. The enhanced onboarding endpoint provides a universal, platform-agnostic solution that works for any AI coding agent (Claude Code, Cursor, Windsurf, Aider, Cline, etc.) in any project using Stride.
Changed
Goal Movement Behavior Enhancement
- Improved Goal Auto-Positioning - When a task triggers its parent goal to move to a new column, the goal now positions itself directly above the task that caused the movement (instead of above the earliest child in the target column)
[1.13.2] - 2026-01-05
Changed
UI Improvements - Conditional Field Visibility
-
Conditional Visibility for Status & Agent Tracking Section
- The "Status & Agent Tracking" section in task forms now intelligently shows/hides based on agent interaction:
- Status - Task status (Open, In Progress, Completed, Blocked)
- Created By Agent - Name of AI agent that created the task
- Completed By Agent - Name of AI agent that completed the task
- Completion Summary - Summary provided by agent upon completion
-
Conditional Visibility for Review Queue Section
- The "Review Queue" section in task forms now only appears when a task has a review status:
- Review Status - Pending, Approved, Changes Requested, or Rejected
- Review Notes - Notes from the reviewer about the task
-
Conditional Visibility for Actual Metrics Section
- The "Actual Metrics" section in task forms now only appears when actual metrics data exists:
- Actual Complexity - Actual complexity level (Small, Medium, Large)
- Actual Files Changed - Number of files actually modified
- Time Spent (minutes) - Actual time spent on the task
Added
Documentation
-
TASK-FORM-FIELD-VISIBILITY.md
- New comprehensive guide explaining task form field visibility
- Board-level field visibility settings and configurable fields
- Always-visible fields vs. conditionally visible fields
- Detailed explanation of conditional visibility for Status & Agent Tracking, Review Queue, and Actual Metrics
- API behavior vs. UI form behavior
- Best practices for board owners, AI agents, and human users
- Examples and scenarios demonstrating visibility logic
[1.13.1] - 2026-01-04
Fixed
Drag and Drop Improvements
- Smoother Animation - Enhanced drag and drop feel with improved visual feedback
- More Precise Positioning - Improved accuracy when dropping tasks
- Better Scroll Behavior - Enhanced dragging near column edges
- Prevented Premature DOM Updates - Fixed jarring updates during drag operations
- Enhanced Touch Support - Better mobile drag experience
- Position Index Bug Fix - Resolved issue where tasks would return to wrong position
[1.13.0] - 2026-01-01
Added
Enhanced New User Experience
-
Automatic Login After Registration
- New users are now automatically logged in after creating their account
- Eliminates the redundant step of requiring users to log in immediately after registration
- Improved onboarding flow reduces friction for new users
-
AI Optimized Board Quick Start
- Added prominent call-to-action for new users without boards
- Displays helpful message: "You don't have any boards yet. Create your first board to get started!"
- Large, centered "Create AI Optimized Board" button with orange gradient styling
Changed
UI/UX Improvements
-
Enhanced Task Review Checkbox Visibility
- Made the \"Needs Review\" checkbox more obvious in task forms
- Changed from subtle gray label to prominent blue gradient styling
- Added blue checkmark icon when enabled for better visual feedback
- Increased text size and weight for better readability
- Improved accessibility with clearer visual distinction
[1.12.0] - 2025-12-29
Added
Agent Onboarding Endpoint
-
GET /api/agent/onboarding
- Comprehensive onboarding endpoint for AI agents starting work with Stride
- Critical first steps - Immediate guidance on creating .stride_auth.md and .stride.md configuration files
- File templates - Complete templates for both configuration files included in response
- Workflow overview - Clear explanation of the Ready → Doing → Review → Done workflow
- Hook execution guide - Complete documentation of all four hook points with environment variables
- API reference - Full endpoint listing with categorization (discovery, management, creation)
- Documentation links - Direct URLs to all agent-facing documentation guides
- Quick start guide - Step-by-step instructions for getting started immediately
- Returns all information needed for an agent to begin working without external documentation lookup
-
Comprehensive Agent Documentation
- Created complete documentation set for AI agents
-
AUTHENTICATION.md- Bearer token authentication with .stride_auth.md format -
AGENT-CAPABILITIES.md- Capability matching system with 12 standard capabilities -
AGENT-HOOK-EXECUTION-GUIDE.md- Client-side hook execution with complete examples -
TASK-WRITING-GUIDE.md- Task creation guide with structured JSON format rationale -
REVIEW-WORKFLOW.md- Review workflow patterns and continuous work loop -
ESTIMATION-FEEDBACK.md- Providing estimation feedback on task completion -
UNCLAIM-TASKS.md- When and how to release tasks agents can't complete -
AI-WORKFLOW.md- Complete agent workflow from authentication to task completion
-
Changed
Homepage Redesign
-
Human-AI Collaboration Focus
- Completely redesigned the homepage to showcase Stride as a Human-AI collaboration platform
- Hero section - Updated badge to "Human-AI Collaboration Platform" and headline to emphasize AI agents working alongside humans
- Value proposition - Rewritten to highlight workflow hooks, task delegation to AI, and human review control
-
Feature cards - Replaced generic kanban features with collaboration-focused features
- AI Agent Integration - REST API with capability matching and workflow hooks
- Automated Task Claiming - Atomic claiming with optimistic locking and dependency handling
- Human Review Workflow - Optional human review and approval process
- Client-Side Workflow Hooks - Custom code execution at four key workflow moments
About Page Enhancement
-
Human-AI Collaboration Platform Section
- Added new section explaining Stride's collaborative features
- Overview - Describes how AI agents and humans work together through REST API and review workflows
- Five key features - Capability matching, atomic task claiming, client-side hooks, human review, and API documentation
- Use case description - Explains how teams delegate repetitive tasks to AI while humans focus on architecture and review
[1.11.0] - 2025-12-28
Added
Workflow Hooks System for AI Agent Integration
Introduced a flexible hook system that enables AI agents to execute custom workflows at key points in the task lifecycle. The server provides hook metadata while agents execute hooks locally on their own machines.
- Four fixed hook points: before_doing, after_doing, before_review, after_review
- Client-side execution: Agents read .stride.md configuration and execute hooks on their local machine
- Language-agnostic: Works with any programming language (Elixir, Java, Python, etc.)
- Hook metadata: Server returns name, environment variables, timeout, and blocking status
- API integration: POST /api/tasks/claim, PATCH /api/tasks/:id/complete, and PATCH /api/tasks/:id/mark_reviewed return hook metadata
- Automatic completion: Tasks with needs_review=false automatically move to Done after executing all hooks
[1.10.1] - 2025-12-28
Added
Bulk Task Creation with Nested Goals
POST /api/tasks with nested tasks
Create a goal with multiple child tasks in a single atomic API call:
- Atomic transactions - Uses Ecto.Multi to ensure all-or-nothing semantics (if any task fails, entire operation rolls back)
- Automatic parent_id assignment - Child tasks automatically linked to parent goal
- Automatic identifier generation - Goals get G prefix (G1, G2, etc.), tasks get W/D prefix based on type
- Position management - Goal positioned first, child tasks positioned sequentially after
- Task history tracking - Creation history entries created for goal and all child tasks
- PubSub broadcasting - Real-time updates broadcast for goal and all children
- Telemetry events - [:kanban, :goal, :created_with_tasks] event emitted with goal and task counts
- WIP limit enforcement - Respects column WIP limits before creating goal
- Full field support - Preserves all AI-optimized fields (complexity, verification_steps, key_files, etc.)
- Response format - Returns {goal: ..., child_tasks: [...]} with complete task data
Automatic Goal Deletion
Smart goal cleanup
Goals are automatically deleted when all their child tasks are removed:
- Cascade deletion - When the last child task of a goal is deleted, the parent goal is automatically deleted as well
- Real-time updates - Goal deletion broadcasts via PubSub for immediate UI updates
- Prevents orphaned goals - Ensures goals without children don't remain on the board
- Proper reordering - Tasks are reordered after goal deletion to maintain proper positioning
[1.10.0] - 2025-12-28
Added
Goal → Task Hierarchy System
2-Level Task Hierarchy
Introduced goal-based task organization:
- Goals (G prefix) - Large initiatives (25+ hours) that contain multiple related tasks
- Tasks (W/D prefix) - Individual work items that can belong to a goal via parent_id field
- Standalone tasks (no parent) remain fully supported
Goal Card UI
Compact, visually distinct cards for goals:
- Yellow gradient styling - from-yellow-50 to-yellow-100 background with border-yellow-300/60
- Compact dimensions - min-h-[45px] height with p-1.5 padding (vs p-3 for regular tasks)
- Reduced spacing - mt-1 between title and progress bar, mt-1.5 between progress bar and badges
- Three-line layout: Line 1: Goal title, Line 2: Progress bar showing completion (e.g., "6/11"), Line 3: Badge row (G badge, priority, identifier)
- Non-draggable - No drag handle displayed (goals move automatically)
- Type badge - Yellow \"G\" badge with gradient background matching card style
Automatic Goal Movement
Goals reposition based on child task status:
- Smart column detection - When ALL child tasks are in same column, goal moves to that column
- Before-child positioning - Goal positions BEFORE first child in target column
- Done column special handling - Goal positions at END when all children complete
- Real-time updates - Movement triggers immediately when last child task moves
- Position shifting - Other tasks shift to maintain proper ordering
Goal Progress Tracking
Real-time progress calculation and display:
- Progress bar - Green gradient bar (from-green-500 to-emerald-500) on yellow background
- Completion count - Shows \"completed/total\" (e.g., \"6/11\") next to progress bar
- Percentage calculation - Computed via calculate_goal_progress/1 helper
- PubSub updates - Progress updates broadcast in real-time as child tasks complete
- Status tracking - Counts completed vs total children for accurate progress
Parent Goal Selection
Tasks can be assigned to goals during creation/edit:
- Goal dropdown - New \"Parent Goal\" field in task form
- Goal options - Shows all goals in format \"G1 - Goal Title\"
- Filtered by board - Only shows goals from current board
- Self-exclusion - Goals cannot be their own parent (prevents circular references)
- Ordered display - Goals sorted by identifier (G1, G2, G3, etc.)
Hierarchical Task Tree API Endpoint
GET /api/tasks/:id/tree
Returns nested JSON structure showing task hierarchy:
- For goals: Returns goal data + array of child tasks + progress counts
- For tasks: Returns just the task data (no children)
- Full field support - Includes all rich task fields (complexity, dependencies, etc.)
- Progress statistics - Includes total children and completed count for goals
- Ordered children - Child tasks ordered by position ascending
- Scope enforcement - Respects tasks:read scope, returns 401/404 appropriately
- Supports identifiers - Accepts both numeric IDs and identifiers (e.g., "G1", "W14")
[1.9.0] - 2025-12-27
Added
Intelligent Review Workflow with mark_reviewed Endpoint
Smart Review Processing
New mark_reviewed endpoint that intelligently routes tasks based on review status:
- PATCH /api/tasks/:id/mark_reviewed - Process reviewed tasks with automatic routing
- If review_status == "approved": Moves task from Review to Done column, sets status to :completed
- If review_status in ["changes_requested", "rejected"]: Moves task back to Doing column, keeps status as :in_progress
- Returns 422 error if task not in Review column or review_status not set
- Supports both numeric IDs and human-readable identifiers (e.g., "W14")
Enhanced Review Workflow
Improved human-AI collaboration on task review:
- Human reviews task in Review column and sets review_status field
- Human adds review_notes to guide AI on required changes
- Human notifies AI that review is complete
- AI calls /mark_reviewed to automatically route task based on review outcome
- Eliminates need for polling - explicit notification-based workflow
- Agent can read review_notes to understand what needs to be fixed
Telemetry and Observability
Comprehensive tracking of review outcomes:
- Emits [:kanban, :task, :completed] when task approved and moved to Done
- Emits [:kanban, :task, :returned_to_doing] when task needs changes
- Tracks review status in telemetry metadata
- Logs reviewer information with reviewed_by_id field
Backwards Compatibility
Preserved existing endpoints:
- mark_done endpoint still available but marked as deprecated
- Both endpoints coexist for gradual migration
- New workflow recommended for all new integrations
AI Agent Metadata Tracking
Agent Tracking on Task Creation
Tasks created via API now track the AI agent model:
- Added created_by_agent field to store agent information in format "ai_agent:model_name"
- Automatically populated when API token has agent_model configured
- Visible indicator (purple CPU chip icon) on task cards for AI-created tasks
- Helps track which tasks were created by AI agents vs. human users
Agent Tracking on Task Completion
Tasks completed via API now track the AI agent model:
- Added completed_by_agent field to store agent information in format "ai_agent:model_name"
- Automatically populated when API token has agent_model configured during task completion
- Provides audit trail of which AI agent completed specific tasks
UI Enhancements
Visual indicators for AI-created tasks:
- Purple gradient CPU chip icon displayed on task cards
- Hover tooltip shows full agent identifier
API Token Schema Updates
Enhanced API token model to support agent metadata:
- agent_model field stores the model identifier (e.g., "claude-sonnet-4")
- Used by maybe_add_created_by_agent/2 and maybe_add_completed_by_agent/2 helpers
- Only adds metadata when agent_model is present on the token
[1.8.0] - 2025-12-26
Added
Task Dependencies and Blocking Logic
Dependency Graph System
Tasks can now have dependencies on other tasks with full validation:
- Tasks can specify dependencies using task identifiers (e.g., "W14", "W15")
- Circular dependency detection prevents invalid dependency relationships
- Automatic task status management based on dependency completion
- Visual blocked indicator on task cards when dependencies are incomplete
Automatic Blocking/Unblocking
Task status automatically updates based on dependencies:
- When a task has incomplete dependencies, status changes to :blocked
- When all dependencies are completed, task automatically unblocks
- Blocking status checked on task creation, update, and dependency completion
- Dependent tasks automatically unblocked when a task is marked done
Dependency API Endpoints
New endpoints for querying task relationships:
- GET /api/tasks/:id/dependencies - Returns full dependency tree for a task
- GET /api/tasks/:id/dependents - Returns all tasks that depend on this task
- Supports both numeric IDs and human-readable identifiers
- Recursive dependency tree structure with nested dependencies
Validation and Safety
Comprehensive validation to ensure data integrity:
- Circular dependency detection using depth-first search with visited tracking
- Prevention of task deletion when other tasks depend on it
- Prevention of self-dependencies
- PostgreSQL array operations for efficient dependency queries
UI Enhancements
Visual indicators for blocked tasks:
- Blocked icon displayed in upper right of task cards
- Clear visual distinction for tasks that cannot be started
- Real-time updates when blocking status changes
Fixed
Review Status Update
Fixed issue preventing review status updates on tasks:
- Added automatic population of reviewed_at and reviewed_by_id when review status changes
- Added missing handle_info handler for :task_reviewed PubSub events
- Form component now properly receives user context for review metadata
[1.7.0] - 2025-12-26
Added
Task Completion API Endpoint
Task Completion Workflow
AI agents can now complete tasks and move them to Review column:
- PATCH /api/tasks/:id/complete Complete a task by moving it from Doing to Review column with completion summary
- Supports both numeric IDs and human-readable identifiers (e.g., "W16") for task completion
- Status remains "in_progress" (final completion to Done column handled by separate endpoint)
- Stores detailed completion metadata including:
-
completion_summaryJSON string with comprehensive completion details (files changed, verification results, implementation notes) -
actual_complexity- Actual complexity experienced (small, medium, large) -
actual_files_changed- String count of files modified during implementation -
time_spent_minutes- Integer minutes spent on the task -
completed_by_id- User ID of the completer
Completion Summary Structure
Supports rich completion data in JSON format:
-
files_changed- Array of file paths and what changed in each -
tests_added- Array of test files created -
verification_results- Commands run, status (passed/failed), and output -
implementation_notes- Deviations, discoveries, and edge cases encountered -
estimation_feedback- Comparison of estimated vs actual complexity, files, and time -
telemetry_added- Array of telemetry events added -
follow_up_tasks- Array of follow-up work identified -
known_limitations- Array of limitations or constraints
Task Mark Done API Endpoint
Final Task Completion
AI agents can now mark reviewed tasks as done and move them to Done column:
- PATCH /api/tasks/:id/mark_done - Mark a task as done by moving it from Review to Done column
- Supports both numeric IDs and human-readable identifiers (e.g., "W24") for marking done
- Sets status to :completed and completed_at timestamp automatically
- Only tasks in Review column can be marked as done (validation enforced)
- Final step in the task workflow after review is complete
- Broadcasts {:task_completed, task} PubSub event for real-time UI updates
- Emits telemetry events: [:kanban, :task, :completed] and [:kanban, :api, :task_marked_done]
- Returns 422 error if task is not in Review column
- Returns 403 error if task belongs to different board
[1.6.0] - 2025-12-25
Added
Task Claiming API Endpoints
Intelligent Task Discovery & Claiming
AI agents can now discover and claim tasks with advanced filtering:
- GET /api/tasks/next Retrieve the next available task from the Ready column matching agent capabilities
- POST /api/tasks/claim Atomically claim the next available task and move it to Doing column
- POST /api/tasks/:id/unclaim - Release a claimed task back to Ready column with optional reason
- Supports both numeric IDs and human-readable identifiers (e.g., "W14") for task unclaiming
- Race condition prevention through atomic PostgreSQL operations ensuring tasks are never double-claimed
Capability-Based Task Filtering
- Agents only see tasks matching their declared capabilities via agent_capabilities array on API tokens
- Tasks can specify required_capabilities to restrict which agents can work on them
- PostgreSQL array containment operations ensure efficient capability matching
- Agents without specific capabilities see all tasks without requirements
Dependency-Aware Task Selection
- Automatically skips tasks with incomplete dependencies
- Uses PostgreSQL subqueries to verify all dependencies are completed before returning tasks
- Ensures agents always receive tasks that are truly ready to be worked on
- Prevents blocked tasks from being claimed
Key File Conflict Detection
- Prevents concurrent work on the same files by different agents
- Tasks with overlapping key_files are automatically excluded from next/claim operations
- JSONB operations efficiently compare file paths across in-progress tasks
- Reduces merge conflicts and ensures safe parallel work
Automatic Task State Management
- Tasks claimed via /api/tasks/claim are automatically moved to Doing column
- Sets claimed_at, claim_expires_at (24 hours), assigned_to_id, and status fields
- Calculates correct position in Doing column to maintain sort order
- Unclaimed tasks return to Ready column with all claim metadata cleared
Enhanced Telemetry
-
New telemetry events:
[:kanban, :api, :next_task_fetched],[:kanban, :api, :task_claimed],[:kanban, :api, :task_unclaimed] - Tracks task priority, API token usage, and unclaim reasons
- Provides insights into agent behavior and task workflow efficiency
[1.5.0] - 2025-12-24
Added
Task CRU API Endpoints
RESTful JSON API for Tasks
AI agents can now programmatically create, read, and update tasks:
- POST /api/tasks Create tasks with all fields including nested associations (key_files, verification_steps)
- GET /api/tasks List all tasks for the authenticated board with optional column filtering
- GET /api/tasks/:id Retrieve a single task with all associations preloaded (supports both database IDs and human-readable identifiers like "W14")
- PATCH /api/tasks/:id Update task fields including nested associations (supports both database IDs and identifiers)
- Board-scoped access control - tokens can only access tasks from their associated board
- Automatic default column selection (Backlog > Ready > first column) when column_id not specified
- Full field support for all 60+ task fields including metadata, observability, and AI context fields
- Proper HTTP status codes (201 for create, 200 for update, 422 for validation errors, 403 for forbidden, 401 for unauthorized)
- Flexible Task Identification API endpoints accept both numeric database IDs (e.g., "73") and human-readable identifiers (e.g., "W14") for improved developer experience
Real-Time Integration
- All API mutations automatically broadcast via Phoenix PubSub
- LiveView clients receive instant updates when tasks are created or modified via API
- Seamless integration between UI and API workflows
Telemetry & Observability
-
Emits telemetry events for all API operations (
[:kanban, :api, :task_created],[:kanban, :api, :task_updated],[:kanban, :api, :task_listed]) - Tracks API usage including board_id, user_id, request path, and HTTP method
- Provides metrics for monitoring API performance and usage patterns
[1.4.0] - 2025-12-24
Added
API Token Authentication for AI Agents
Bearer Token Authentication
Enable AI agents and automation tools to interact with your boards programmatically:
- Generate API tokens for AI Optimized Boards from the board's API Tokens page
- Simple Bearer token authentication via HTTP headers
- Each token is scoped to a specific board for security
- One-time token display after creation with easy copy-to-clipboard functionality
- Token name and optional metadata tracking (AI model, version, purpose)
Secure Token Management
- Tokens are cryptographically hashed (SHA-256) before storage
- Never stored in plaintext - shown only once at creation
- Easy token revocation without affecting your login session
- Usage tracking shows when each token was last used
- Create multiple tokens for different AI agents or purposes
AI Optimized Board Integration
- API Tokens feature available exclusively for AI Optimized Boards
- Provides AI agents with programmatic access to the standardized 5-column workflow
- Perfect for Claude Code, MCP servers, and other automation tools
- Works with any HTTP client or programming language
Changed
- API Tokens button now only appears on AI Optimized Boards
[1.3.0] - 2025-12-23
Added
AI Context Fields for Enhanced Task Intelligence
- Three New Task Fields - Added specialized fields to capture AI-relevant context for task execution:
Security Considerations (security_considerations)
- Array field for documenting security-related requirements and notes
- Examples: token hashing requirements, validation rules, security headers
- Purple background color in UI for high visibility
- Dynamic add/remove interface in task forms
- Defaults to empty array when not provided
Testing Strategy (testing_strategy)
-
Map field with three standardized categories:
unit_tests,integration_tests,manual_tests - Each category contains an array of test descriptions
- Cyan background color in UI to distinguish from security considerations
- Dynamic add/remove interface with category-specific sections
- Defaults to empty map when not provided
Integration Points (integration_points)
- Map field with four standardized categories:
- Phoenix telemetry events to emit
- PubSub topics to broadcast to
- Phoenix channels to update
- External API integrations
- Each category contains an array of integration descriptions
- Indigo background color in UI to distinguish from other AI fields
- Dynamic add/remove interface with category-specific sections
- Defaults to empty map when not provided
[1.2.0] - 2025-12-22
Added
AI Optimized Boards
- New Board Type - Introduced AI Optimized Boards with predefined, immutable structure:
- Automatically creates 5 standard columns: Backlog, Ready, Doing, Review, Done
- Columns are locked and cannot be added, edited, deleted, or reordered
- Designed for AI-driven workflows with consistent, predictable structure
- Board owners retain full control over tasks, but column structure is fixed
- Clear visual distinction from regular boards throughout the interface
[1.1.0] - 2025-12-22
Added
Rich Task Metadata System
- Extended Task Schema - Added 18+ new fields to support AI-optimized task management:
- Planning & Context: complexity (small/medium/large), estimated_files, why, what, where_context
- Implementation Guidance: patterns_to_follow, database_changes, validation_rules, required_capabilities
- Observability: telemetry_event, metrics_to_track, logging_requirements
- Error Handling: error_user_message, error_on_failure
- Collections: key_files (JSONB), verification_steps (JSONB), technology_requirements (JSONB), pitfalls (JSONB), out_of_scope (JSONB)
- Metadata Tracking: created_by, creator_name, completed_at, completed_by, completer_name, completion_summary
- Assignment Tracking: claimed_at, claimed_by, claimer_name
- Review System: needs_review (boolean), review_status (pending/approved/changes_requested), review_notes
- Dependencies: dependencies (JSONB array) to track task relationships
Board-Level Field Visibility System
- Field Visibility Toggles - Board owners can control which task fields are visible to all users:
- 12 toggleable fields: acceptance_criteria, complexity, context, key_files, verification_steps, technical_notes, observability, error_handling, technology_requirements, pitfalls, out_of_scope, required_capabilities
- Stored in boards table as JSONB (field_visibility column)
- Real-time PubSub broadcasts synchronize visibility changes across all connected clients
- Owner-only access control - only board owners can modify field visibility settings
- Default visibility: acceptance_criteria shown, all others hidden
- Settings persist in database and apply to all users viewing the board
Enhanced Task Forms
- Comprehensive Task Creation/Edit Form - Support for all rich task fields with dynamic sections:
- Dynamic key files editor with add/remove functionality
- Dynamic verification steps editor with add/remove functionality
- Embedded schema support for structured JSONB data
- Validation for all new fields with proper error handling
- Field visibility awareness - form fields show/hide based on board settings
- Reduced code complexity (Credo compliant) through helper function extraction
Task Detail View Enhancements
- Rich Task Display - All 18 TASK.md categories displayed in organized, scannable format:
- Planning context (Why/What/Where)
- Implementation guidance section
- Key files to read (with file paths and descriptions)
- Verification steps checklist
- Observability requirements
- Error handling guidelines
- Technology requirements
- Known pitfalls
- Out of scope clarifications
- Dependencies visualization
- Review status indicators
- Assignment and completion tracking
Technical Improvements
Real-Time Collaboration
- PubSub broadcasts for field visibility changes
- Instant synchronization of board settings across all connected clients
Developer Experience
AI-Optimized Task Structure
Tasks now contain comprehensive information for AI agents to:
- Understand context and rationale (why/what/where)
- Follow project patterns and conventions
- Locate relevant code files
- Verify implementation success
- Handle errors appropriately
- Track dependencies and review status
Flexible Board Configuration
Teams can customize their workflow by:
- Showing only relevant fields for their process
- Reducing information overload on task cards
- Maintaining consistent views across all team members
- Adjusting visibility as workflow needs evolve
[1.0.1] - 2025-12-21
Fixed
- Updated all UI components to use theme-aware daisyUI color tokens for proper dark mode support
- Replaced hardcoded Tailwind gray colors with daisyUI semantic colors (base-100, base-200, base-300, base-content)
- Fixed text visibility issues in dark mode across all pages including:
- Board list, show, and form views
- Task view and form components
- Column form component
- Home, About, Changelog, and Tango pages
- Authentication pages
- Error pages (404, 500)
- Updated test expectations to match new dark mode compatible CSS classes
- All components now properly adapt to both light and dark themes using OKLCH color space
[1.0.0] - 2025-12-15
Core Features
User Authentication & Management
- User registration with email and password
- Secure user login and logout with session management
- Password hashing and security using bcrypt
- Protected routes requiring authentication
- User profiles with customizable display names
- Multi-language support with language switcher (English and French)
Board Management
- Create, view, edit, and delete kanban boards
- Each board has a name and description
- Board-level access control with three permission levels:
- Owner: Full control over board, columns, and tasks
- Modify: Can edit and move tasks, but cannot modify board structure
- Read-only: Can only view the board
- Share boards with other users with granular permissions
- Beautiful board cards with responsive design
- Board listing with quick access to all user boards
Column Management
- Create, edit, and delete columns within boards
- Drag-and-drop column reordering
- Configurable Work-In-Progress (WIP) limits per column:
- Set to 0 for unlimited tasks
- Set to positive integer to enforce maximum tasks
- Visual indicators when approaching or exceeding WIP limits
- Prevents task creation/movement when limit is reached
- Visual task count display (e.g., \"3/5\" when limit is 5)
- Column deletion with cascade (removes all tasks in column)
Task Management
- Create, edit, and delete tasks within columns
- Rich task properties:
- Title: Required task name
- Description: Optional detailed description
- Acceptance Criteria: Optional criteria for task completion
- Type: Work or Defect
- Priority: Low, Medium, High, or Critical
- Assigned To: Assign tasks to specific users
- Identifier: Auto-generated unique identifier (e.g., W1, W2, D1)
- Drag-and-drop task movement:
- Move tasks within the same column (reorder)
- Move tasks between columns
- Respects WIP limits when moving
- Visual feedback during drag operations
- Task comments:
- Add comments to tasks for collaboration
- Timestamp and display for all comments
- View comment history
- Task history tracking:
- Automatic tracking of task lifecycle events
- Track creation, moves between columns, priority changes, and assignments
- Display full history with timestamps
- Visual icons for different event types
Real-Time Collaboration
- Phoenix PubSub integration for real-time updates
- Live synchronization across all connected browsers:
- Task creation, updates, and deletion
- Task movement between columns
- Automatic board refresh when changes occur
- Multiple users can view and interact with the same board simultaneously
User Experience
- Modern, responsive design using TailwindCSS
- Smooth animations and transitions
- Drag-and-drop interfaces for intuitive task management
- Loading states for asynchronous operations
- Flash messages for user feedback
- Confirmation dialogs for destructive actions
- Empty states with helpful guidance
- Accessibility improvements throughout the application
- Mobile-responsive layout
Error Tracking & Monitoring
- Built-in error tracking with ErrorTracker
- Error dashboard for administrators
- Automatic error capture and reporting
- Stack trace and context information for debugging
Internationalization
- Full Gettext integration
- English translations (default)
- French translations
- Spanish translations
- German translations
- Portugese translations
- Japanese translations
- Mandarin Chinese translations
- Easy addition of new languages
- Context-aware translations
Release Notes
This is the initial stable release of the Kanban Board application. All core features have been implemented, tested, and documented. The application is production-ready with comprehensive test coverage, security measures, and a polished user interface.
Known Limitations
None identified. Please report any issues via the project's issue tracker. A form is available on the About page for easy submission.
Credits
This application was completely Vibecoded by Jeff "Cheezy" Morgan with the help of Claude Code and TideWave.