Skip to content

DRU-387 - Local issue tracker - #476

Open
chaosk wants to merge 15 commits into
mainfrom
integration/issues
Open

DRU-387 - Local issue tracker#476
chaosk wants to merge 15 commits into
mainfrom
integration/issues

Conversation

@chaosk

@chaosk chaosk commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

Linear ticket: DRU-387

A ticket tracker that lives in this appliance. Software Factory can use it instead of Linear or Jira. There is nothing to paste in Settings → Services. Selecting tracker issues (the select shows druks) is the whole connect.

This is Software Factory, not a second bundled app and not a Service card. There is no issues entry point and no alembic_version_issues.

What the operator gets

  • Board /software_factory/board and list /software_factory/list. Overview stays the React home.
  • Tickets {project.prefix}-{n} (for example BOX-3). Title, markdown description, status, priority, optional assignee, comments.
  • Repo is a required field. Prefix and sequence live on the GitHub Project that repo sits in. Moving a ticket to another repo does not remint the identifier.
  • Statuses: Backlog, Todo, Ready for Agent, In Progress, In Review, Done, Cancelled, Blocked. Default create is Todo. Ready for Agent is the build trigger.
  • Ticket detail saves in place (title, description, sidebar). Sidebar names Created by, Created, and Updated. Board cards open the ticket; there is no separate Open control.
  • Board cards drag onto a status column. The shell previews the landing column and commits that column on drop. Same-column drop does nothing. Status still goes through set_status.
  • Description and comments edit as formatted markdown. The API still stores a markdown string.

How a build starts

ticket.transitioned still feeds Build.dispatch. The in-process IssuesTracker writes status back onto the ticket row. No webhook, no Service identity.

Ready for Agent opens a build against the selected repo. If that ticket already has a scheduled, running, or parked build, dispatch mirrors the ticket onto that run (In Review when parked on review, otherwise In Progress) instead of starting a second one.

When the tracker is issues, the sandbox also gets this appliance’s /mcp as druks, credentialed with a run PAT, so the agent fetches and comments with software_factory_get_ticket / software_factory_add_comment. Prompts treat a Druks identifier like Linear/Jira, not as a GitHub issue number.

Out of scope

Comment edit/delete, attachments, labels, estimates, Linear import, a standalone Issues app.

Tickets (all landed on integration/issues)

  • DRU-388 — models, tables, identifiers
  • DRU-389 — create / edit / comment / status doors
  • DRU-390 — board, list, ticket pages
  • DRU-391 — Software Factory tracker issues
  • DRU-392 — docs: local issues tracker
  • DRU-393 — appliance /mcp in issues builds
  • DRU-485 — board cards open the ticket
  • DRU-486 — inline ticket detail
  • DRU-487 — tickets select a repo (drops IssuesProject)
  • DRU-488 — markdown editor
  • DRU-489 — fetch the Druks ticket, not a GitHub issue
  • DRU-490 — Ready for Agent on a live build
  • DRU-491 — align issue list cells on one baseline
  • DRU-492 — Created by on the ticket sidebar
  • DRU-493 — drag board cards between statuses

Risk

Alembic revisions for issues_* tables, then projects.prefix / ticket_seq and issues_tickets.repo_id. Unreleased stack: existing local tickets were not migrated; they are dropped rather than mapped.

Replay: Ready for Agent on a live run does not start a second workflow. Merge is still an external GitHub fact, not inferred from run lifecycle.

Verification

  • uv run ruff check backend
  • uv run ruff format --check backend
  • uv pip install -e backend/tests/druks-field_notes
  • uv run pytest backend/
  • npm --prefix frontend run lint
  • npm --prefix frontend test
  • npm --prefix frontend run build
  • Settings tracker issues labeled druks; no Services paste. Doctor is ok.
  • Create a project with a prefix, add a repo, create a ticket against that repo. Identifier is {prefix}-1.
  • Board and list show the ticket. The card opens detail. Description edits as markdown; the API still returns markdown.
  • Ticket sidebar shows Created by, Created, and Updated.
  • Drag a board card onto another status. The placeholder follows the pointer; drop commits that column. Same-column drop does nothing.
  • Ready for Agent opens a build on the selected repo. In Progress / In Review write back. A second Ready for Agent on a parked review build does not start another run.
  • With tracker issues, the sandbox can software_factory_get_ticket for BOX-3 and does not treat it as GitHub issue Subject keying rides DBOS workflow attributes; durable_runs shrinks #3.

Made with Cursor

…410)

* Add Software Factory's local board: issues projects, tickets, and comments.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Point the issues tables revision at main's migration head.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
@chaosk
chaosk requested a review from czpython as a code owner September 8, 2026 03:37
@chaosk
chaosk force-pushed the integration/issues branch from 81d1db6 to ce2de3f Compare September 8, 2026 03:44
chaosk and others added 3 commits September 8, 2026 05:55
* Issue board doors: create, move, edit, and comment on a ticket.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Assign tickets to any real account; main no longer has a system actor.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
…Factory (#414)

* Issue board, list, and ticket pages, mounted from Software Factory.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Use Account.list_all for assignee options after the default-account model.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Selecting druks needs no Service identity: status writes go through Ticket.transition and the existing funnel opens the build.

Co-authored-by: Cursor <cursoragent@cursor.com>
@mintlify

mintlify Bot commented Sep 8, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
druks 🟢 Ready View Preview Sep 10, 2026, 8:05 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

…tch and comment (#420)

* Ship the appliance /mcp into issues builds so agents can fetch and comment.

Linear comments go through tracker MCP in the sandbox; when the tracker is the local board, that server is this process, named druks and credentialed with a run PAT.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Use the run account or the default account after the system actor was removed.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Card.link wraps the panel when there are no controls, so Open is no longer a second way onto the ticket.

Co-authored-by: Cursor <cursoragent@cursor.com>
* Make the ticket page save in place.

Title, description, and properties sit like a Linear issue; creating already in Ready for Agent is the same transition as moving there.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Type live form fixtures as forms, not as Block.

Spreading a Block union made submit look like a Link field, which tsc -b refused.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
* Let tickets select a GitHub repo instead of a second project table.

Prefix lives on the GitHub Project; the operator picks the ProjectRepo the pull request will target.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Retarget issues MCP tests after tickets bind to a repo.

The create-ticket-project tool is gone; minting uses the GitHub project's prefix.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
The wire value stays a markdown string; Tiptap renders it in place so the operator writes the same source they read.

Co-authored-by: Cursor <cursoragent@cursor.com>
chaosk and others added 6 commits September 8, 2026 06:20
start() returns the parked run without publishing, so the ticket stayed Ready for Agent while the work was already in review.

Co-authored-by: Cursor <cursoragent@cursor.com>
The contract names the Druks MCP get-ticket tool so the agent reads the board ticket it was given.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ior. (#479)

The tracker is druks on this appliance, not a separate Issues app, and
builds fetch the ticket from /mcp.

Co-authored-by: Cursor <cursoragent@cursor.com>
Identifier and Title are 32px links; Priority and Assignee inherited a 20px line and sat lower.

Co-authored-by: Cursor <cursoragent@cursor.com>
Created and Updated were already facts; Created by was missing, so the
row's creator_id never reached the page.

Co-authored-by: Cursor <cursoragent@cursor.com>
The ticket page already moved work through set_status. The board now
uses that same door, so a drop cannot open a second write path. While
dragging, the shell previews the landing column and commits that
column, not whichever neighbor sits under the pointer after layout
shifts.

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant