Skip to content

Proposal: task management#760

Open
ThisIsMani wants to merge 5 commits intojuspay:masterfrom
ThisIsMani:proposals/0001-task-management
Open

Proposal: task management#760
ThisIsMani wants to merge 5 commits intojuspay:masterfrom
ThisIsMani:proposals/0001-task-management

Conversation

@ThisIsMani
Copy link
Copy Markdown

@ThisIsMani ThisIsMani commented Apr 28, 2026

What

Mockup preview

Proposal preview

Adds proposal 0001 — a thin opt-in layer above terminals so a developer's intent ("fix the auth bug", "learn about CRDTs") can persist independently of any process. Three layers — Project, Task, Terminal — with user-defined kanban boards per project, persisted as plain markdown that mirrors the obsidian-kanban format.

The principle that keeps the feature small: Kolu has agency over IO; Kolu has no agency over semantics. Kolu reads, parses, and writes the user's task data on user action — never autonomously, never inferred from agent state, never derived from terminal exit. The user is the brain; Kolu is the hands.

A sibling HTML mockup makes the design concrete: four proposed Kolu surfaces (per-project board, cross-project list, terminal canvas with task tags, and a creation UI with both a palette modal and a per-lane inline `+ add`) plus one explanation-only view (raw markdown side-by-side with the rendered board, included so reviewers can see the file format — not itself a proposed Kolu surface).

Why

This is a new user-facing feature, so per `CONTRIBUTING.md` it needs a merged proposal before any implementation PR. Opening as a draft because three open questions still want directional feedback before promotion to accepted: default lanes on first project creation, "No Project" UX in the project picker, and visual treatment of completion-timestamp annotations.

  • Implements proposal: N/A — this PR adds the proposal.
  • Closes: no related issue.

Type of change

  • Trivial fix (bug fix, build/CI fix, doc typo, refactor with no behavior change)
  • Implements an accepted proposal in `docs/proposals/`
  • Adds a new proposal to `docs/proposals/` (no implementation in this PR)

Generated by `/do` on Claude Code (model `claude-opus-4-7`).

Adds proposal 0001 — a thin opt-in layer above terminals so a
developer's intent ("fix the auth bug", "learn about CRDTs") can
persist independently of any process. Three layers — Project, Task,
Terminal — with user-defined kanban boards per project, persisted as
plain markdown that mirrors the obsidian-kanban format.

The principle ("Kolu has agency over IO; Kolu has no agency over
semantics") is what keeps the feature small: Kolu reads, parses, and
writes the user's task data on user action — never autonomously,
never inferred from agent state, never derived from terminal exit.

Includes a sibling HTML mockup at
docs/proposals/0001-task-management/ showing four proposed Kolu
surfaces (per-project board, cross-project list, terminal canvas
with task tags, creation UI with palette modal + per-lane inline
add) and one explanation-only view (raw markdown side-by-side with
the rendered board, included to make the file format concrete — not
a proposed Kolu surface).

Status: draft. Several open questions (default lanes on first
project, "No Project" UX in the project picker, completion-timestamp
visual treatment) call for directional feedback before promoting to
accepted.

_Generated by [\`/do\`](https://github.com/srid/agency) on Claude
Code (model \`claude-opus-4-7\`)._
@ThisIsMani

This comment was marked as off-topic.

…lifecycle

Folds in the architectural and UX decisions from a follow-up talk-mode
session structurally reviewed by both Lowy and Hickey lenses.

**Navigation.** Adds an explicit Navigation subsection: two top-level
routes (`/` for the workspace, `/projects/<id>` for a project board).
Project addressing uses the existing UUID `id` directly — no
URL-friendly `slug` field; rejected because slug-collisions force
fallback to UUID, meaning UUID was always the identity. Project
navigation lives entirely in the URL; `preferences.activeProject` is
explicitly rejected to prevent two stores claiming the same fact.
Mobile swipe (per juspay#622) is preserved as a gesture layer that calls
`navigate()` rather than a parallel navigation stack.

**Card interactions.** Cards become self-sufficient — five affordances
on each card (drag, click-title, click-description, click-pill, click-✕)
with no detail view, modal-on-click, or drawer. Long descriptions
collapse by heuristic with session-only state — never persisted to
markdown or preferences.

**Project lifecycle.** Palette → CreateProjectModal / EditProjectModal
(deliberately separate components sharing only a stateless ProjectForm).
Archive is the in-app affordance; project deletion stays a manual
filesystem operation.

**Task lifecycle.** Inline edit primary, palette EditTaskModal as a
keyboard-only secondary path. Delete is anchored to the card's ✕
because Cmd+K has no notion of "this task right here."

**Implementation notes** add the router prerequisite, the
card-as-layout-shell pattern, and the session-only collapse-state
guidance.

**Alternatives considered** records six rejected shapes (slug,
preferences-driven navigation, card detail view, single create+edit
modal, persisted collapse, right-click menu).

**Out of scope** records persisted collapse state, in-app project
deletion, and drag-to-trash zones.

Proposal grows 222 → 288 lines. Status remains *draft* — the open
questions on default lanes, "No Project" UX, and completion-timestamp
visual treatment are unchanged.

_Generated by [\`/do\`](https://github.com/srid/agency) on Claude Code
(model \`claude-opus-4-7\`)._
@ThisIsMani

This comment was marked as off-topic.

Catches the visual prototype up to the prose. Card affordances added
in afb590f (✕ delete in card top-right, ▸ collapse chevron for long
descriptions) are now visible in the per-project board mockup.

- Each card on the kanban view gains a small ✕ in the top-right (low
  opacity by default; full-strength on hover; turns red on focus). On
  click in the live UI this opens DeleteTaskConfirm.
- One new card in the Todo lane ("Investigate dropped frames in
  scrollback") carries a long description and renders in collapsed
  state with a ▸ show more chevron — demonstrates the
  collapse-by-heuristic, session-only state.
- The on-disk markdown panel grows to match (the new task appears as
  a `- [ ]` entry with the same long description).
- Mini-cards in the Creation UI view (section 04) get the ✕ for
  consistency.
- The "What's shown" legend explains both new affordances.

The Prototype section of the proposal markdown gains a one-line note
on view 1 calling out the ✕ and chevron.

_Generated by [\`/do\`](https://github.com/srid/agency) on Claude Code
(model \`claude-opus-4-7\`)._
…hema/migrations

Folds in the design decisions from a third lowy/hickey-reviewed
discussion. The Task schema collapses; routes get a third entry;
Implementation notes pick up a Schema and migrations note.

**Single timestamp.** `Task` shrinks to
`{ id, projectId, name, description?, updatedAt }`. `createdAt` and
`completedAt` are gone as stored fields:

- `createdAt` isn't recoverable from markdown after lane moves —
  we'd be lying about precision the source can't back up.
- `completedAt` is a derivation: *if the task's current lane has
  the `complete` role, `updatedAt` is the completion time;
  otherwise the task isn't done.* Storing it independently invited
  drift. First-completion-immutable semantics are deliberately
  dropped — moving a task back through Done re-stamps `updatedAt`
  rather than preserving the original completion date.

`updatedAt` is named "last meaningful interaction": bumped on lane
move, title edit, or description edit. *Not* bumped on
drag-to-reorder within the same lane (reordering is presentation,
not content).

**`/tasks` route.** Added as the third top-level route alongside
`/` and `/projects/<id>`. The cross-project view's URL is no
longer implicit.

**Storage.** The on-disk markdown sample now shows `@{YYYY-MM-DD}`
on every task line (not just the Done ones). The annotation IS
`updatedAt`. Conventions explain auto-heal on hand-edit deletion.

**Schema and migrations.** New Implementation-notes bullet:
parsed boards validated through Zod schemas (`TaskSchema`,
`LaneSchema`, `BoardSchema`) following the discipline of
`PersistedStateSchema` at packages/server/src/state.ts:34-39.
`kolu-board: v1` is the version handle; bumping to v2 means a
`migrateBoardFromV1ToV2` runner. Schema home (client vs.
kolu-common) is left to the implementer following the
`PersistedStateSchema` rule of own-where-owned.

**Out of scope** picks up first-completion-immutable timestamps
(deliberate drop, with the trade explained), cycle-time analytics,
and per-task version fields.

**Alternatives considered** records two more rejected shapes —
stored `createdAt`/`completedAt` fields, and the
`<!-- ^id c=… u=… d=… -->` triplet that an earlier round
considered before the single-`updatedAt` model landed.

**Mockup catches up.** Each frame's chrome gains a faux URL bar
showing the route it lives at (`/projects/<id>`, `/tasks`, `/`).
Each kanban card carries an `@{YYYY-MM-DD}` chip. The on-disk
markdown panel shows the annotation on every task.

_Generated by [\`/do\`](https://github.com/srid/agency) on Claude
Code (model \`claude-opus-4-7\`)._
@ThisIsMani

This comment was marked as off-topic.

@ThisIsMani ThisIsMani marked this pull request as ready for review April 28, 2026 11:30
@srid srid changed the title docs(proposal): 0001 task management Proposal: task management Apr 28, 2026
@srid
Copy link
Copy Markdown
Member

srid commented Apr 30, 2026

[Discussion on #kolu channel on Slack]

Sibling refinement under docs/proposals/0001-task-management/ proposing a
smaller surface for the same user need: pill-tree-on-hover becomes a
two-lane kanban (Backlog + Active) backed by one Task concept persisted
in the JSON state file. Cuts the Project layer, the markdown substrate,
and user-defined lanes; keeps "queued + live work in one surface" and
the IO-not-semantics principle.
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.

2 participants